资讯专栏INFORMATION COLUMN

基于PCNTl扩展的PHP多进程管理库

王岩威 / 1802人阅读

摘要:子进程得到的为所以这里是子进程执行的逻辑。最后再次附上项目地址欢迎

大多数人都说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 SlinceProcessProcess(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 SlinceProcessSystemVSharedMemory();
$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 SlinceProcessSystemVSharedMemory(__FILE__, "5M"); //Adjusts to 5m
Semaphore
$semaphore = new SlinceProcessSystemVSemaphore();
$semaphore->acquire(); //Acquires a lock
// do something
$semaphore->release() //Releases a lock
Message queue
$queue  = new SlinceProcessSystemVMessageQueue();
$queue->send("hello");
echo $queue->receive(); //Will output hello
Fifo
$writeFifo = new SlinceProcessPipeWritableFifo("/tmp/test.pipe");
$writeFifo->write("some message");
$readFifo = new SlinceProcessPipeReadableFifo("/tmp/test.pipe");
echo $readFifo->read();

Fifo works with half duplex mode. You can use DuplexFifo that will create two fifos.

$fifo = new SlinceProcessPipeDuplexFifo("/tmp/test.pipe");
$fifo->write("some message");
$fifo->read();

由于pcntl扩展在window上是不可用的,所以本库并不能在window上使用;如果有需求的化建议使用symfony/process但需要注意的是该库只能实现进程间调用,也就是说你必须先创建一个脚本命令再调用该命令,与pcntl扩展实现的并不是同一个东西。

最后再次附上项目地址https://github.com/slince/process 欢迎star

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25690.html

相关文章

  • Swoole-2.1.2 进程池模块使用

    摘要:在版本中我们将的进程管理模块封装成了类,现在可以在代码中使用的进程管理器了。提供的进程管理器来自于,经过大量生产项目验证,稳定性和健壮性都非常高。三任务投递进程管理器自带了消息队列和消息投递的支持。 在Swoole-2.1.2版本中我们将Server的进程管理模块封装成了PHP类,现在可以在PHP代码中使用Swoole的进程管理器了。 在实际项目中经常需要写一些长期运行的脚本,如基于r...

    ZoomQuiet 评论0 收藏0
  • PHPPcntl进程扩展基础使用

    摘要:提供了一个扩展,基于的进程,系统暂时没有这个扩展,用于实现基础的多进程实现,可以利用这个处理一个很耗时的任务,例如发订阅邮件,短信,站内信等。如果父进程不关心子进程什么时候结束子进程结束后,内核会回收。 PHP提供了一个Pcntl扩展,Pcntl基于Linux的进程,Windows系统暂时没有这个扩展,用于实现基础的多进程实现,可以利用这个处理一个很耗时的任务,例如发订阅邮件,短信,站...

    AprilJ 评论0 收藏0
  • PHP并发IO编程之路

    摘要:下文如无特殊声明将使用进程同时表示进程线程。收到数据后服务器程序进行处理然后使用向客户端发送响应。现在各种高并发异步的服务器程序都是基于实现的,比如。 并发 IO 问题一直是服务器端编程中的技术难题,从最早的同步阻塞直接 Fork 进程,到 Worker 进程池/线程池,到现在的异步IO、协程。PHP 程序员因为有强大的 LAMP 框架,对这类底层方面的知识知之甚少,本文目的就是详细介...

    Riddler 评论0 收藏0
  • multi-process-pcntl 基于PCNTLPHP并发处理 封装类

    摘要:职场多年下来,技术也算是逐渐地有些积累,但是更重要的是对自身有了更加合理的人生定位。或许,人生的意义,就在于此处的感悟吧。基于的并发处理封装类。对语言底层扩展的的深度解读和生产应用。函数官网手册中对的说明,更细化的需求可以研究深化。 个人声明 作者:于立(wx/yulichenr) 敬告:联系我,请注明来源和来意 本人开发有很多年了,但是很少整理分享,如今趁着清闲就为大家服务了,希...

    awokezhou 评论0 收藏0
  • PHP进程系列笔记(五)

    摘要:消息队列更常见的用途是主进程分配任务,子进程消费执行。子进程前面加了个,这是为了防止父进程还未往消息队列中加入内容直接退出。 前面几节都是讲解pcntl扩展实现的多进程程序。本节给大家介绍swoole扩展的swoole_process模块。 swoole多进程 swoole_process 是swoole提供的进程管理模块,用来替代PHP的pcntl扩展。 首先,确保安装的swoole...

    qianfeng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<