PHP写的异步高并发服务器,基于libevent
本文章于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/检出
- <?php
- require 'TCPServer.php';
- class MyServer extends TCPServer
- {
- function onRecive($client_id,$data)
- {
- $data = trim($data);
- if($data=="quit")
- {
- $this->close($client_id);
- return true;
- }
- elseif($data=='shutdown')
- {
- $this->shutdown();
- }
- else
- {
- $client_socket_name = stream_socket_get_name($this->client_sock[$client_id],true);
- echo "Server send response data to client $client_socket_name\n";
- $send = date('Y-m-d H:i:s')."$client_socket_name said:$data\n";
- $this->sendAll($client_id,$send);
- }
- }
- /**
- * 发送到所有客户端
- * @param $data
- * @return unknown_type
- */
- function sendAll($client_id,$data)
- {
- foreach($this->client_sock as $k=>$sock)
- {
- if($k==$client_id) continue;
- fwrite($sock,$data);
- }
- }
- /**
- * 发送到某个客户端
- * @param $client_id
- * @param $data
- * @return unknown_type
- */
- function sendTo($client_id,$data)
- {
- fwrite($this->client_sock[$client_id],$data);
- }
- function onStart()
- {
- echo "Server in running!\n";
- }
- function onConnect($client_id)
- {
- $this->sendAll($client_id,"Client $client_id is connected!\n");
- }
- function onClose($client_id)
- {
- $this->sendAll($client_id,"Client $client_id is closed!\n");
- }
- function onShutdown()
- {
- echo "Server in stop!\n";
- }
- }
- $server = new MyServer('0.0.0.0',8005);
- $server->run();
客户端程序
- <?php
- class Stdio
- {
- static $in;
- static $out;
- static $buffer_size = 1024;
- static function input($h='')
- {
- if(!self::$in) self::$in = fopen('php://stdin','r');
- if($h) self::output($h);
- return trim(fread(self::$in,self::$buffer_size));
- }
- static function output($string)
- {
- if(!self::$out) self::$out = fopen('php://stdout','w');
- return fwrite(self::$out,$string);
- }
- }
- $fp = stream_socket_client('tcp://127.0.0.1:8005',$errno, $errstr);
- $socket = serialize($fp);
- if(!$fp)
- {
- echo "ERROR: $errno - $errstr<br />\n";
- }
- else
- {
- $pid = pcntl_fork();
- if($pid==-1)
- {
- exit("fork fail!\n");
- }
- //child
- elseif($pid==0)
- {
- var_dump($socket);
- $fp2 = unserialize($socket);
- while(!feof($fp2))
- {
- Stdio::output(fgets($fp2, 1024));
- }
- }
- //parent
- else
- {
- while($string!=="quit")
- {
- if(!is_writable($fp)) break;
- $string = Stdio::input("qq#");
- fwrite($fp,$string);
- }
- posix_kill($pid, 9);
- }
- fclose($fp);
- }
php tcpserver.php 运行服务器程序
php tcpclient.php 运行客户端程序,客户端有2个进程,主进程负责接收输入信息,发送到网络。另一个进程,接收网络信息,显示在屏幕上。
PHP写的异步高并发服务器,基于libevent的更多相关文章
- JAVA NIO non-blocking模式实现高并发服务器(转)
原文链接:JAVA NIO non-blocking模式实现高并发服务器 Java自1.4以后,加入了新IO特性,NIO. 号称new IO. NIO带来了non-blocking特性. 这篇文章主要 ...
- 第15章 高并发服务器编程(2)_I/O多路复用
3. I/O多路复用:select函数 3.1 I/O多路复用简介 (1)通信领域的时分多路复用 (2)I/O多路复用(I/O multiplexing) ①同一线程,通过“拨开关”方式,来同时处理多 ...
- JAVA NIO non-blocking模式实现高并发服务器
JAVA NIO non-blocking模式实现高并发服务器 分类: JAVA NIO2014-04-14 11:12 1912人阅读 评论(0) 收藏 举报 目录(?)[+] Java自1.4以后 ...
- linux学习之高并发服务器篇(二)
高并发服务器 1.线程池并发服务器 两种模型: 预先创建阻塞于accept多线程,使用互斥锁上锁保护accept(减少了每次创建线程的开销) 预先创建多线程,由主线程调用accept 线程池 3.多路 ...
- 第15章 高并发服务器编程(1)_非阻塞I/O模型
1. 高性能I/O (1)通常,recv函数没有数据可用时会阻塞等待.同样,当socket发送缓冲区没有足够多空间来发送消息时,函数send会阻塞. (2)当socket在非阻塞模式下,这些函数不会阻 ...
- Linux + C + Epoll实现高并发服务器(线程池 + 数据库连接池)(转)
转自:http://blog.csdn.net/wuyuxing24/article/details/48758927 一, 背景 先说下我要实现的功能,server端一直在linux平台下面跑,当客 ...
- 高并发服务器建议调小 TCP 协议的 time_wait 超时时间。
1. [推荐]高并发服务器建议调小 TCP 协议的 time_wait 超时时间. 说明:操作系统默认 240 秒后,才会关闭处于 time_wait 状态的连接,在高并发访问下,服 务器端会因为处于 ...
- 为一个支持GPRS的硬件设备搭建一台高并发服务器用什么开发比较容易?
高并发服务器开发,硬件socket发送数据至服务器,服务器对数据进行判断,需要实现心跳以保持长连接. 同时还要接收另外一台服务器的消支付成功消息,接收到消息后控制硬件执行操作. 查了一些资料,java ...
- linux学习之多高并发服务器篇(一)
高并发服务器 高并发服务器 并发服务器开发 1.多进程并发服务器 使用多进程并发服务器时要考虑以下几点: 父最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符) 系统内创建进程 ...
随机推荐
- EEGLAB数据分析:预处理与后续处理
来源:http://blog.sina.com.cn/s/blog_13171a73d0102v4zx.html 数据预处理主要包括数据导入.电极定位.电极返回.滤波.去除伪迹.重建参考.分段.叠加平 ...
- codevs 2928 你缺什么
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 继"你幸福吗"之后,央视又推出了"你缺什么 ...
- Dell xps 13 9350待机时总是关机的处理方法
现象: 年初买的dell xps13 9350,最近可能是由于win10做了一些更新,每次睡眠就自动关机了,重启很多次,修改电源选项都没用, 原因分析: 在网上搜了一下,有人发现xps15 9350也 ...
- ASP.NET中的缓存机制
ASP.NET 提供一个功能完整的缓存引擎,页面可使用该引擎通过 HTTP 请求存储和检索任意对象.缓存的生存期与应用程序的生存期相同,也就是说,当应用程序重新启动时,将重新创建缓存. 将数据添加到缓 ...
- 解决 PHPExcel 长数字串显示为科学计数
解决 PHPExcel 长数字串显示为科学计数 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号. ...
- 常见排序java实现
public class Sort { public static void main(String[] args) { int[] data = {49,38,65,97,76,13,27,49}; ...
- 解决:Microsoft Office Word已停止工作
1/按组合键WIN+R打开运行对话框 2/在打开框中键入%USERPROFILE%\AppData\Roaming\Microsoft\Templates,单击“确定”按钮 3/在打开的窗口鼠标右键删 ...
- Map工具系列-06-销售营改增历史数据处理工具
所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...
- Java中 NIO与IO的区别
当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...
- input file控件限制上传文件类型
网页上添加一个input file HTML控件: <input id="File1" type="file" /> 默认是这样的,所有文件类型都会 ...