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 (编辑:应用网_常德站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