Swoole

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

文档:https://wiki.swoole.com/wiki/page/242.html

这里我也简单介绍一下。

基本使用

swoole_tcp_server.php

<?php
/**
* Created by PhpStorm.
* User: 公众号: 飞鸿影的博客(fhyblog)
* Date: 2018/6/30
*/ use Swoole\Event; $socket = stream_socket_server ("tcp://0.0.0.0:9201", $errno, $errstr);
if (false === $socket ) {
echo "$errstr($errno)\n";
exit();
}
if (!$socket) die($errstr."--".$errno);
// stream_set_blocking($socket,0); //可以去掉,没有涉及到read这个socket echo "waiting client...\n"; //accept事件回调函数,参数分别是$fd
function ev_accept($socket){
global $master; $connection = stream_socket_accept($socket); //参数的设置将会影响到像 fgets() 和 fread() 这样的函数从资源流里读取数据。
//在非阻塞模式下,调用 fgets() 总是会立即返回;而在阻塞模式下,将会一直等到从资源流里面获取到数据才能返回。
stream_set_blocking($connection, 0);//如果不设置,后续读取会阻塞
$id = (int)$connection; echo "new Client $id\n"; Event::add($connection, 'ev_read', null, SWOOLE_EVENT_READ);
} //read事件回调函数,参数是fd
function ev_read($buffer)
{
$receive = ''; //循环读取并解析客户端消息
while( 1 ) {
$read = @fread($buffer, 2); //客户端异常断开
if($read === '' || $read === false){
break;
} $pos = strpos($read, "\n");
if($pos === false)
{
$receive .= $read;
// echo "received:".$read.";not all package,continue recdiveing\n";
}else{
$receive .= trim(substr ($read,0,$pos+1));
$read = substr($read,$pos+1); switch ( $receive ){
case "quit":
echo "client close conn\n"; //关闭客户端连接
Event::del($buffer);//删除事件
fclose($buffer);//断开客户端连接
break;
default:
// echo "all package:\n";
echo $receive."\n";
break;
}
$receive='';
}
}
} Event::add($socket, 'ev_accept', null, SWOOLE_EVENT_READ);
echo "start run...\n"; //进入事件循环
Event::wait(); //PHP5.4或更高版本不需要加此函数 //下面这句不会被执行
echo "This code will not be executed.\n";

Event::add()等方法也有对应的函数,例如swoole_event_add()

定时器

swoole提供了两个定时器:

  • swoole_timer_tick 周期定时器,面向对象写法:Timer::tick
  • swoole_timer_after 一次性定时器,面向对象写法:Timer::after

swoole定时器的精度是毫秒。

示例:

<?php
/**
* Created by PhpStorm.
* User: 公众号: 飞鸿影的博客(fhyblog)
* Date: 2018/6/30
*/ use Swoole\Timer; Timer::after(1000, function(){
echo time(). " hello\n";
Timer::tick(1000, function($timer_id, $params){
static $c = 0;
echo time(). " hello $params $c\n"; $c++;
if($c > 5){
Timer::clear($timer_id);
}
}, 'this is param');
});

说明:Timer::after回调函数没有参数,Timer::tick回调函数参数是定时器ID及附加参数。

总结

我曾经查阅了Workerman的源码,看到作者把常见的Event(系统自带Select、libevet、Event、Ev、Swoole)进行了一次封装,对外暴露了统一的接口(add、del、loop),大家有兴趣可以看看。

参考

1、php libevent扩展的简单用例 - NickBai - 博客园

https://www.cnblogs.com/nickbai/articles/6197689.html

2、PHP使用pcntl和libevent 实现Timer功能 | 博客水木

http://www.4u4v.net/php-uses-pcntl-and-libevent-achieve-timer-function.html

3、socket服务的模型以及实现(4)–单进程IO复用libevent

http://www.xtgxiso.com/socket服务的模型以及实现4-单进程io复用libevent/

4、libevent中的bufferevent原理 - nengm - 博客园

https://www.cnblogs.com/nengm1988/p/8203784.html

5、EventLoop-Swoole-Swoole文档中心

https://wiki.swoole.com/wiki/page/242.html

