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返回的新文件描述符) 系统内创建进程 ...
 
随机推荐
- jenkins 入门教程(上)
			
jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java, ...
 - CentOS 7.1, 7.2 下安装dotnet core
			
.NET CORE的官方(http://dotnet.github.io/getting-started/)只提供了Windows, Ubuntu14.04, 及Docker(也是基于Ubuntu14 ...
 - Sqoop2搭建及使用
			
1. 下载并安装配置Sqoop [需要的环境:Hadoop,Java] 首先 Hadoop版本2.7.2 20161013 找了篇Sqoop的文章就开撸 结果发现什么1.3,1.9,又有什么Sqo ...
 - phpexcel导入数据提示失败
			
phpexcel导入excel时明明只有几行数据,却提示506行失败,原来是excel中有506行"无效数据"(看起来是空的,但是和没有数据不一样).
 - android 性能优化-电量篇
			
消耗电量的几个主要原因.功能:1.大数据量的网络传输(网络)2.不停的网络切换(网络)3.解析大量的数据(CPU) 关于网络方面的优化: .网络请求之前,检查网络连接.没有网络连接不进行请求 .判断网 ...
 - php提供更快的文件下载
			
在微博上偶然看到一篇介绍php更快下载文件的方法,其实就是利用web服务器的xsendfile特性,鸟哥的博客中只说了apache的实现方式,我找到了介绍nginx实现方式的文章,整理一下! let' ...
 - Java类中各种静态变量的加载顺序的学习
			
最近在补<thinking in java>...有一节提到了加载类需要做的一些准备...我照着书本敲了一下代码...同时稍微修改了一下书本上的代码.... package charpte ...
 - DirectX SDK
			
http://blog.csdn.net/c4501srsy/article/details/17403927 http://blog.csdn.net/yy649487394/article/det ...
 - Javascript 俄罗斯方块 游戏代码解释!
			
俄罗斯方块代码说明 /** 名称:Javascript 俄罗斯方块! 作者:Gloot 邮箱:glootz@gmail.com QQ:345268267 网站:http://www.cnblogs.c ...
 - Android之layout_weight解析
			
我们先来看以下这段Android布局代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi ...