php pcntl 进程池_基于PCNTl扩展的PHP多进程管理库

这篇博客介绍了如何在PHP中实现多进程,并利用pcntl扩展进行进程管理。通过示例代码展示了如何创建子进程、等待子进程结束以及处理信号。同时,文章还探讨了使用SystemV扩展进行共享内存、信号量和消息队列等进程间通信的方法,以解决PHP在Windows上无法使用pcntl的问题,推荐在Linux环境下使用Symfony的Process组件作为替代方案。
摘要由CSDN通过智能技术生成

大多数人都说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扩展实现的并不是同一个东西。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值