Swoole笔记(四)
2024-08-26 06:41:21
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_READ
,SWOOLE_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";
最新文章
- 你想不到的!CSS 实现的各种球体效果【附在线演示】
- SPSS数据分析—配对Logistic回归模型
- Height Half Values
- easyui的datagrid行的某一列添加链接
- ubuntu 16.04 挂起后WiFi链接不上
- 月考(cogs 1176)
- fcitx 无法启动
- 《Mysql 公司职员学习篇》 第三章 小A的疑问
- Java SE学习之printf 日期转换符
- 犯这个错误的肯定不止我一个 关于File
- bzoj 1187: [HNOI2007]神奇游乐园 插头dp
- TextKit学习(四)通过boundingRectWithSize:options:attributes:context:计算文本尺寸
- css设置多列等高布局
- (转)pycharm常用快捷键
- 关于springboot整合配置pagehelper插件的方法
- 20165317JAVA实验二-面向对象程序设计
- pre打印
- DBUtils和连接池
- Java—关于String的分析
- GIS-ArcGIS JS API FeatureLayer图层绑定事件的几种方式
热门文章
- thinkphp的空控制器和空操作以及对应解决方法
- [图形学] Chp9 三维几何变换--栈处理函数与矩阵管理函数的区别
- ES6中的Set、Map数据结构
- mysql基础之yum安装mysql5.7.18
- windows安装程序无法将windows配置为在此计算机的硬件上运行
- delphi选择打印机打印
- 解决QZ-SDK静态库libRPToolLib.a中avfoundation.o文件和kxMovie依赖的ffmpeg静态库libavdevice.a函数重复定义的问题
- Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件
- Javassist进行方法插桩
- JavaScript 之 HelloWorld编写