本文章于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个进程,主进程负责接收输入信息,发送到网络。另一个进程,接收网络信息,显示在屏幕上。
相关推荐
全部C代码,linux下的线程池和libevent配合实现的高并发tcp服务器,tcp通讯采用分帧的方式发包,帧包含帧头和数据部分,使用libevent的bufferevent方式来实现的帧提取,可直接使用GCC来编译。还配套有一个C#写的...
基于libevent的视频服务器源代码,可以实现简单的流转发功能,仅供参考.
这是一个使用libevent实现的web服务器,客户端采用CInternetSession来实现的,是一个完整的可用的例子,项目采用cmake来管理。提供给大家参考,有问题可以邮件给buptxu@qq.com,多谢。
linux下的线程池和libevent配合实现的高并发tcp服务器,tcp通讯采用分帧的方式发包,帧包含帧头和数据部分,使用libevent的bufferevent方式来实现的帧提取。还配套有一个C#写的客户端测试程序。
基于libevent实现的网络穿透,以及数据处理。可以处理外部的LUA脚本。
evpp是一个基于libevent开发的现代化C 11高性能网络服务器,自带TCP/UDP/HTTP等协议的异步非阻塞式的服务器和客户端库。
一个基于C++的Tcp异步服务器,CentOS7 + MariaDB + libevent
采用Libevent库实现的简单的流媒体转发服务器. 功能:转发任意一个DVR的一路海康视频. 使用: 服务端:在startServer.bat 里修改DVR参数,第一个为DVRIP ,第二个是端口号,第三个是第几路. 客户端:start.bat,只要在最后...
关于异步程序开与与 libevent 的使用。
1.基于libevent实现relay服务器。2.基于libevent实现relay客户端
C语言基于libevent的跨平台http服务器
VS2015编译后的libevent头文件和库文件——基于libevent-2.1.10
基于libevent实现的服务器,不断完善中,支持linux和windows平台。 标签:SmartServer
课程分享——百万级高并发WebRTC流媒体服务器设计与开发课程,附源码,完整视频课程下载。 本课就将围绕与浏览器互通、级联、可扩展等6大痛点手把手带你学习大负载、高并发、高性能 WebRTC 流媒体服务器的设计与...
运用libevent进行视频服务器开发源代码
一个基于 Libevent 和 protobuf的C++服务器框架 采用面向对象的思想将libevent2.0.22封装为c++,消息通过protobuf进行消息序列号和反序列化 有mysql数据库读写方法。 附带一个客户端能够直接链接,有文件传输和消息...
基于libevent的tcp server开发环境的完整工程
libevent 是轻量级的开源高性能事件通知库,支持多种 I/O 多路复用技术,内部使用select、epoll、kqueue、IOCP等系统调用管理事件机制。 支持超时事件、持久事件, I/O事件,定时器和信号等事件,支持注册事件优先级...
基于libevent 2.1.18固件制作的vs2017最简洁工程,适合要使用libevent进行windows下服务器应用开发的技术人员使用。
libevent,多线程,client,serverlibevent多线程, 参考mariotcp 参考http://blog.csdn.net/i_am_jojo/article/details/7587838流程图