× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

Process::__construct

创建子进程

swoole_process::__construct(callable $function, bool $redirect_stdin_stdout = false,
    int $pipe_type = SOCK_DGRAM, bool $enable_coroutine = false);
  • $function,子进程创建成功后要执行的函数,底层会自动将函数保存到对象的callback属性上。如果希望更改执行的函数,可赋值新的函数到对象的callback属性
  • $redirect_stdin_stdout,重定向子进程的标准输入和输出。启用此选项后,在子进程内输出内容将不是打印屏幕,而是写入到主进程管道。读取键盘输入将变为从管道中读取数据。默认为阻塞读取。
  • $pipe_type,管道类型,启用$redirect_stdin_stdout后,此选项将忽略用户参数,强制为1。如果子进程内没有进程间通信,可以设置为 0
  • $enable_coroutine,默认为false,在callback function中启用协程,开启后可以直接在子进程的函数中使用协程API

$enable_coroutine4.3.0或更高版本可用

管道类型

  • 0:不创建管道
  • 1:创建SOCK_STREAM类型管道
  • 2:创建SOCK_DGRAM类型管道
  • 启用$redirect_stdin_stdout 后,此选项将忽略用户参数,强制为1

Process 对象在销毁时会自动关闭管道,子进程内如果监听了管道会收到CLOSE事件
使用Process作为监控父进程,创建管理子进程时,父类必须注册信号SIGCHLD对退出的进程执行wait,否则子进程退出时会变成僵尸进程

在子进程中创建 Server

例 1:

可以在 swoole_process 创建的子进程中使用 swoole_server,但为了安全必须在$process->start 创建进程后,调用 $worker->exec() 执行。代码如下:

<?php
$process = new swoole_process('callback_function', true);

$pid = $process->start();

function callback_function(swoole_process $worker)
{
    $worker->exec('/usr/local/bin/php', array(__DIR__.'/swoole_server.php'));
}

swoole_process::wait();

例 2:使用匿名函数作为进程逻辑,并实现了一个简单的父子进程通讯

<?php
$process = new swoole_process(function (swoole_process $process) {
    $process->write('Hello');
}, true);

$process->start();
usleep(100);

echo $process->read(); // 输出 Hello

IO 线程池问题

由于Swoole的异步文件IO使用了线程池,在使用了这些API之后再创建Process可能会出现非常复杂的带线程fork问题。因此请勿在使用异步文件IO函数后创建Process

2.1.4/1.10.4或更高版本已经禁止了这种行为,底层检测到已创建线程池再执行new Process会抛出致命错误


  • 一夏听风

    callback_function 如果是其他类里的其他方法,是不是可以使用:array('类名','方法名')的方式调用?这个方法是否可以接收参数呢?

  • 大隐-于市

    可以写个匿名函数,里面在调用对象方法

  • signDBG

    在web端运行,输出的结果跟命令行的输出是不一样。 有时WEB只能输出最后一个结果,其他直接被过滤。 console到时没有问题。 想知道是不是他比较适合做服务器开发。

  • wizarot

    具体怎么写呢? $process = new \swoole_process(function($worker){ GateWay::serverFunc(swoole_process $worker); } ,FALSE ); $worker 不知道怎么写才对. 无法正确传入参数.

  • jimmyren

    $process = new \swoole_process(function(swoole_process $worker){ GateWay::serverFunc($worker); } ,FALSE );

  • 张大为

    callback_function 能传一个对象么?

  • 左树文

    http://wiki.swoole.com/wiki/page/458.html

  • 左树文

    http://wiki.swoole.com/wiki/page/458.html

  • bain

    Fatal error: swoole_process::start(): callback function error in …… 回调函数只能是callback 不能该名字,一改名字就报错

  • Take

    您好, 多进程只支持在 cli 命令模式下操作吗? 不支持 在 url 访问操作的吗?[给力]

  • 柴郡猫cat

    那肯定的

  • 杜飞

    是的

  • ball

    文档有问题,我的版本是1.9.0. 对 new swoole_process进行了下strace,得到的是socketpair(PF_FILE, SOCK_DGRAM, 0, [3, 4]) = 0。 这说明默认使用的管道是SOCK_DGRAM类型吧?

  • 心灵的架构师

    感觉很多人问的问题莫名其妙的。。。看来很多phper的确不太懂java和Nodejs那一套哦

  • 心灵的架构师

    swoole_server就相当于node里的net,swoole_process就相当于node里的child_process,swoole_http_server就相当于node里的http和https,希望swoole发扬光大,可以跟node、go、Java肩并肩,以后我就可以不用在使用go和Node了。。。

  • 马来酸

    edited hh~

  • 7766

    new swoole_process()是fork了当前进程对么?

  • DavidYANXW

    $redirect_stdin_stdout应该是重定向到子进程自己的管道了吧?而不是主进程的管道。

  • 飞鸿影

    swoole_process::__construct(): swoole_process only can be used in PHP CLI mode.

  • 小桂子

    创建子进程数有限制吗?1000?10000?

  • つ 青春在流逝

    报这个错是什么意思呢? Swoole\Process::__construct(): handle 10001468 exceed 10000000 in XXXXXX

  • jack

    swoole_process能在swoole_websocket_server中使用,我使用之后出了问题出现返回500错误

  • jack

    swoole_process能在swoole_websocket_server中使用不,我使用之后出了问题出现返回500错误,而且swoole_websocket_server如果不使用信号,也会出现僵尸进程

  • 15327403881

    我在创建的子进程中,调用Grpc接口,为什么不通, 也不执行,在主进程直接调用没有问题 $worker_num =1;//创建的进程数 for($i=0;$isetCommonMsgNotify([]); var_dump('Grpc End'); }, false, 0); $pid = $process->start(); echo PHP_EOL . $pid;// }

  • 18767394206

    回调函数有时候失效怎么回事,有时候可以执行回调,有时候不可以

  • 多进程创建server,这个server代码中端口是一样的,不会提示端口绑定失败吗?

  • 13911762825

    $process = new swoole_process(function (swoole_process $process) { $process->write('Hello'); }, true);

    $process->start(); usleep(100);

    echo $process->read(); // 输出 Hello 我执行了这个之后得到的结果是

    [root@localhost swoole]# php process_more_demo.php PHP Warning: Invalid callback , no array or string given in /var/www/swoole/process_more_demo.php on line 7

    Warning: Invalid callback , no array or string given in /var/www/swoole/process_more_demo.php on line 7 PHP Warning: Swoole\Process::start(): callback function error in /var/www/swoole/process_more_demo.php on line 7

    Warning: Swoole\Process::start(): callback function error in /var/www/swoole/process_more_demo.php on line 7 [root@localhost swoole]# php process_more_demo.php PHP Warning: Invalid callback , no array or string given in /var/www/swoole/process_more_demo.php on line 7

    Warning: Invalid callback , no array or string given in /var/www/swoole/process_more_demo.php on line 7 PHP Warning: Swoole\Process::start(): callback function error in /var/www/swoole/process_more_demo.php on line 7

    Warning: Swoole\Process::start(): callback function error in /var/www/swoole/process_more_demo.php on line 7 [root@localhost swoole]#

  • 13911762825

    请问下怎么解决啊,在线等,很急

  • 17605600233

    function test(){

    $t = file_get_contents('1.txt');

    for($i=$t;$istart(); 发现个bug 程序会一致打印3 $i 不会 加 1

  • 17605600233

    function test(){ $t = file_get_contents('1.txt'); for($i=$t;$istart();