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";

Swoole笔记(四)的更多相关文章

  1. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  2. 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9327377 作者:七十一雾央 新浪微博:http:// ...

  3. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  4. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  5. Java学习笔记四---打包成双击可运行的jar文件

    写笔记四前的脑回路是这样的: 前面的学习笔记二,提到3个环境变量,其中java_home好理解,就是jdk安装路径:classpath指向类文件的搜索路径:path指向可执行程序的搜索路径.这里的类文 ...

  6. Java加密与解密笔记(四) 高级应用

    术语列表: CA:证书颁发认证机构(Certificate Authority) PEM:隐私增强邮件(Privacy Enhanced Mail),是OpenSSL使用的一种密钥文件. PKI:公钥 ...

  7. Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  8. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  9. Django开发笔记四

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.邮箱激活 users app下,models.py: ...

  10. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

随机推荐

  1. SQL Server分页查询方法整理

    SQL Server数据库分页查询一直是SQL Server的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID.YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页 ...

  2. Lucene的使用与重构

    忽然一想好久不写博客了,工作原因个人原因,这些天一直希望一天假如36个小时该多好,但是,假如不可能. 由于近期在项目中接触了lucene,这个已经没有人维护的全文搜索框架,确实踩了不少坑,为什么用lu ...

  3. POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups / HDU 1699 Jamie's Contact Groups / SCU 1996 Jamie's Contact Groups (二分,二分图匹配)

    POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups ...

  4. 每天来点Java面试题(一)

    (1)java 中的 static  字段的 使用: 什么是 static ? 它是 java 的修饰符,定义静态变量和静态方法. 什么时候用? 通常用在工具类里面,修饰静态方法,然后供其它类的方法使 ...

  5. nyoj_61: 传纸条(一)

    题目链接 使用双线dp,假设两个人同时从左上角移动到右下角,且满足路线不交叉,另k=x1+y1=x2+y2压缩状态进行优化.每次状态转移满足 x1,x2,y1,y2都在矩阵范围内,且(x2,y2)在相 ...

  6. Java开源博客My-Blog(SpringBoot+Docker)系列文章

    My Blog 1.Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦 2.My-Blog搭建过程:如何让一个网站从零到可以上线访问 3.将数据的初始化放到 ...

  7. 扩展entity framework core 实现默认字符串长度,decimal精度,entity自动注册和配置

    报道越短,事情越严重!文章越短,内容越精悍! 文章以efcore 2.0.0-preview2.测试验证通过.其他版本不保证使用,但是思路不会差太远.源代码 目标: 1.实现entity的自动发现和m ...

  8. Spring定时器实现(二)

    Spring结合quarzt可以实现更复杂的定时器,现做简单介绍相关配置: <?xml version="1.0" encoding="UTF-8"?&g ...

  9. (转)java中的 | ^ & 分别是什么?

    |是按位或 ^是按位抑或 &是按位与 比如有两个数 int x = 5; int y = 11; System.out.println(x|y); System.out.println(x&a ...

  10. Go语言学习笔记(五)文件操作

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 文件读取 os.File 封装了文件相关操作 type File File代表一个打开的文件对象. func Cr ...