DEV Community

Cover image for PHP HyperF -> Overlapping and Concurrency
Thiago Silva
Thiago Silva

Posted on

PHP HyperF -> Overlapping and Concurrency

  • PHP: 8.3.7
  • PHP HyperF: 3.1.23

HyperF - Project

It is extremely important that HyperF processes do not overwrite shared variable data. This can occur with overload.

Create - Project

composer create-project hyperf/hyperf-skeleton "project" 
Enter fullscreen mode Exit fullscreen mode

Install - Watcher

composer require hyperf/watcher --dev 
Enter fullscreen mode Exit fullscreen mode

Install - UUID

composer require ramsey/uuid 
Enter fullscreen mode Exit fullscreen mode

Server - Start

cd project ; php bin/hyperf.php server:watch ; 
Enter fullscreen mode Exit fullscreen mode

HyperF - APP

APP - Router

Router::addRoute(['GET', 'POST'], '/overlapping/data', 'App\Controller\ControllerOverlapping@data'); Router::addRoute(['GET', 'POST'], '/overlapping/value-a', 'App\Controller\ControllerOverlapping@value_a'); Router::addRoute(['GET', 'POST'], '/overlapping/value-b', 'App\Controller\ControllerOverlapping@value_b'); Router::addRoute(['GET', 'POST'], '/overlapping/value-c', 'App\Controller\ControllerOverlapping@value_c'); Router::addRoute(['GET', 'POST'], '/concurrency/data', 'App\Controller\ControllerConcurrency@data'); Router::addRoute(['GET', 'POST'], '/concurrency/value-a', 'App\Controller\ControllerConcurrency@value_a'); Router::addRoute(['GET', 'POST'], '/concurrency/value-b', 'App\Controller\ControllerConcurrency@value_b'); Router::addRoute(['GET', 'POST'], '/concurrency/value-c', 'App\Controller\ControllerConcurrency@value_c'); 
Enter fullscreen mode Exit fullscreen mode

path: /project/config/routes.php

APP - Controller - Overlapping

namespace App\Controller; class ControllerOverlapping { public $data; public function __construct() { $this->data=''; } public function data() { return $this->data; } public function value_a() { $this->data='Value A'; return $this->data; } public function value_b() { $this->data='Value B'; return $this->data; } public function value_C() { $this->data='Value C'; return $this->data; } } 
Enter fullscreen mode Exit fullscreen mode

path: /project/app/Controller/ControllerOverlapping.php

APP - Controller - Control

namespace App\Controller; use Ramsey\Uuid\Uuid; class ControllerConcurrency { public $data; public function __construct() { $this->data=array(); } public function start() { $key=Uuid::uuid4()->toString(); return $key; } public function end($key) { $data=$this->data[$key]; unset($this->data[$key]); return $data; } public function data() { return $this->data; } public function value_a() { $key=$this->start(); $this->data[$key]='Value A'; $data=$this->end($key); return $data; } public function value_b() { $key=Uuid::uuid4()->toString(); $this->data[$key]='Value B'; $data=$this->end($key); return $data; } public function value_C() { $key=Uuid::uuid4()->toString(); $this->data[$key]='Value C'; $data=$this->end($key); return $data; } } 
Enter fullscreen mode Exit fullscreen mode

path: /project/app/Controller/ControllerConcurrency.php

Execute

GET - Concurrency

curl "http://127.0.0.1:9501/overlapping/data" Result: '' curl "http://127.0.0.1:9501/overlapping/value-a" Result: 'Value A' curl "http://127.0.0.1:9501/overlapping/data" Result: 'Value A' curl "http://127.0.0.1:9501/overlapping/value-b" Result: 'Value B' curl "http://127.0.0.1:9501/overlapping/data" Result: 'Value B' 
Enter fullscreen mode Exit fullscreen mode

GET - Control

curl "http://127.0.0.1:9501/concurrency/data" Result: '' curl "http://127.0.0.1:9501/concurrency/value-a" Result: 'Value A' curl "http://127.0.0.1:9501/concurrency/data" Result: '' curl "http://127.0.0.1:9501/concurrency/value-b" Result: 'Value B' curl "http://127.0.0.1:9501/concurrency/data" Result: '' curl "http://127.0.0.1:9501/concurrency/value-a" && \ curl "http://127.0.0.1:9501/concurrency/value-a" && \ curl "http://127.0.0.1:9501/concurrency/value-c" ; Result: 'Value A', 'Value B', 'Value C' curl "http://127.0.0.1:9501/concurrency/data" Result: '' 
Enter fullscreen mode Exit fullscreen mode

https://github.com/thiagoeti/php-hyperf-overlapping-concurrency

Top comments (0)