本文章于2013年11月修改。

swoole已使用C重写作为PHP扩展来运行。项目地址:https://github.com/matyhtf/swoole

swoole提供了PHP的高性能Server,异步IO,AsyncMySQL等特性。

原PHP代码框架迁移至https://github.com/matyhtf/swoole_framework。保留原有代码和web框架。

--------------------------------------------------------------------------------------------------

Swoole Socket网络开发框架,是基于php的libevent和pcntl模块的,并且只能用于Linux/Unix系统下。请先启用pcntl,安装libevent扩展。

pcntl:PHP核心模块已包含了pcntl,只需在编译时加入--enable-pcntl即可,当然也可以用extension扩展

libevent:http://pecl.php.net/package/libevent

编写的类需要继承自TCPServer类,在SwooleSocket包中。目前只提供了单进程异步事件模型,适合用于IO耗时较少的网络服务器程序,比如聊天室。多进程异步模型,多进程同步模型,会在近期提供。基类的代码,请从http://code.google.com/p/swoole/检出

  1. <?php
  2. require 'TCPServer.php';
  3. class MyServer extends TCPServer
  4. {
  5. function onRecive($client_id,$data)
  6. {
  7. $data = trim($data);
  8. if($data=="quit")
  9. {
  10. $this->close($client_id);
  11. return true;
  12. }
  13. elseif($data=='shutdown')
  14. {
  15. $this->shutdown();
  16. }
  17. else
  18. {
  19. $client_socket_name =  stream_socket_get_name($this->client_sock[$client_id],true);
  20. echo "Server send response data to client $client_socket_name\n";
  21. $send = date('Y-m-d H:i:s')."$client_socket_name said:$data\n";
  22. $this->sendAll($client_id,$send);
  23. }
  24. }
  25. /**
  26. * 发送到所有客户端
  27. * @param $data
  28. * @return unknown_type
  29. */
  30. function sendAll($client_id,$data)
  31. {
  32. foreach($this->client_sock as $k=>$sock)
  33. {
  34. if($k==$client_id) continue;
  35. fwrite($sock,$data);
  36. }
  37. }
  38. /**
  39. * 发送到某个客户端
  40. * @param $client_id
  41. * @param $data
  42. * @return unknown_type
  43. */
  44. function sendTo($client_id,$data)
  45. {
  46. fwrite($this->client_sock[$client_id],$data);
  47. }
  48. function onStart()
  49. {
  50. echo "Server in running!\n";
  51. }
  52. function onConnect($client_id)
  53. {
  54. $this->sendAll($client_id,"Client $client_id is connected!\n");
  55. }
  56. function onClose($client_id)
  57. {
  58. $this->sendAll($client_id,"Client $client_id is closed!\n");
  59. }
  60. function onShutdown()
  61. {
  62. echo "Server in stop!\n";
  63. }
  64. }
  65. $server = new MyServer('0.0.0.0',8005);
  66. $server->run();

客户端程序

  1. <?php
  2. class Stdio
  3. {
  4. static $in;
  5. static $out;
  6. static $buffer_size = 1024;
  7. static function input($h='')
  8. {
  9. if(!self::$in) self::$in = fopen('php://stdin','r');
  10. if($h) self::output($h);
  11. return trim(fread(self::$in,self::$buffer_size));
  12. }
  13. static function output($string)
  14. {
  15. if(!self::$out) self::$out = fopen('php://stdout','w');
  16. return fwrite(self::$out,$string);
  17. }
  18. }
  19. $fp = stream_socket_client('tcp://127.0.0.1:8005',$errno, $errstr);
  20. $socket = serialize($fp);
  21. if(!$fp)
  22. {
  23. echo "ERROR: $errno - $errstr<br />\n";
  24. }
  25. else
  26. {
  27. $pid = pcntl_fork();
  28. if($pid==-1)
  29. {
  30. exit("fork fail!\n");
  31. }
  32. //child
  33. elseif($pid==0)
  34. {
  35. var_dump($socket);
  36. $fp2 = unserialize($socket);
  37. while(!feof($fp2))
  38. {
  39. Stdio::output(fgets($fp2, 1024));
  40. }
  41. }
  42. //parent
  43. else
  44. {
  45. while($string!=="quit")
  46. {
  47. if(!is_writable($fp)) break;
  48. $string = Stdio::input("qq#");
  49. fwrite($fp,$string);
  50. }
  51. posix_kill($pid, 9);
  52. }
  53. fclose($fp);
  54. }

php tcpserver.php 运行服务器程序

php tcpclient.php 运行客户端程序,客户端有2个进程,主进程负责接收输入信息,发送到网络。另一个进程,接收网络信息,显示在屏幕上。

