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多进程管理模块, 感谢原作者分享。
Statement:The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn