PCNTl拡張に基づくPHPマルチプロセス管理ライブラリ


多くの人はphpが単一プロセスで実行されていると言っていますが、実はこれは正確ではありません.cliモードではphpはマルチプロセスを行うことができます.しかし、pcntlの拡張が必要です.
$pid = pcntl_fork();
//               
if ($pid == -1) {
    //    :          -1.
     die('could not fork');
} else if ($pid) {
     //          ,             
     pcntl_wait($status); //       ,           。
} else {
     //      $pid 0,              。
}

上のコードはphpの公式マニュアルから抜粋して、C言語に詳しい学生は驚くかもしれませんが、まるでcのapiと同じです.確かにそうです.同じようにまっすぐで、同じように包装されていません.今、このような問題は解決されました.まずリンクhttps://github.com/slince/processを添付します
composerによるインストール
composer require slince/process

基本的な使い方
//     
$process = new Slince\Process\Process(function(){
    echo 'hello, my pid is ' . getmypid();
});
$process->start(); //           ,           ,             

var_dump($process->isRunning()); //          
var_dump($process->getPid()); //      id

//      

$process->wait(); //         ,        ;       

新しいプロセッサを登録し、新しいプロセッサをトリガーします.
$process = ...
$process->getSignalHandler()->register([SIGUSR1, SIGUSR2], function(){
    echo 'trigger signal';
});
$process->start();
$process->signal(SIGUSER1); //       
$process->wait();

その他IPC包装
Shared memory
$memory = new Slince\Process\SystemV\SharedMemory();
$memory->set('foo', 'bar');
var_dump($memory->get('foo'));

The default size of shared memory is the sysvshm.init_mem in the php.ini, otherwise 10000 bytes. You can adjust this.
$memory = new Slince\Process\SystemV\SharedMemory(__FILE__, '5M'); //Adjusts to 5m

Semaphore
$semaphore = new Slince\Process\SystemV\Semaphore();
$semaphore->acquire(); //Acquires a lock
// do something
$semaphore->release() //Releases a lock

Message queue
$queue  = new Slince\Process\SystemV\MessageQueue();
$queue->send('hello');
echo $queue->receive(); //Will output hello

Fifo
$writeFifo = new Slince\Process\Pipe\WritableFifo('/tmp/test.pipe');
$writeFifo->write('some message');
$readFifo = new Slince\Process\Pipe\ReadableFifo('/tmp/test.pipe');
echo $readFifo->read();

Fifo works with half duplex mode. You can use DuplexFifo that will create two fifos.
$fifo = new Slince\Process\Pipe\DuplexFifo('/tmp/test.pipe');
$fifo->write('some message');
$fifo->read();

pcntl拡張はwindowでは使用できないため、本ライブラリはwindowでは使用できません.必要な場合はsymfony/processを使用することをお勧めしますが、ライブラリはプロセス間呼び出しのみを実装する必要があります.つまり、pcntl拡張実装とは同じものではなく、スクリプトコマンドを作成してから呼び出さなければなりません.
最後に再びプロジェクトアドレスhttps://github.com/slince/processを添付してstarを歓迎します