设为首页 收藏本站
查看: 691|回复: 0

[经验分享] PHP写的异步高并发服务器,基于libevent

[复制链接]

尚未签到

发表于 2017-4-5 09:58:21 | 显示全部楼层 |阅读模式
  本文章于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个进程,主进程负责接收输入信息,发送到网络。另一个进程,接收网络信息,显示在屏幕上。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-360410-1-1.html 上篇帖子: PHP has encountered an Access Violation解决方法总结 下篇帖子: 如何在虚拟主机上安装PHP的PEAR
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表