Event IO Process
先了解一下process和event loop
EventLoop
除了异步Server和Client库之外,Swoole扩展还提供了直接操作底层epoll/kqueue事件循环的接口。可将其他扩展创建的socket,PHP代码中stream/socket扩展创建的socket等加入到Swoole的EventLoop中。
事件优先级
- 通过
Process::signal设置的信号处理回调函数 - 通过
Event::defer设置的延迟执行函数 - 通过
Timer::tick和Timer::after设置的定时器回调函数 - 通过
Event::cycle设置的周期回调函数
swoole_event_add函数用于将一个socket加入到底层的reactor事件监听中。此函数可以用在Server或Client模式下
参数
参数1可以为以下四种类型:
int,就是文件描述符,包括swoole_client->$sock、swoole_process->$pipe或者其他fdstream资源,就是stream_socket_client/fsockopen创建的资源sockets资源,就是sockets扩展中socket_create创建的资源,需要在编译时加入./configure --enable-socketsobject,swoole_process或swoole_client,底层自动转换为管道或客户端连接的socket
参数2为可读回调函数,参数3为可写事件回调,可以是字符串函数名、对象+方法、类静态方法或匿名函数,当此socket可读时回调指定的函数。
参数4为事件类型的掩码,可选择关闭/开启可读可写事件,如SWOOLE_EVENT_READ,SWOOLE_EVENT_WRITE,或者SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE
在 Server 程序中使用时,必须在 Worker 进程启动后使用。在 Server::start 之前不得调用任何异步 IO 接口




在fpm当中一个请求结束了线程就被关掉了,注册的事件就不会再去监听了
event lop实例:
命令符聊天室
主要应用点:
异步读取来自副武器的数据
异步读取来自终端的输入
手动退出聊天室

监听服务器的读和写操作

服务端是不会挺停止的
process
PHP自带的pcntl,存在很多不足,如
- pcntl没有提供进程间通信的功能
- pcntl不支持重定向标准输入和输出
- pcntl只提供了fork这样原始的接口,容易使用错误
- swoole_process提供了比pcntl更强大的功能,更易用的API,使PHP在多进程编程方面更加轻松。
swoole_process提供了如下特性:
- swoole_process提供了基于unixsock的进程间通信,使用很简单只需调用write/read或者push/pop即可
- swoole_process支持重定向标准输入和输出,在子进程内echo不会打印屏幕,而是写入管道,读键盘输入可以重定向为管道读取数据
- 配合swoole_event模块,创建的PHP子进程可以异步的事件驱动模式
- swoole_process提供了exec接口,创建的进程可以执行其他程序,与原PHP父进程之间可以方便的通信
curl实例:多进程执行任务和执行一个外部的程序
<?php
/**
* Created by PhpStorm.
* User: baidu
* Date: 18/3/17
* Time: 上午12:31
*/ echo "process-start-time:".date("Ymd H:i:s");
$workers = [];
$urls = [
'http://baidu.com',
'http://sina.com.cn',
'http://qq.com',
'http://baidu.com?search=singwa',
'http://baidu.com?search=singwa2',
'http://baidu.com?search=imooc',
]; for($i = 0; $i < 6; $i++) {
// 子进程
$process = new swoole_process(function(swoole_process $worker) use($i, $urls) {
// curl
$content = curlData($urls[$i]);
//echo $content.PHP_EOL;
$worker->write($content.PHP_EOL);
}, true);
$pid = $process->start();
$workers[$pid] = $process;
} foreach($workers as $process) {
echo $process->read();
}
/**
* 模拟请求URL的内容 1s
* @param $url
* @return string
*/
function curlData($url) {
// curl file_get_contents
sleep(1);
return $url . "success".PHP_EOL;
}
echo "process-end-time:".date("Ymd H:i:s");
$process = new swoole_process(function(swoole_process $pro) {
// todo
// php redis.php
$pro->exec("/home/work/study/soft/php/bin/php", [__DIR__.'/../server/http_server.php']);
}, false);
$pid = $process->start();
echo $pid . PHP_EOL;
swoole_process::wait();
process实例:
<?php
class BaseProcess{
private $process;
public function __construct()
{
$this->process = new swoole_process([$this,'run'],false,true);
$this->process->start();
swoole_event_add($this->process->pipe,function($pipe){
$data = $this->process->read();
echo 'RECV: '.$data.PHP_EOL;
});
} public function run($worker){
swoole_timer_tick(1000,function($timer_id){
static $index = 0 ;
$index += 1;
$this->process->write('hello sunlong');
var_dump($index);
if($index == 10){
swoole_timer_clear($timer_id);
}
});
}
} new BaseProcess();
swoole_process::signal(SIGCHLD,function($sig){
while($ret = swoole_process::wait(false)){
echo "PID={$ret['pid']}\n";
}
});
返回结果
[root@localhost php]# php7 process2.php
int(1)
RECV: hello sunlong
int(2)
RECV: hello sunlong
int(3)
RECV: hello sunlong
int(4)
RECV: hello sunlong
int(5)
RECV: hello sunlong
int(6)
RECV: hello sunlong
int(7)
RECV: hello sunlong
int(8)
RECV: hello sunlong
int(9)
RECV: hello sunlong
int(10)
RECV: hello sunlong
PID=2903
上述案例 创建子进程,然后执行定时器,定时器向管道写入数据;swoole_event_add监听管道写事件回调(异步监听管道数据),读取到写的内容并输出。
此时程序还没终止,event loop还在监听管道数据
下面是消息队列作为进程间通信 消息队列同步的 不支持异步

