基於pcntl的PHP進程池

attachments-2020-03-gNA1LGha5e7c2400cc86f.jpg

想必你們都知道能夠經過多進程或者多線程的方式實現異步。php

PHP多進程編程當前主要有這幾種方式:編程

  1. 基於pcntl實現多進程,這也是PHP自帶的多進程玩法
  2. Swoole本身修改PHP內核代碼,從而實現多進程,這個看起來比較新
  3. Swoole本身修改PHP內核代碼,從而實現多進程 inple_fork這個庫,實現了多進程和進程池。

一,安裝

用composer安裝。多線程

composer require jenner/simple_fork

二,使用

simple_fork這個庫自帶了不少內容,在此主要跟你們分享進程和進程池的使用,其餘內容能夠自行查看demo。composer

沒有用過composer的朋友,須要根據本身的代碼路徑,導入autoload.php,在此略過。異步

須要在命令行下運行。ui

1.進程

使用步驟大體以下:spa

  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

相關文章
相關標籤/搜索