加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_常德站长网 (https://www.0736zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php真的有多进程,多线程吗?

发布时间:2022-10-24 11:29:56 所属栏目:PHP教程 来源:
导读:  刚接触php的时候,就看到过php不支持多进程的,多线程,但是php可以利用其他的东西来实现伪多进程,多线程,例如:fsockopen实际是利用socket的多线程,popen,pcntl_fork,proc_open利用httpd多进程功能的外衣。
  刚接触php的时候,就看到过php不支持多进程的,多线程,但是php可以利用其他的东西来实现伪多进程,多线程,例如:fsockopen实际是利用socket的多线程,popen,pcntl_fork,proc_open利用httpd多进程功能的外衣。下面就一些实践过程,以及这种多进程的效果,到底如何。
 
  一,php利用socket来实现多线程
 
  在服务器端有一个程序,与多个客户端程序通讯,其中主线程有一个socket绑定在一个固定端口上,负责监听客户端的 Socket信息。每当启动一个客户端程序,客户端发送来一个socket连接请求,server端就新开启一个线程,并在其中创建一个socket与该 客户端的socket通讯,直到客户端程序关闭,结束该线程。
 
  根据socket的这种特性php单线程,写了一小段代码,并且记录下每次连接socket的时间,以及不通过socket来,记录执行时间,我的本意是,如果php真的能实现多线程的话,socket.log和nosocket.log里面记录的时间是相同的。我用压力测试工具测试一下,这样做是为了尽量做到并发,这样log出现相同的时间可能性更大。
 
  [zhangy@BlackGhost ~]$ /usr/local/bin/webbench -c 10 -t 5
 
  我查看一下二个log文件里面根本没有相同的,感觉好像是错开的。后来我仔细想了想,访问socket.php这个页面时,里面还是通过php来执行程序,所以根本不可能向几个线程同时,发送请求,肯定有先,有后。
 
  二,pcntl_fork利用httpd来实现多进程
 
  开始的时候,我并不知道pcntl_fork是怎么利用什么来实现多进程的,无意中发现他是增加了httpd的进程数来实现多进程的。我汗。举例说明
 
  ";
  if ($pid == -1) {
   throw new Exception('could not fork');
  } else if ($pid) {
   //we are the parent
   echo 'Forked successfully';
   flush();
  //??? posix_kill(posix_getpid(), SIGTERM);
   exit;
  } else {
  //??? posix_kill(posix_getpid(), SIGTERM);
   exit;
  }
  ?>
  1,启动一下你的apache然后执行一下以下这个命令:
 
  [root@BlackGhost pcntl]# ps -e|grep httpd |wc -l
 

(编辑:应用网_常德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!