PHP写的异步高并发服务器,基于libevent的更多相关文章

  1. JAVA NIO non-blocking模式实现高并发服务器(转)

    原文链接:JAVA NIO non-blocking模式实现高并发服务器 Java自1.4以后,加入了新IO特性,NIO. 号称new IO. NIO带来了non-blocking特性. 这篇文章主要 ...

  2. 第15章 高并发服务器编程(2)_I/O多路复用

    3. I/O多路复用:select函数 3.1 I/O多路复用简介 (1)通信领域的时分多路复用 (2)I/O多路复用(I/O multiplexing) ①同一线程,通过“拨开关”方式,来同时处理多 ...

  3. JAVA NIO non-blocking模式实现高并发服务器

    JAVA NIO non-blocking模式实现高并发服务器 分类: JAVA NIO2014-04-14 11:12 1912人阅读 评论(0) 收藏 举报 目录(?)[+] Java自1.4以后 ...

  4. linux学习之高并发服务器篇(二)

    高并发服务器 1.线程池并发服务器 两种模型: 预先创建阻塞于accept多线程,使用互斥锁上锁保护accept(减少了每次创建线程的开销) 预先创建多线程,由主线程调用accept 线程池 3.多路 ...

  5. 第15章 高并发服务器编程(1)_非阻塞I/O模型

    1. 高性能I/O (1)通常,recv函数没有数据可用时会阻塞等待.同样,当socket发送缓冲区没有足够多空间来发送消息时,函数send会阻塞. (2)当socket在非阻塞模式下,这些函数不会阻 ...

  6. Linux + C + Epoll实现高并发服务器(线程池 + 数据库连接池)(转)

    转自:http://blog.csdn.net/wuyuxing24/article/details/48758927 一, 背景 先说下我要实现的功能,server端一直在linux平台下面跑,当客 ...

  7. 高并发服务器建议调小 TCP 协议的 time_wait 超时时间。

    1. [推荐]高并发服务器建议调小 TCP 协议的 time_wait 超时时间. 说明:操作系统默认 240 秒后,才会关闭处于 time_wait 状态的连接,在高并发访问下,服 务器端会因为处于 ...

  8. 为一个支持GPRS的硬件设备搭建一台高并发服务器用什么开发比较容易?

    高并发服务器开发,硬件socket发送数据至服务器,服务器对数据进行判断,需要实现心跳以保持长连接. 同时还要接收另外一台服务器的消支付成功消息,接收到消息后控制硬件执行操作. 查了一些资料,java ...

  9. linux学习之多高并发服务器篇(一)

    高并发服务器 高并发服务器 并发服务器开发 1.多进程并发服务器 使用多进程并发服务器时要考虑以下几点: 父最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符) 系统内创建进程 ...

随机推荐

  1. .jshintrc配置

    在root目录创建一个.jshintrc文件插入下面的代码即可.也可以自行配置. { // // 强制选项 // // When set to true, these options will mak ...

  2. 种子填充算法描述及C++代码实现

    项目需要看了种子填充算法,改进了算法主要去除面积小的部分.种子填充算法分为两种,简单的和基于扫描线的方法,简单的算法如下描述(笔者针对的是二值图像): (1)从上到下,从左到有,依次扫描每个像素: ( ...

  3. 如何在Excel中通过VBA快速查找多列重复的值

    今天项目组的一个同事问我如何快速的找到一个Excel中第3列和第5列的值完全重复的值,我想了想虽然Excel中自带查找重复值的功能,但是好像只能对同一列进行比较,所以就写了一个VBA进行处理,VBA非 ...

  4. CSS备忘录

    1, 浮动框(float)会使得元素脱离文档流, 因此不占用文档空间; 因此当一个Div的子元素都为float时会导致该Div高度为0, 这一问题称为"高度塌陷" 为了解决这个问题 ...

  5. 教你一招:根据身份证号计算出生年月和年龄 text函数和mid函数混用 datedif函数和today函数混用

    在电子表格Excel中,使用text函数和mid函数混用,根据身份证号计算出生年月: =text(mid(A2,,),"0!/00!/00") #0!/00!/00 为日期的格式# ...

  6. hihoCoder 后缀自动机三·重复旋律6

    后缀自动机三·重复旋律6 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi ...

  7. HCTF时PHP WAF然有RLFI漏洞

    tips:from菜鸡队长 这次去打HCTF决赛,用了这个自己写的WAF,web基本上没被打,被打的漏洞是文件包含漏洞,这个功能在本人这个waf里确实很是捉急,由于只是简单检测了..和php[35]{ ...

  8. RabbitMQ 参数们的Power “续”

    参数中的 arguments 之前讲参数的一些作用的时候,忽略了最后一个字典类型的参数,因为这个参数是大有文章的,值得单独进出来说道说道. 这时,就不得不打开我们的 Web UI管理系统了,可以看到在 ...

  9. 移动端设置-----rem

    对于现在不同尺寸的移动端屏幕,如果设置px来说实在有点影响用户体验,在小屏幕上太大,大屏幕上太小,不能实现响应式,所以就引进了rem的概念. rem是相对于根元素<html> 在我的项目中 ...

  10. poj1006Biorhythms(同余定理)

    转自:http://blog.csdn.net/dongfengkuayue/article/details/6461298 本文转自head for better博客,版权归其所有,代码系本人自己编 ...