大多数人都说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 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
$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 = new Slince\Process\SystemV\Semaphore(); $semaphore->acquire(); //Acquires a lock // do something $semaphore->release() //Releases a lock
$queue = new Slince\Process\SystemV\MessageQueue(); $queue->send('hello'); echo $queue->receive(); //Will output hello
$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