[root@localhost php]# php7 process2.php
int(1)
RECV: hello sunlong
int(2)
RECV: hello sunlong
int(3)
RECV: hello sunlong
int(4)
RECV: hello sunlong
int(5)
RECV: hello sunlong
int(6)
RECV: hello sunlong
int(7)
RECV: hello sunlong
int(8)
RECV: hello sunlong
int(9)
RECV: hello sunlong
int(10)
RECV: hello sunlong
升华一下 实现简单的进程池 动态扩展进程池 同时处理更多任务

但是推荐使用swoole_server+task做任务池
swoole_process->exec
process在swoole_server中还是有实际运用的,比如执行脚本或者shell命令,linux的tail,top,ps持续的命令,通过管道实时监听,展示在网页上,做成一个外部监控器(process应用)
task执行一个长耗时任务,
两者有重叠但是也有区别
Event IO Process的更多相关文章
- 泛函编程(38)-泛函Stream IO:IO Process in action
在前面的几节讨论里我们终于得出了一个概括又通用的IO Process类型Process[F[_],O].这个类型同时可以代表数据源(Source)和数据终端(Sink).在这节讨论里我们将针对Proc ...
- 泛函编程(35)-泛函Stream IO:IO处理过程-IO Process
IO处理可以说是计算机技术的核心.不是吗?使用计算机的目的就是希望它对输入数据进行运算后向我们输出计算结果.所谓Stream IO简单来说就是对一串按序相同类型的输入数据进行处理后输出计算结果.输入数 ...
- 泛函编程(37)-泛函Stream IO:通用的IO处理过程-Free Process
在上两篇讨论中我们介绍了IO Process:Process[I,O],它的工作原理.函数组合等.很容易想象,一个完整的IO程序是由 数据源+处理过程+数据终点: Source->Process ...
- Understanding Asynchronous IO With Python 3.4's Asyncio And Node.js
[转自]http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html Introduction I spent this su ...
- IO网络模型
多路处理模型MPM MPM是Apache2引入的一个概念,就是将结构模块化.把核心任务处理作为一个可插拔的模块,使其能针对不同的环境进行优化 在这个情况下,就诞生出了处理模式的概念 Prefork 实 ...
- Linux Process VS Thread VS LWP
Process program program==code+data; 一个进程可以对应多个程序,一个程序也可以变成多个进程.程序可以作为一种软件资源长期保存,以文件的形式存放在硬盘 process: ...
- 一步步使用BMC Atrium Orchestrator Vmware Infrastructure Event Monitor
本教程将一步步演示怎么使用BMC Atrium Orchestrator (BAO) Vmware Infrastructure Event Monitor来监控VSphere Webservice的 ...
- process.nextTick
回调函数同步执行 function asyncFake(data, callback) { if(data === 'foo') { callback(true); }else{ callback(f ...
- 进程Process之join、daemon(守护)、terminate(关闭)、multiprocessing之锁、信号量和事件
一.Process 参数介绍: 1 group参数未使用,值始终为None 2 target表示调用对象,即子进程要执行的任务 3 args表示调用对象的位置参数元组,args=(1,2,'a',) ...
随机推荐
- postgresql change table
--if cloumn exist SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema='ent' A ...
- java根据URL获取HTML内容
之前我写脚本,是想获取HTML内容的. 但是呢...一方面编码困扰着我,于是我写了这个: java根据URL获取网页编码 然后呢,每个网站是不是GZIP还得判断,贼麻烦... 但是没办法啊,麻烦也得写 ...
- 完美解决百度网盘、浏览器下载限速问题proxyee-down(附带win破解版云盘)
win版破解云盘 下载: <PanDownload> 使用文档: <PanDownload使用> Mac方法 限速.限速! 平时下载东西限速倒无所谓,遇到急一点的.盯着80km ...
- _itemmod_day_limit
控制玩家每天获得的物品上限 表说明 `comment` 备注 `entry` 物品 `limitCount`获取上限
- Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo 矩阵快速幂优化dp
E. Okabe and El Psy Kongroo time limit per test 2 seconds memory limit per test 256 megabytes input ...
- C#端加载数据库,Combobox与Node控件绑定数据源demo示例
最近一直在做网页.用的js比较多,最近需要做一个C#相关的demo,一开始还有点不适应,写了几句有点感觉了 本篇博客的主要内容是C#怎么读取数据库文件里的数据以及相关控件如何绑定数据源,所做的Demo ...
- 百度“搜索设置”之基于定位下拉框或者需要点击link才显示的下拉框,二次定位与多次定位实现的实际效果区别
还是基于上次那个练习的后续出现的思考,http://www.cnblogs.com/8013-cmf/p/6555790.html 界面: 源码: 写法如下: 继续解释这两种的区别: 1.其实基于定 ...
- .net core 基础知识
1.IOC(转:https://www.cnblogs.com/artech/p/inside-asp-net-core.html) IoC的全名Inverse of Control,翻译成中文就是“ ...
- in_array的三个参数
needle 待搜索的值. haystack 待搜索的数组. strict 如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 hays ...
- [原][osg][osgearth]倾斜摄影2.文件格式分析:OSGB
倾斜摄影三维模型格式包含:*.osgb,*.dae等 文件格式包含:*.xml, *.desc, *.lfp等 例如:LocaSpace Viewer软件把osgb分块模型文件建立索引生成一个lfp文 ...