文档章节

PHP之高性能I/O框架:Libevent(三)

o
 osc_jx98daik
发布于 2018/07/07 16:12
字数 787
阅读 10
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

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%e6%9c%8d%e5%8a%a1%e7%9a%84%e6%a8%a1%e5%9e%8b%e4%bb%a5%e5%8f%8a%e5%ae%9e%e7%8e%b04-%e5%8d%95%e8%bf%9b%e7%a8%8bio%e5%a4%8d%e7%94%a8libevent/
4、libevent中的bufferevent原理 - nengm - 博客园
https://www.cnblogs.com/nengm1988/p/8203784.html
5、EventLoop-Swoole-Swoole文档中心
https://wiki.swoole.com/wiki/page/242.html

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
TDD的测试框架--Machine.Specification

Machine.Specification 是一个 TDD 测试驱动开发的测试框架,简化了测试,无需关心语言本身特性。 Machine.Specifications 带来的好处是不需要在代码里有注释,但同时阅读代码的人可以一目了...

匿名
2013/01/22
1.1K
0
mvc框架--Razor

Razor 是一个轻巧而优雅的servlet mvc框架 # 又一个轮子? no,写就她是为了证实我个人的某些想法,并在这个过程中练练手,这两种冲动碰撞在一起,自然而然地产生了Razor # Razor的现在和未来...

dtubest
2013/01/25
3.1K
0
opm-server-mirror

代码更新 2009-11-25: 加入反爬虫功能。直接Web访问服务器将跳转到Google。 使用方法 下载index.zip 解压index.zip得到index.php 将index.php传到支持php和cURL的国外服务器上 打开 http:/...

luosheng86
2013/01/29
1K
0
基于 ThinkPHP 的内容管理系统--歪酷CMS

歪酷网站管理系统(歪酷CMS)是一款基于THINKPHP框架开发的PHP+MYSQL网站建站程序,本程序实现了文章和栏目的批量动态管理,支持栏目无限分类,实现多管理员管理,程序辅助功能也基本实现了常见的文...

鲁大在线
2013/02/19
7K
2

没有更多内容

加载失败,请刷新页面

加载更多

matplotlib基础绘图命令之imshow

欢迎关注”生信修炼手册”! 在matplotlib中,imshow方法用于绘制热图,基本用法如下 import matplotlib.pyplot as plt import numpy as np np.random.seed(123456789) data = np.random...

庐州月光
昨天
0
0
[Bazel]自定义工具链

1 前言 2 Non-Platform 方式 3 Platform 方式 3.1 平台 3.2 工具链 3.3 Platform + Toolchain 实现平台方式构建 4 小结 1 前言 本文会讲述 Bazel 自定义工具链的两种方式,Platform 和 Non-...

别打名名
前天
0
0
浏览器在输入URL后,到底发生了什么?

这是一道面试会经常问的问题,平时虽然很常见的操作,但是探究其底层原理,可能并不是一件简单的事情,于是我从各处搜罗整理下全过程,在这里做分享。 第一步:浏览器输入域名 例如输入:www...

lintao111
前天
0
0
通过注解的方式整合 MyBatis + Spring Boot

目录 目录 1. 前言 2. 整合过程 2.1 新建 Spring Boot 项目 2.2 添加 pom 依赖 2.3 准备数据库 2.4 pojo 层 2.5 dao 层 2.7 controller 层 2.8 入口程序配置 2.9 网页测试 1. 前言 本篇博客主...

村雨遥
前天
0
0
字节跳动AI Lab 秋季正式批招聘

0 1 公司简介 字节跳动AI Lab,成立于2016年,致力于开发为字节跳动内容平台服务的创新技术,不仅仅是进行理论研究,我们的想法还可以通过实验证明和快速跟踪用于产品部署。 人工智能涉及的研...

我爱计算机视觉
前天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部