使用PHP怎样写一个多进程服务器?
Admin 2021-05-12 群英技术资讯 758 次浏览
使用PHP怎样写一个多进程服务器?很多新手对于如何多进程服务器比较感兴趣,因此下面给大家分享一个实现简单多进程服务器的实例,大家可以参考看看,希望对大家了解多进程服务器的实现有帮助。
php写的一个简单的多进程服务器。
<?php
class server
{
public $port;
public $ip;
protected $server;
public function __construct($ip = '0.0.0.0', $port)
{
$this->ip = $ip;
$this->port = $port;
$this->createSocket(); //创建一个通讯节点
}
public function listen($callback)
{
if(!is_callable($callback)){
throw new Exception('不是闭包,请传递正确的参数');
}
//只要我们接收到客户端的数据,就fork一个子进程处理
while ($client = socket_accept($this->server)) { //等待客户端接入,返回的是客户端的连接
$buf = socket_read($client, 1024); //读取客户端内容
$pid=pcntl_fork(); //创建子进程
//父进程和子进程都会执行下面代码
if ($pid == -1) {
//错误处理:创建子进程失败时返回-1.
die('could not fork');
} else if ($pid) {
//父进程会得到子进程号,所以这里是父进程执行的逻辑
var_dump('父进程',$pid);
pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
//子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
//睡眠
if($this->checkRule("/sleep/i",$buf)){
sleep(10);
$this->response('休眠10S',$client);
socket_close($client);
return;
}
//请求过滤
if(empty($this->checkRule("/GET\s(.*?)\sHTTP\/1.1/i",$buf))){
socket_close($client);
return;
}
//响应
$response= call_user_func($callback,$buf); //回调$callback函数
$this->response($response,$client);
usleep(1000); //微妙为单位,1000000 微妙等于1秒
socket_close($client);
exit(); //直接退出
}
}
// while (true) {
// $client = socket_accept($this->server); //等待客户端接入,返回的是客户端的连接
// $buf = socket_read($client, 1024); //读取客户端内容
//
// //睡眠
// if($this->checkRule("/sleep/i",$buf)){
// sleep(10);
// $this->response('休眠10S',$client);
// socket_close($client);
// return;
// }
// //请求过滤
// if(empty($this->checkRule("/GET\s(.*?)\sHTTP\/1.1/i",$buf))){
// socket_close($client);
// return;
// }
//
// //响应
// $response= call_user_func($callback,$buf); //回调$callback函数
// $this->response($response,$client);
// usleep(1000); //微妙为单位,1000000 微妙等于1秒
// socket_close($client);
//
// }
socket_close($this->server);
}
//io 复用
//epoll 模型
//多进程
protected function createSocket()
{
$this->server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//bind
socket_set_option($this->server, SOL_SOCKET, SO_REUSEADDR, 1); //复用还处于 TIME_WAIT
socket_bind($this->server, $this->ip, $this->port); //细节性的处理自行完成
socket_listen($this->server); //开始监听
}
/**
* 协议过滤
* @param $reg
* @param $buf
* @return mixed
*/
protected function checkRule($reg,$buf){
if(preg_match($reg,$buf,$matchs)){
return $matchs;
}
return false;
}
//请求处理类
public function request($buf){
//1.只允许http协议访问
// if(preg_match("GET\s(.*?)\sHTTP/1.1",$buf,$matchs)){ //匹配到http协议
// return true;
// }else{
// return false;
// }
//2.过滤掉/favicon.ico
//3.获取请求信息
}
protected function response($content,$client){
//返回数据给客户端,响应处理
$string="HTTP/1.1 200 OK\r\n";
$string.="Content-Type: text/html;charset=utf-8\r\n";
$string.="Content-Length: ".strlen($content)."\r\n\r\n";
socket_write($client,$string.$content);
}
}
关于php如何实现多进程服务器就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识,想要了解更多PHP使用技巧大家可以关注其他文章。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
workerman效率高。workerman完全使用PHP开发,使用workerman开发的应用程序不依赖php-fpm、apache、nginx这些容器就可以独立运行。 这使得PHP开发者开发、部署、调试应用程序非常方便。
一、总结1、php的全局变量:php的全局变量和C++,Java的全局变量不一样2、页面嵌套php:我在html页面中嵌套php代码的时候,php的全局变量好像和C++,Java的全局变量一样,好像是,记不清了3、php全局变量使用:php全局变量用global定义一下就好,就在外面定义global是错的,必须在函数内声明4、global定义全局变量:global定义全局变量的时候,不能一
这篇文章带你探究一下在php中什么为什么运算符===比==要快,文章中给大家介绍的非常详细,对大家的学习或工作都具有一定的参考价值
所有php里面的值都可以使用函数 serialize()来返回一个包含字节流的字符串来表示。 unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
在本篇文章里小编给大家整理的是一篇关于php png失真的原因及解决办法,有需要的朋友们可以跟着学习参考下。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008