php libev扩展使用
在WorkerMan源码分析 - 实现最简单的原型文章中提到了libevent网络库,前者和libev都是事件驱动编程库高性能。简单说libev对libevent做了改进和精简。libevent使用全局变量,导致非线程安全。它的watcher结构也过大,把I/O、计时器、信号句柄整合在一起。而且(作者认为)libevent的附加组件如http和dns库都实现不好,且有安全问题。libev对这些地方做了改进,避免使用全局变量,拆分watcher等。另外libev去掉了外部库(比如http和dns),只专注于事件驱动服务,所以更精简。
安装libev扩展
地址:https://pecl.php.net/package/ev
实例
定时器实现
<?php
//定时器的实现,2秒后每2秒触发1次注册的事件 $loop = new EvLoop(); function timers()
{
echo date("Y-m-d H:i:s") . "\n";
} //$event = $loop->timer(2,0,'timers');
$event = $loop->timer(2,2,'timers');
$loop->run();
结果如下:
2018-04-25 16:57:54
2018-04-25 16:57:55
2018-04-25 16:57:56
2018-04-25 16:57:57
基于事件循环 异步io 的socket读写
<?php
$loop = new EvLoop();
$arr = [];
$data = "hello world\n"; function add($fd,$ev,$func){
global $arr,$loop;
$func = getStreamListenerClosure($fd,$func);
//创建观察者监听io $ev事件
$event = $loop->io($fd,$ev,$func);
$arr[posix_getpid()][(int)$fd] = $event;
} //返回闭包
function getStreamListenerClosure($stream, $listener){
return function () use ($stream,$listener){
call_user_func($listener,$stream);
};
} //读
function baseRead($socket){
$buffer = @fread($socket, 2); if ($buffer == "\n"){
//结尾
fclose($socket) && removeStream($socket);
} else {
echo $buffer;
}
} //写
function baseWrite($socket){ global $data; $written = fwrite($socket, $data,1);
if ($written === strlen($data)) {
fclose($socket);
removeStream($socket);
} else {
$data = substr($data, $written);
} } //停止指定事件并销魂指定流资源
function removeStream($stream){ global $arr,$loop;
$key = (int)$stream;
$pid = posix_getpid(); if (!isset($arr[$pid][$key]))
return; $arr[$pid][$key]->stop();
unset($arr[$pid][$key]);
} function acceptConnection($socket){ $new_socket = @stream_socket_accept($socket);
if (!$new_socket) {
return;
} stream_set_blocking($new_socket,false);
stream_set_read_buffer($new_socket, 0); //add($new_socket,Ev::READ,'baseRead');
add($new_socket,Ev::WRITE,'baseWrite'); } //定时器
function timers()
{
echo date("Y-m-d H:i:s") . "\n";
} $socketmain = stream_socket_server('tcp://127.0.0.1:7777');
//非阻塞
stream_set_blocking($socketmain,false); add($socketmain,Ev::READ,'acceptConnection'); $event = $loop->timer(2,2,'timers'); $loop->run(); /*
while (true){
//EV::RUN_ONCE 事件只触发1次
$loop->run(EV::RUN_ONCE);
}
*/
利用telnet测试,具体参考WorkerMan源码分析 - 实现最简单的原型文章。
php libev扩展使用的更多相关文章
- 使用 libevent 和 libev 提高网络应用性能——I/O模型演进变化史
构建现代的服务器应用程序需要以某种方法同时接收数百.数千甚至数万个事件,无论它们是内部请求还是网络连接,都要有效地处理它们的操作. 有许多解决方案,但事件驱动也被广泛应用到网络编程中.并大规模部署在高 ...
- 使用 libevent 和 libev 提高网络应用性能
使用 libevent 和 libev 提高网络应用性能 Martin C. Brown, 作家, Freelance 简介: 构建现代的服务器应用程序需要以某种方法同时接收数百.数千甚至数万个事件, ...
- [转]Libev源码分析 -- 整体设计
Libev源码分析 -- 整体设计 libev是Marc Lehmann用C写的高性能事件循环库.通过libev,可以灵活地把各种事件组织管理起来,如:时钟.io.信号等.libev在业界内也是广受好 ...
- libev中timer时间事件监控器
1.数据结构 #define ev_at(w) ((WT)(w))->at#define ev_active(w) ((W)(w))->active typedef ev_watcher_ ...
- 使用 Passenger +Apache扩展 Puppet,代替其Webrick的web框架
使用 Passenger +Apache扩展 Puppet,代替其Webrick的web框架 1安装 yum install ruby-devel ruby-libs rubygems libcurl ...
- 开源网络库ACE、Boost的ASIO、libevent、libev、ZeroMQ
开源C/C++网络库:ACE C++语言 跨平台Boost的ASIO C++语言 跨平台libevent C语言 主要支持linux,新版增加了对windows的IOC ...
- libev整体设计
转自:http://m.blog.csdn.NET/blog/weiqubo/16355653 libev是Marc Lehmann用C写的高性能事件循环库.通过libev,可以灵活地把各种事件组织管 ...
- Asp.net Boilerplate之AbpSession扩展
当前Abp版本1.2,项目类型为MVC5. 以属性的形式扩展AbpSession,并在"记住我"后,下次自动登录也能获取到扩展属性的值,版权归"角落的白板报"所 ...
- 恢复SQL Server被误删除的数据(再扩展)
恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是文章里的存储过程不能实现对备份出来的日志备份里所删数据的 ...
随机推荐
- cxgrid中回车键光标移到下列
OptionsBehavior.GoToNextCellOnEnter:=True; 更完善的回车 可以在焦点到了最后一列再回车时有下一行则移到下一行的第一列,没有下一行则新增记录并移到第一列 pro ...
- Lazarus 0.9.26——UTF8编码副作用
Lazarus 0.9.26中,涉及范围最广的的改变就是所有的的String默认都采用UTF8编码,IDE终于有了完全的UTF8支持,以前在源码编辑器中“吃掉”半个汉字的情况不再出现.对于Linux下 ...
- C#new出来的结构体内存分配在堆上
如题,有同事说因为结构体是值类型,所以 new出来的也是分配在栈上的.我的直觉是但凡使用new的东西都在堆上分配内存,除非C#对结构体做了特殊处理. new int[10]这个说明不了什么,因为数组是 ...
- Linux tcpdump命令使用方法
tcpdump是Linux上常用的抓包命令,用于截取网络分组并输出分组内容,常用于网络问题分析和排查. tcpdump语法 tcpdump [-i 接口] [-nn] [-w 文件名] [-c 次数] ...
- 深入jUI(DWZ)
-----------------------------------------------------------------------------主页面index.html <html& ...
- Android事件拦截机制 - 两句话
模拟情形:ViewGroupA ->ViewGroupB->View False往下走,True就停下.(适用于事件传递和事件处理)
- 基于Java SE集合的图书管理系统
图书管理系统一.需求说明1.功能:登录,注册,忘记密码,管理员管理,图书管理.2.管理员管理:管理员的增删改查.3.图书管理:图书的增删改查.4.管理员属性包括:id,姓名,性别,年龄,家庭住址,手机 ...
- android事件处理概括
什么是事件处理? 事件处理就是针对用户的一些特定操作,进行相对应的回馈.时间处理也是程序开发中的人机交互的一个非常重要的体现.事件处理中,事件源是事件的起始位. 一.事件处理三要素 事件源——事件—— ...
- Linux安装face_recgnition
Ubuntu 3:apt-get install python3.6-dev 4:pip3 install face_recgnition 5: pip3 install opencv-python ...
- ABAP 自定义排序的思想(不用系统标准的SORT语句)
不用ABAP的标准SORT语句,你能将下面这个数组按从小到大(或从大到小)的顺序重新排列,并计算其算法复杂度吗? 现在假设有一个数组:A = [10,66,52,102,-65,85,99,1,56, ...