作者:黄晓敏3023 | 2021-09-08 16:36
PHP的异步并行扩展swoole,最近增加了多进程管理模块swoole_process,用来替代PHP的pcntl扩展。PHP自带的pcntl,存在很多不足,如:pcntl无法用在fpmapache中pcntl没有提供进程间通信的功能pcntl不支持重定向标准输入和输出pcntl只提供了fork这样原始
PHP的异步并行扩展swoole,最近增加了多进程管理模块swoole_process,用来替代PHP的pcntl扩展。 PHP自带的pcntl,存在很多不足,如: pcntl无法用在fpm/apache中 pcntl没有提供进程间通信的功能 pcntl不支持重定向标准输入和输出 pcntl只提供了fork这样原始
PHP的异步并行扩展swoole,最近增加了多进程管理模块swoole_process,用来替代PHP的pcntl扩展。
PHP自带的pcntl,存在很多不足,如:
- pcntl无法用在fpm/apache中
- pcntl没有提供进程间通信的功能
- pcntl不支持重定向标准输入和输出
- pcntl只提供了fork这样原始的接口,容易使用错误
swoole_process提供了比pcntl更强大的功能,更易用的面向对象风格API,使PHP在多进程编程方面更加轻松。
swoole_process提供的功能特性:
- swoole_process提供了基于unixsock的进程间通信,使用很简单只需调用recv/send即可
- swoole_process支持重定向标准输入和输出,在子进程内echo不会打印屏幕,而是写入管道,读键盘输入可以重定向为管道读取数据
- swoole_process允许用于fpm/apache的Web请求中
- 配合swoole_event模块,创建的PHP子进程可以异步的事件驱动模式
- swoole_process提供了exec接口,创建的进程可以执行其他程序,与原PHP父进程之间可以方便的通信
- swoole_process可以安全地用于fpm/apache环境下
代码示例:
Php代码
- $worker_num?=?8;
- for($i?=?0;?$i?$worker_num;?$i++)
- {
- ????$process?=?new?swoole_process(‘callback_function’,?true);
- ????$pid?=?$process->start();
- ????$workers[$pid]?=?$process;
- }
- foreach($workers?as?$pid?=>?$process)
- {
- ????$process->write(“hello?worker[$pid]\n”);
- ????echo?”From?Worker:?”.$process->read();
- }
- for($i?=?0;?$i?$worker_num;?$i++)
- {
- ????$ret?=?swoole_process::wait();
- ????$pid?=?$ret['pid'];
- ????unset($workers[$pid]);
- ????echo?”Worker?Exit,?PID=”.$pid.PHP_EOL;
- }
- function?callback_function(swoole_process?$worker)
- {
- ????//echo?”Worker:?start.?PID=”.$worker->pid.”\n”;
- ????//recv?data?from?master
- ????$recv?=?$worker->read();
- ????echo?”From?Master:?$recv\n”;
- ????//send?data?to?master
- ????$worker->write(“hello?master\n”);
- ????sleep(2);
- ????$worker->exit(0);
- }
子进程事件驱动模式
Php代码
- function?callback_function_async(swoole_process?$worker)
- {
- ????//echo?”Worker:?start.?PID=”.$worker->pid.”\n”;
- ????//recv?data?from?master
- ????$GLOBALS['worker']?=?$worker;
- ????swoole_event_add($worker->pipe,?function($pipe)?{
- ????????$worker?=?$GLOBALS['worker'];
- ????????$recv?=?$worker->read();
- ????????echo?”From?Master:?$recv\n”;
- ????????//send?data?to?master
- ????????$worker->write(“hello?master\n”);
- ????????sleep(2);
- ????????$worker->exit(0);
- ????});
- }
PHP创建一个Python子进程,并与之通信
Php代码
- $process?=?new?swoole_process(‘pyhon_process’,?true);
- $pid?=?$process->start();
- function?pyhon_process(swoole_process?$worker)
- {
- ????$worker->exec(‘/usr/bin/python’,?array(“echo.py”));
- }
- $process->write(“hello?world\n”);
- echo?$process->read();
- $ret?=?swoole_process::wait();
- var_dump($ret);
Python程序echo.py
Python代码
- import?sys
- def?main():
- ????s?=?raw_input()
- ????print?”Python:”?+?s
- main()
原文地址:swoole 1.7.3发布,增加PHP多进程管理模块, 感谢原作者分享。