Process

Process是swoole内置的进程管理模块,用来替代PHP的pcntl扩展。

swoole_process支持重定向标准输入和输出,在子进程内echo不会打印屏幕,而是写入管道,读键盘输入可以重定向为管道读取数据。

配合swoole_event模块,创建的PHP子进程可以异步的事件驱动模式。

创建子进程

函数原型:

int swoole_process::__construct(mixed $function, $redirect_stdin_stdout = false, $create_pipe = true);
  • $function,子进程创建成功后要执行的函数,底层会自动将函数保存到对象的callback属性上。
  • 如果希望更改执行的函数,可赋值新的函数到对象的callback属性。
  • $redirect_stdin_stdout,重定向子进程的标准输入和输出。启用此选项后,在进程内echo将不是打印屏幕,而是写入到管道。读取键盘输入将变为从管道中读取数据。默认为阻塞读取。
  • $create_pipe,是否创建管道,启用$redirect_stdin_stdout后,此选项将忽略用户参数,强制为true 如果子进程内没有进程间通信,可以设置为false。
  • 1.7.22或更高版本允许设置管道的类型,默认为SOCK_STREAM流式

    参数$create_pipe为2时,管道类型将设置为SOCK_DGRAM
<?php
$process = new swoole_process(function(swoole_process $worker){
while (true){
$cmd = $worker->read();
passthru($cmd);
}
}, true, 2);
$process->start(); $process->write('ls -l');//将参数传入子进程内
echo $data = $process->read();//获取执行结果

实例:web版本的shell

https://github.com/52fhy/swoole_demo/blob/master/swoole_shell_server.php

EventLoop

swoole还提供了直接操作底层epoll/kqueue事件循环的接口。可将其他扩展创建的socket,PHP代码中stream/socket扩展创建的socket等加入到Swoole的EventLoop中。

swoole_event_add函数用于将一个socket加入到swoole的reactor事件监听中。 函数原型:

bool swoole_event_add(int $sock, mixed $read_callback, mixed $write_callback = null, int `$flags` = null);
  • $sock支持文件描述符、stream资源、sockets资源。
  • $read_callback为可读回调函数。
  • $write_callback为可写事件回调。
  • $flags为事件类型的掩码,可选择关闭/开启可读可写事件,如SWOOLE_EVENT_READSWOOLE_EVENT_WRITE,或者SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE

在Server程序中使用,可以理解为在worker/taskworker进程中将此socket注册到epoll事件中。

在Client程序中使用,可以理解为在客户端进程中将此socket注册到epoll事件中。

示例:

<?php
$fp = stream_socket_client("tcp://www.52fhy.com:80", $errno, $errstr, 30);
fwrite($fp, "GET / HTTP/1.1\r\nHost: www.52fhy.com\r\n\r\n"); swoole_event_add($fp, function($fp) { echo $resp = fread($fp, 1024);
//socket处理完成后,从epoll事件中移除socket
swoole_event_del($fp);
fclose($fp);
});
echo "Finish\n"; //swoole_event_add不会阻塞进程,这行代码会顺序执行

对比一下,下面这个会阻塞进程:

<?php
$fp = stream_socket_client ( "tcp://www.52fhy.com:80" , $errno , $errstr , 30 );
if (! $fp ) {
echo " $errstr ( $errno )<br />\n" ;
} else {
fwrite ( $fp , "GET / HTTP/1.1\r\nHost: www.52fhy.com\r\n\r\n" );
while (! feof ( $fp )) {
echo fgets ( $fp , 1024 );
}
fclose ( $fp );
} echo "Finish\n";

最新文章

  1. 你想不到的!CSS 实现的各种球体效果【附在线演示】
  2. SPSS数据分析—配对Logistic回归模型
  3. Height Half Values
  4. easyui的datagrid行的某一列添加链接
  5. ubuntu 16.04 挂起后WiFi链接不上
  6. 月考(cogs 1176)
  7. fcitx 无法启动
  8. 《Mysql 公司职员学习篇》 第三章 小A的疑问
  9. Java SE学习之printf 日期转换符
  10. 犯这个错误的肯定不止我一个 关于File
  11. bzoj 1187: [HNOI2007]神奇游乐园 插头dp
  12. TextKit学习(四)通过boundingRectWithSize:options:attributes:context:计算文本尺寸
  13. css设置多列等高布局
  14. (转)pycharm常用快捷键
  15. 关于springboot整合配置pagehelper插件的方法
  16. 20165317JAVA实验二-面向对象程序设计
  17. pre打印
  18. DBUtils和连接池
  19. Java—关于String的分析
  20. GIS-ArcGIS JS API FeatureLayer图层绑定事件的几种方式

热门文章

  1. thinkphp的空控制器和空操作以及对应解决方法
  2. [图形学] Chp9 三维几何变换--栈处理函数与矩阵管理函数的区别
  3. ES6中的Set、Map数据结构
  4. mysql基础之yum安装mysql5.7.18
  5. windows安装程序无法将windows配置为在此计算机的硬件上运行
  6. delphi选择打印机打印
  7. 解决QZ-SDK静态库libRPToolLib.a中avfoundation.o文件和kxMovie依赖的ffmpeg静态库libavdevice.a函数重复定义的问题
  8. Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件
  9. Javassist进行方法插桩
  10. JavaScript 之 HelloWorld编写