PHPackages                             bobby/multi-processes - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. bobby/multi-processes

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

bobby/multi-processes
=====================

php原生pcntl实现的简易多进程和进程池组件,支持父子进程双向通信传输数据.包含进程池按需动态fork进程功能.

3211PHP

Since Aug 12Pushed 4y agoCompare

[ Source](https://github.com/995933447/multi-processes-component)[ Packagist](https://packagist.org/packages/bobby/multi-processes)[ RSS](/packages/bobby-multi-processes/feed)WikiDiscussions master Synced 1w ago

READMEChangelogDependenciesVersions (2)Used By (0)

### 子进程管理类

[](#子进程管理类)

\\Bobby\\MultiProcesses\\Process

快速入门:

```
require __DIR__ . '/../vendor/autoload.php';

use Bobby\MultiProcesses\Process;

$process = new Process(function (Process $process) {
    echo "Hello, Im children, My pid is " . ($pid = $process->getPid()) . PHP_EOL . PHP_EOL;

    // 阻塞等待数据
    $masterData = $process->read();
    echo "My master send data:$masterData to me." . PHP_EOL . PHP_EOL;

    // 阻塞等待数据
    $masterData = $process->read();
    echo "My master send data2:$masterData to me." . PHP_EOL . PHP_EOL;

    // 阻塞等待数据
    $masterData = $process->read();
    echo "My master send data3:$masterData to me." . PHP_EOL . PHP_EOL;

    // 关闭进程间通信和释放进程间通信资源
    $process->clearIpc();

    echo "exit $pid" . PHP_EOL;
}, true);

// 设置子进程名称
$process->setName("child php process.");

// 设置主进程名称
cli_set_process_title("parent php process.");

declare(ticks = 1); // PHP7支持异步监听信号，可不声明TICK
// 信号注册的时机要合适 因为如果产生子信号 而这个时候父进程还没有注册处理器 PHP就会使用系统默认的信号处理器。
Process::onCollect();

$processes = [];
for ($i = 0; $i < 6; $i++) {
    $processCloned = clone $process;
    $pid = $processCloned->run();
    echo "I am father, my pid is " . posix_getpid() . ", my children is $pid" . PHP_EOL . PHP_EOL;
    $processes[] = $processCloned;
}

foreach ($processes as $process) {
    $process->write("Hello my child!");
    $process->write('Hello my child 2!');
    $process->write('Hello my child 3!');
}

// Process::collect();
```

public \\Bobby\\MultiProcesses\\Process::\_\_construct(callable $callback, bool $isDaemon = false, int $ipcType = \\Bobby\\MultiProcesses\\Ipcs\\IpcFactory::UNIX\_SOCKET\_IPC)
定义子进程
$callback 子进程启动时执行该方法
$isDaemon 子进程是否设置为守护进程,true代表设置为守护模式,false为否
$ipcType 进程间通信方式,IpcFactory::UNIX\_SOCKET\_IPC为unix socket方式,默认方式.IpcFactory::PIPES\_IPC为有名管道方式

public \\Bobby\\MultiProcesses\\Process::run()
执行子fork操作,创建并启动子进程

public \\Bobby\\MultiProcesses\\Process::gePid(): int
获取子进程PID,必须在run后执行

public \\Bobby\\MultiProcesses\\Process::setName(string $name)
设置进程名称
$name 进程名称

public \\Bobby\\MultiProcesses\\Process::getName(): string
获取子上次setName方法设置,不一定是真实进程名称.如setName操作后执行了cli\_set\_title或者通过其他接口更改了进程名称，则getName获取的是上次setName的名称。

public \\Bobby\\MultiProcesses\\Process::getRealName(): string
获取真实的进程名称

public \\Bobby\\MultiProcesses\\Process::write($message)
如果父进程调用该方法则往子进程写入消息,如果子进程调用该方法则往父进程写入消息
$message 消息,可以为任意数据类型,该方法会自动序列化消息

public \\Bobby\\MultiProcesses\\Process::writeString(string $message)
如果父进程调用该方法则往子进程写入消息,如果子进程调用该方法则往父进程写入消息
$message 字符串类型消息,该方法效率比write效率高,因为不会对消息进行序列化处理

public \\Bobby\\MultiProcesses\\Process::read()
如果父进程调用该方法则往子进程读取消息,如果子进程调用该方法则往父进程读取消息,只能读取write方法写入的消息\\

public \\Bobby\\MultiProcesses\\Process::writeString(string $message)
如果父进程调用该方法则往子进程读取消息,如果子进程调用该方法则往父进程读取消息,只能读取writeString写入的消息\\

public \\Bobby\\MultiProcesses\\Process::closeIpc()
关闭当前进程通信通道,关闭后当前进程无法进行读写.

public \\Bobby\\MultiProcesses\\Process::clearIpc()
释放父子进程双方通信通道资源.

public static \\Bobby\\MultiProcesses\\Process::onCollect($callback = null)
安装子进程退出时异步回调的信号处理器,当子进程退出时将触发该信号处理器
$callback 为NULL时组件将自动回收子进程资源避免成为僵尸进程.如为自定义回调函数时,子进程退出时将触发自定义回调函数,你需要编写逻辑手动回收进程资源.你也可以使用php的pcntl\_signal.该方法就是基于pcntl\_signal封装实现的. 注意:使用该方法后一定要在父进程declare(ticks = 1)或者在脚本尾部使用\\Bobby\\MultiProcesses\\Process::collect进行监信号,否则子进程不会触发。

public static \\Bobby\\MultiProcesses\\Process::collect() 阻塞监听子进程信号,该方法会一直导致脚本阻塞,需要手动中断脚本退出

### 进程池

[](#进程池)

进程池的实现需要两个类来配合实现。Pool进程池管理类，Worker子进程管理类

快速入门:

```
