• PHP中的Libevent学习


     

    wangbin@2012,1,3

    目录

    Libevent在php中的应用学习

    1、      Libevent介绍

    2、      为什么要学习libevent

    3、      Php libevent 扩展模块安装

    4、      Libevent常量及php函数

    5、      Select/poll模型

    6、      epoll/kqueue模型

    1、 libevent介绍

    libevent是一个事件触发的网络库,适用于windows、linux、freebsd等多种平台,内部使用select、poll、epoll、kqueue等系统调用管理事件机制。Libevent是跨平台的,而且具有非凡的性能。与nodejs一样是事件驱动的;官方网站:http://libevent.org/

    最新的稳定版本

    https://github.com/downloads/libevent/libevent/libevent-2.0.16-stable.tar.gz

    主要模块:

    事件处理框架

    事件引擎模块

    Buffer管理模块

    信号处理模块

    php本身不支持多线程,php不能很好实现并发机制。Pecl提供的pcntl(进程控制)、libevent扩展、socket包、stream系统函数,可以使用php轻易地开发出高性能,高并发的网络应用程序。

    简单应用事例:Pcntl fork nworkermaster process 得到请求后,处理信息发送给worker程序worker处理完后回传给clientMaster process 可以跟据并发量,来设定worker的数量,n的大小,并monitor(监控)worker的数据,在不足时启动更多的进程。同nginx原理。

    附:Php网络编程框架

    http://code.google.com/p/swoole/downloads/list

    2、 为什么要学习libevent

    http server可以说是libevent的经典应用。可以从libevent当中找到http的标准写法,非阻塞的http server也就是socket处理与http协议处理缠绕。

    学习libevent有助于提升程序设计功力,除了网络程序设计方面外,Libevent的代码里有很多有用的设计技巧和基础数据结构,比如信息隐藏、函数指针、c语言的多态支持、链表和堆等等,都有助于提升自身的程序功力1

    对请求的处理的三种类型:

    1、  connection input  fork a new process

    2、  connection input  pthread_create

    3、  connection input throw a Event-based array; main process do nonblocking things;

     

    3、 Php libevent 扩展模块安装

    Curl –O https://github.com/downloads/libevent/libevent/libevent-2.0.16-stable.tar.gz

     

    Tar –zxvf libevent-2.0.16-stable.tar.gz

    Cd libevent-2.0.16-stable

    /usr/local/php/bin/phpize

    ./configure

    make

    make install

    vi /usr/local/php/etc/php.ini

    extension_dir=””;

    extension=libevent.so

    php –m | grep lib

    安装成功

     

    4、 Libevent常量及php函数

    #define EV_TIMEOUT      0x01

    #define EV_READ         0x02

    #define EV_WRITE        0x04

    #define EV_SIGNAL       0x08

    #define EV_PERSIST      0x10

    #define EV_ET           0x20

    #define EVLOOP_ONCE     0x01

    #define EVLOOP_NONBLOCK 0x02

    常量名

    含义

    1

    EV_TIMEOUT

    超过时间后事件成为激活状态

    2

    EV_READ

    FD就绪,可以读取的时候 ,事件成为激活状态

    4

    EV_WRITE

    FD就绪,可以写入的时候 ,事件成为激活状态

    8

    EV_SIGNAL

    用于实现信号检测

    16

    EV_PERSIST

    表示事件是持久的

    32

    EV_ET

    表示底层是否支持边沿触发事件

    1

    EVLOOP_ONCE

    如果设置了EVLOOP_ONCE,循环将等待某些事件成为激活的,执行激活的事件直到没有更多的事件可以执行,然会返回。

    2

    EVLOOP_NONBLOCK

    如果设置了EVLOOP_NONBLOCK,循环不会等待事件被触发:循环将仅仅检测是否有事件已经就绪,可以立即触发,如果有,则执行事件的回调。

     

    event_base_freee()

                 释放资源,这不能销毁绑定事件

    event_base_loop()

      处理事件,根据指定的base来处理事件循环

    event_base_loopbreak()

      立即取消事件循环,行为各break语句相同

    event_base_loopexit()

      在指定的时间后退出循环

    event_base_new()

      创建并且初始事件

    event_base_priority_init()

      设定事件的优先级

    event_base_set()

      关联事件到事件base

    event_buffer_base_set()

      关联缓存的事件到event_base

    event_buffer_disable()

      禁用一个缓存的事件

    event_buffer_enable()

      启用一个指定的缓存的事件

    event_buffer_fd_set()

      改变一个缓存的文件系统描述

    event_buffer_free()

      释放缓存事件

    event_buffer_new()

      建立一个新的缓存事件

    event_buffer_priority_set()

      缓存事件的优先级设定

    event_buffer_read()

      读取缓存事件中的数据

    event_buffer_set_callback()

      给缓存的事件设置或重置回调hansh函数

    event_buffer_timeout_set()

      给一个缓存的事件设定超时的读写时间

    event_buffer_watermark_set

      设置读写事件的水印标记

    event_buffer_write()

      向缓存事件中写入数据

    event_add()

      向指定的设置中添加一个执行事件

    event_del()

      从设置的事件中移除事件

    event_free()

      清空事件句柄

    event_new()

      创建一个新的事件

    event_set()

      准备想要在event_add中添加事件

    5、 Select/poll模型

    如果你使用sockets extension,这里有socket_select()、stream_select().对于大数应用程序来说,socket_select()、stream_select()已经是足够好的系统调用接口。

    6、 epoll/kqueue模型

    <?php

        function print_line($fd, $events, $arg)

    {

        static $max_requests = 0;

           $max_requests++;

           if ($max_requests == 10) {

            // exit loop after 10 writes

            event_base_loopexit($arg[1]);

        }

        echo  fgets($fd);

    }

    // create base and event

    $base = event_base_new();

    $event = event_new();

    $fd = STDIN;

     // set event flags

    event_set($event, $fd, EV_READ | EV_PERSIST, "print_line", array($event, $base));

    // set event base

    event_base_set($event, $base);

     // enable event

    event_add($event);

    // start event loop

    event_base_loop($base);

     

     

     

    参考:

    [1]      http://blog.csdn.net/sparkliang/article/details/4957667

    [2]      http://blog.csdn.net/laoyi19861011/article/details/6539244

    [3]      http://blog.csdn.net/laoyi19861011/article/details/6537859

    [4]      http://www.wangafu.net/~nickm/libevent-book/Ref3_eventloop.html

    [5]      http://www.ooso.net/archives/607

    [6]      http://blog.csdn.net/vaal_water/article/details/6968695

    [7]      http://blog.csdn.net/shagoo/article/details/6396089

    [8]      http://blog.si.kz/index.php/2010/02/03/libevent-for-php

    [9]      http://www.ibm.com/developerworks/cn/aix/library/au-libev/index.html

    [10]   https://github.com/kakserpom/phpdaemon

    [11]   http://www.cnblogs.com/imvkmark/archive/2011/12/21.html

    [12]   http://www.oschina.net/question/12_15837

  • 相关阅读:
    使用Mongodb存放文件系统的离线栅格数据,供Cesium访问
    Moogose的基本连接以及增删改查操作
    MongoDB
    Linq对列表进行分组,求和,排序
    ArcEngine对属性表的操作
    ArcEngine打开GDB,SHP的方法
    javaweb之JSP+Servlet
    node.js后端之sequelize
    javascript的闭包
    LeetCode 第133场周赛总结
  • 原文地址:https://www.cnblogs.com/webStyle/p/4543482.html
Copyright © 2020-2023  润新知