基於PCNTl擴展的PHP多進程管理庫

大多數人都說php是單進程執行的,其實這是不許確的,在cli模式下php是能夠作到多進程的;不過須要pcntl的擴展;php

$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/processgit

經過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(); //等待子進程執行完畢,此過程會發生阻塞;不要忘了此步驟

註冊新號處理器,以及觸發新號github

$process = ...
$process->getSignalHandler()->register([SIGUSR1, SIGUSR2], function(){
    echo 'trigger signal';
});
$process->start();
$process->signal(SIGUSER1); //給子進程發信號
$process->wait();

其它IPC包裝api

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.bash

$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擴展實現的並非同一個東西。composer

最後再次附上項目地址https://github.com/slince/process 歡迎starui

相關文章
相關標籤/搜索