zoukankan      html  css  js  c++  java
  • 【转】网页游戏能用PHP做后端开发吗? PHP Libevent扩展安装及应用

    网页游戏能用PHP做后端开发吗?

    当然可以。最好走HTTP,也可以做网络编程,而且写代码超简单,1个函数就可以建一个服务器端。stream_socket_server()
    多线程不是什么好主意,你可以用php libevent扩展,异步高并发。PHP还有很多网络的扩展包。
    PHP的开发效率高,.net Java ,你足够有钱,可以用。

    libevent是一个基于事件驱动的高性能网络库。支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。
    PHP libevent扩展安装:
    libevent扩展依赖于原始的libevent库,必须先把libevent库安装。
    (1)安装libevent库

    1. wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.20-stable.tar.gz
    2. tar zxvf libevent-2.0.20-stable.tar.gz
    3. cd libevent-2.0.20-stable/
    4. ./configure --prefix=/usr/local/libevent-2.0.20/
    5. make
    6. make install


    (2)安装libevent扩展(http://pecl.php.net/package/libevent)

    1. wget http://pecl.php.net/get/libevent-0.1.0.tgz
    2. tar -zxvf libevent-0.1.0.tgz
    3. cd libevent-0.1.0
    4. ./configure --with-php-config=/usr/local/php54/bin/php-config --with-libevent=/usr/local/libevent-2.0.20/
    5. make && make install
    6. #php.ini添加extension=libevent.so


    PHP Libevent扩展介绍:
    (1)常量
    libevent1.png
    (2)函数

    • event_base_free() 释放资源,这不能销毁绑定事件
    • 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中添加事件


    PHP Libevent扩展使用:
    例1:5s后触发callback

    1. $base = event_base_new();
    2. $event = event_new();
    3.  
    4. event_set($event, 0, EV_TIMEOUT, function() {
    5. echo "function called";
    6. });
    7. event_base_set($event, $base);
    8.  
    9. event_add($event, 5000000);
    10. event_base_loop($base);


    例2:打印输入流

    1. function print_line($fd, $events, $arg)
    2. {
    3. static $max_requests = 0;
    4. $max_requests++;
    5. if ($max_requests == 10) {
    6. // exit loop after 10 writes
    7. event_base_loopexit($arg[1]);
    8. }
    9. echo fgets($fd);
    10. }
    11.  
    12. // create base and event
    13. $base = event_base_new();
    14. $event = event_new();
    15.  
    16. $fd = STDIN;
    17. // set event flags
    18. event_set($event, $fd, EV_READ | EV_PERSIST, 'print_line', array($event, $base));
    19. // set event base
    20. event_base_set($event, $base);
    21. // enable event
    22. event_add($event);
    23. // start event loop
    24. event_base_loop($base);


    例3:实现简单web server
    在cli执行后,打开浏览器2000端口试试看。

    1. $socket = stream_socket_server ('tcp://0.0.0.0:2000', $errno, $errstr);
    2. stream_set_blocking($socket, 0);
    3.  
    4. $base = event_base_new();
    5. $event = event_new();
    6. event_set($event, $socket, EV_READ | EV_PERSIST, 'ev_accept', $base);
    7. event_base_set($event, $base);
    8. event_add($event);
    9. event_base_loop($base);
    10.  
    11. function ev_accept($socket, $flag, $base)
    12. {
    13. $connection = stream_socket_accept($socket);
    14. stream_set_blocking($connection, 0);
    15.  
    16. $buffer = event_buffer_new($connection, 'ev_read', NULL, 'ev_error', $connection);
    17. event_buffer_base_set($buffer, $base);
    18. event_buffer_timeout_set($buffer, 30, 30);
    19. event_buffer_watermark_set($buffer, EV_READ, 0, 0xffffff);
    20. event_buffer_priority_set($buffer, 10);
    21. event_buffer_enable($buffer, EV_READ | EV_PERSIST);
    22.  
    23. $GLOBALS['_'] = $buffer; //这个buffer一定要赋给个全局的变量 貌似是传值过程中的bug 或者5.3.8的闭包还是有问题?
    24. }
    25.  
    26. function ev_error($buffer, $error, $connection)
    27. {
    28. event_buffer_disable($buffer, EV_READ | EV_WRITE);
    29. event_buffer_free($buffer);
    30. fclose($connection);
    31. }
    32.  
    33. function ev_read($buffer, $connection)
    34. {
    35. while ($read = event_buffer_read($buffer, 256)) {
    36.  
    37. }
    38. fwrite($connection , date('Y-m-d H:i:s'));
    39. ev_error($buffer , '' , $connection);
    40. }


    参考资料:

  • 相关阅读:
    C# 从服务器下载文件
    不能使用联机NuGet 程序包
    NPOI之Excel——合并单元格、设置样式、输入公式
    jquery hover事件中 fadeIn和fadeOut 效果不能及时停止
    UVA 10519 !! Really Strange !!
    UVA 10359 Tiling
    UVA 10940 Throwing cards away II
    UVA 10079 Pizze Cutting
    UVA 763 Fibinary Numbers
    UVA 10229 Modular Fibonacci
  • 原文地址:https://www.cnblogs.com/mimime/p/5450117.html
Copyright © 2011-2022 走看看