Socket学习 - 多进程补充
来源:互联网 发布:java jar包运行 编辑:程序博客网 时间:2024/05/19 13:43
单进程
要学习socket多进程,先来看看什么是单进程。
服务端server.php代码如下:
<?php$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);socket_bind($socket,'10.211.55.13',9090) or die('error');socket_listen($socket,5);while(true){ $client = socket_accept($socket); // 有人打电话进来 $buf = socket_read($client,1024); // 一次读取1024的长度 echo $buf; if(preg_match('/sleep/i',$buf)){ sleep(10); $html = 'HTTP/1.1 200 OK'.PHP_EOL .'Content-Type: text/html;charset=utf-8'.PHP_EOL.PHP_EOL; socket_write($client,$html); socket_write($client,'this is server,休克了10秒,模拟很繁忙的样子'); }else{ socket_write($client,'this is server'); } socket_close($client);}socket_close($socket);
代码解释,上面代码中我们做了一个判断,如果请求的地址中有sleep
关键字,就『休克』10秒,来模拟单进程处理繁忙的状态。
我们可以想象:当我们直接在浏览器中请求http://10.211.55.13:9090/
,会马上给我们返回this is server
内容,而当我们请求http://10.211.55.13:9090/?sleep
,浏览器则会等待10秒,才返回this is server,休克了10秒,模拟很繁忙的样子
。
从上面动图可以看出:一个请求”卡住了”,另外一个请求也进入”等等状态”,这就是单进程的缺陷。
我们通过Linux命令查看也只有一个进程在执行server.php
ps -ef |grep server.php
或者根据占用的9090端口查看进程:
netstat -anp | grep 9090
多进程
php的socket多进程,是需要安装一个名为pcntl
扩展的,安装方法请自行百度。
执行:
php -m #查看安装的php扩展
关于php多进程的资料:
http://php.net/manual/zh/book.pcntl.php
http://php.net/manual/zh/function.pcntl-fork.php
下面是我们改造后的服务端server.php的代码:
<?php$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);socket_bind($socket,'10.211.55.13',9090) or die('error');socket_listen($socket,5);while(true){ $client = socket_accept($socket); //创建紫金城 $pid = pcntl_fork(); //父进程和子进程都会执行下面代码 if ($pid == -1) { //错误处理:创建子进程失败时返回-1. die('could not fork'); } else if ($pid) { //父进程会得到子进程号,所以这里是父进程执行的逻辑 //pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。 socket_close($client); } else { //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。 $buf = socket_read($client,1024); echo $buf; if(preg_match('/sleep/i',$buf)){ sleep(10); $html = 'HTTP/1.1 200 OK'.PHP_EOL .'Content-Type: text/html;charset=utf-8'.PHP_EOL.PHP_EOL; socket_write($client,$html); socket_write($client,'this is server,休克了10秒,模拟很繁忙的样子'); }else{ socket_write($client,'this is server'); } socket_close($client); }}socket_close($socket);
从上面动图可以看出:浏览器多个请求,并没有发生”卡住了”的现象。
使用命令查看进程数,果然不是只有一个了。
0 0
- Socket学习 - 多进程补充
- Socket学习 - PHP+Socket多进程处理请求学习
- [+补充]多进程及多线程
- Socket 补充
- Socket学习 - php+Socket多进程处理速学:防止子进程无限增加
- Linux socket编程学习初步(4)--服务器端多进程
- [电脑]_Ubuntu学习进程(记录博文,定期补充)
- 多进程socket编程示例
- socket多进程TCP通信
- socket--多进程,多线程服务器
- socket编程补充---一个服务器多个客户端
- Unix网络编程学习日记(三):多进程全双工socket客户端的实现
- C++内存和进程,线程学习补充(内存泄漏,信号量)
- 多进程 socket exit的问题
- PHP多进程协作编程之-socket
- linux socket多进程并发服务器
- 一个进程控制多个socket
- 多进程服务端实现-共享socket
- Spring中的AOP底层实现原理
- InputStream与OutputStream的比较
- C++二维数组
- 循环体变量利用的小技巧
- 公网服务器被AnXqV程序入侵,CPU跑满解决办法
- Socket学习 - 多进程补充
- mysql初入
- 基于ROS平台的移动机器人-1-小车底盘的搭建
- SQL调优
- think in java interview-高级开发人员面试宝典(七)
- HBase 默认配置说明(收藏版) http://www.aboutyun.com/thread-7914-1-1.html (出处: about云开发)
- 我的学习笔记-->String类和StringBuffer类的区别
- 设计模式--6.装饰模式
- 直接插入排序