大部分人都说php是单进程执行的,其实这并不准确。在cli模式下,php可以做多进程;但它需要pcntl的扩展;$pid=pcntl_fork();//父进程和子进程都会执行下面的代码if($pid==-1){//错误处理:创建子进程失败返回-1。die('无法分叉');}elseif($pid){//父进程会得到子进程号,所以这里是父进程执行的逻辑pcntl_wait($status);//等待子进程被中断,防止子进程成为僵尸进程。}else{//子进程获取的$pid为0,所以这里是子进程执行的逻辑。}以上代码摘自php官方手册。熟悉C语言的同学可能会惊讶,它和C的API几乎一样;附上链接https://github.com/slince/process通过composer安装composerrequireslince/processbasicusage//createsubprocess$process=newSlince\Process\Process(function(){echo'你好,我的pid是'.getmypid();});$进程->开始();//程序执行在这里拆分,下面的代码在父进程中执行,上面的关闭代码在子进程中执行var_dump($process->isRunning());//子进程是否还在执行var_dump($process->getPid());//获取子进程id//其他业务逻辑$process->wait();//等待子进程完成,这个进程会被阻塞;不要忘记注册新的数字处理程序并触发新的数字$process=...$process->getSignalHandler()->register([SIGUSR1,SIGUSR2],function(){echo'triggersignal';});$process->start();$process->signal(SIGUSER1);//向子进程发送信号$process->wait();其他IPC封装共享内存$memory=newSlince\Process\SystemV\SharedMemory();$memory->set('foo','bar');var_dump($memory->get('foo'));默认共享内存的大小是php.ini中的sysvshm.init_mem,否则为10000字节。你可以调整这个。$内存=新的Slince\Process\SystemV\SharedMemory(__FILE__,'5M');//调整为5mSemaphore$semaphore=newSlince\Process\SystemV\Semaphore();$semaphore->acquire();//获取一个锁//做一些事情$semaphore->release()//释放一个锁消息队列$queue=newSlince\Process\SystemV\MessageQueue();$queue->send('hello');echo$queue->接收();//会输出helloFifo$writeFifo=newSlince\Process\Pipe\WritableFifo('/tmp/test.pipe');$writeFifo->write('somemessage');$readFifo=newSlince\Process\Pipe\ReadableFifo('/tmp/test.pipe');echo$readFifo->read();Fifo使用半双工模式。您可以使用DuplexFifo来创建两个fifos。$fifo=newSlince\Process\Pipe\DuplexFifo('/tmp/test.pipe');$fifo->write('somemessage');$fifo->read();由于在window上没有pcntl扩展,所以这个库不能在window上使用;如果有需求建议使用symfony/process,但是需要注意的是这个库只能实现进程间调用,也就是说必须先创建一个脚本命令,然后调用命令,也就是与pcntl扩展名不同。最后再附上工程地址https://github.com/slince/process欢迎star