PHP之高性能I/O框架:Libevent(三)的更多相关文章

  1. PHP之高性能I/O框架:Libevent(一)

    Libevent 是一个用C语言编写的.轻量级的开源高性能I/O框架,支持多种 I/O 多路复用技术: epoll. poll. dev/poll. select 和 kqueue 等:支持 I/O, ...

  2. 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

    前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...

  3. 高性能分布式执行框架——Ray

    Ray是UC Berkeley AMP实验室新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室阶 ...

  4. 新手入门:目前为止最透彻的的Netty高性能原理和框架架构解析

    1.引言 Netty 是一个广受欢迎的异步事件驱动的Java开源网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. 本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件 ...

  5. Netty高性能原理和框架架构解析

    1.引言 Netty 是一个广受欢迎的异步事件驱动的Java开源网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. 本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件 ...

  6. linux高性能服务器编程 (八) --高性能服务器程序框架

    第八章 高性能服务器编程框架 这一章主要介绍服务器的三个主要模块: I/O处理单元.逻辑单元.存储单元.另外服务器的模型有:C/S模型和P2P模型.虽然服务器模型比较多,但是其核心框架都一样,只是在于 ...

  7. 【转】目前为止最透彻的的Netty高性能原理和框架架构解析

    转自:https://zhuanlan.zhihu.com/p/48591893 1.引言 Netty 是一个广受欢迎的异步事件驱动的Java开源网络应用程序框架,用于快速开发可维护的高性能协议服务器 ...

  8. 高性能环形队列框架 Disruptor 核心概念

    高性能环形队列框架 Disruptor Disruptor 是英国外汇交易公司LMAX开发的一款高吞吐低延迟内存队列框架,其充分考虑了底层CPU等运行模式来进行数据结构设计 (mechanical s ...

  9. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  10. JavaScript框架设计(三) push兼容性和选择器上下文

    JavaScript框架设计(三) push兼容性和选择器上下文 博主很久没有更博了. 在上一篇 JavaScript框架设计(二) 中实现了最基本的选择器,getId,getTag和getClass ...

随机推荐

  1. redis安全删key脚本(模糊匹配,长list,大set等)

    两种情况: 1.删除指定前缀开头的rediskey ,扫描和删除过程中对线上无感知 2.删除一个大的list,set,zset,hash,这种得分批次减少大小,一直缩到0再删 第一种情况:只要知道线上 ...

  2. 用TSQL从sqlserve 发布订阅链中删除一张或几张表

    一个简单的存储过程,用来实现从一个SQLSERVE 发布订阅链中删除一张或几张表. /* 1.停日志读取代理 2.exec usp_从复制订阅中删除表 'dbtestPub','test1' 3.开日 ...

  3. linux 查看信息-进程&用户&服务&程序

    进程 1.查看所有进程 2.实时显示进程状态 用户 1.查看活动用户 2.查看登录日志 3.查看系统所有用户 4.查看系统所有组 5.查看当前用户的计划任务 服务 1.列出所有系统服务 2.列出所有启 ...

  4. C# 创建Dll文件供程序调用方法

    C# 创建Dll文件供程序调用方法 使用C#创建动态Dll文件方法: 1.  在VS2017环境下,新建-项目-选择类库类型: 2. 新创建一个.cs文件(如test.cs),编写代码如下: usin ...

  5. session和cookie相关知识总结

    HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的. 人们很快发现 ...

  6. 【repost】H5总结

    1.新增的语义化标签: <nav>: 导航 <header>: 页眉 <footer>: 页脚 <section>:区块 <article> ...

  7. Makefile入门

    相信大家对makefile都不陌生,在Linux下编写程序基本都离不开makefile的编写,我们都知道多个.c文件经过编译器编译后得到多个.o文件,这些文件是互相独立的,但最终我们要得到一个可正常运 ...

  8. Nginx+Tomcat反向代理利用certbot实现https

    一.利用Let's Encrypt 免费生成HTTPS证书 1.下载安装certbot(Let's Encrypt ) 2.利用certbot生成证书 3.配置nginx的https证书 安装cerb ...

  9. PowerBuilder常用字符串函数

    http://blog.sina.com.cn/s/blog_5995b53d0100a694.html Fill()功能建立一个由指定字符串填充的指定长度的字符串.语法Fill ( chars, n ...

  10. 如果你在it院校学习累了,你能干什么?

    文章来源i春秋,未经允许不得转载    工具链接https://bbs.ichunqiu.com/portal.php 如果你在国内的it院校累了,有些厌倦了,你该怎么办?    分享一些joke以前 ...