page contents

基于pcntl的PHP进程池

以下内容希望帮助到大家!

attachments-2020-03-gNA1LGha5e7c2400cc86f.jpg

想必大家都知道可以通过多进程或者多线程的方式实现异步。

PHP多进程编程当前主要有这几种方式:

  1. 基于pcntl实现多进程,这也是PHP自带的多进程玩法
  2. Swoole自己修改PHP内核代码,从而实现多进程,这个看起来比较新
  3. Swoole自己修改PHP内核代码,从而实现多进程 inple_fork这个库,实现了多进程和进程池。


一,安装

用composer安装。

composer require jenner/simple_fork


二,使用

simple_fork这个库自带了很多内容,在此主要跟大家分享进程和进程池的使用,其他内容可以自行查看demo。

没有用过composer的朋友,需要根据自己的代码路径,导入autoload.php,在此略过。

需要在命令行下运行。


1.进程

使用步骤大致如下:

  1. 任务是一个实现了Runnable接口的类,或者直接用callback也可以。
  2. 初始化子进程Process,并把任务实例作为参数传递过去
  3. 最后start开启子进程,wait用于等待子进程运行结束(否则会出现僵尸进程)。

用起来也很简单

use Jenner\SimpleFork\Runnable;

use Jenner\SimpleFork\Process;

class Task implements Runnable
{

    /**
     * @return void
     */
    public function run()
    {
        echo "I am a sub process" . PHP_EOL;
    }
}

$process = new Process(new Task());
$process->start();
$process->wait();


2.进程池

更多的时候,我们会用进程池去异步执行一些列任务。

进程池在初始化的时候,需要声名进程池的最大容量,超过该容量后新添加的进程都会放在队列,直到有新的空余空间释放出来,才会执行新增的任务。

同样需要用wait等待进程池内的所有子进程执行完毕,避免出现僵尸进程。

use Jenner\SimpleFork\Runnable;

use Jenner\SimpleFork\Process;
use Jenner\SimpleFork\FixedPool;


class Task implements Runnable
{

    /**
     * @return mixed
     */
    public function run()
    {
        sleep(10);
        echo getmypid() . ':done' . PHP_EOL;
    }
}

$pool = new  FixedPool(2);
$pool->execute(new  Process(new Task()));
$pool->execute(new  Process(new Task()));
$pool->execute(new  Process(new Task()));

$pool->wait();



attachments-2020-03-roipdgzN5e7c23bb8e51a.jpg

  • 发表于 2020-03-26 11:40
  • 阅读 ( 421 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章