先说一下网络要求并发
理论描述
假设有一个client,程序逻辑是要要求三个不同的server,处理各自的相应。传统模型当然是顺序实行,先发送第一个要求,等待收到相应数据后再发送第二个要求,以此类推。就像是单核CPU,一次只能处理一件事,其他事情被暂时壅塞。而并发模式可以让三个server同时处理各自要求,这就可以使大量韶光复用。
画个图更好解释问题:
前者为壅塞模式,忽略要求相应等韶光,总耗时为700ms;而后者非壅塞模式,由于三个要求可以同时得到处理,总耗时只有300ms。
代码实现
几点解释:
1、利用stream_socket_client函数链接要求做事器和端口(简便起见这里利用同一地址localhost)。这里不受限于http协议,可广泛用于所有TCP/IP协议。详细内容请参考手册。
2、这里链接成功后通过发送各自http头信息来获取不同相应(这里利用网站根目录下的test.php做做事端)。
3、发送header前须要个眇小的延迟,代码中已经做了注释。
CLI模式运行结果:
多运行几次会创造,三次要求结束顺序是无序的。该demo太过大略导致全体过程一秒内已完成,但可以针对三次不同要求做相应延迟,来看出非壅塞时时间复用的效果。
下面再大概说下本地并发与PHP多进程编程与实例
本地并发只能通过措辞自己的特性在程序本身实现多任务效果,一样平常来说现在的措辞会通过多线程或多进程的办法来实现。由于PHP不支持多线程,目前只能采取多进程办法,让操作系统来帮助实现本地并发。
至于代码实现,可以通过pcntl扩展(封装fork等进程掌握函数,和C措辞中利用非常相似,windows下不可用)、 proc_open、popen等办法,方法不止一种,
场景:日常任务中,有时须要通过php脚本实行一些日志剖析,行列步队处理等任务,当数据量比较大时,可以利用多进程来处理。
准备:php多进程须要pcntl,posix扩展支持,可以通过 php - m 查看,没安装的话须要重新编译php,加上参数--enable-pcntl,posix一样平常默认会有。
创建子进程的函数fork
pcntl_fork — 在当提高程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下连续实行,不同的是父进程实行过程中,得到的fork返回值为子进程号,而子进程得到的是0。
一个fork子进程的根本示例:
如果一个任务被分解成多个进程实行,就会减少整体的耗时。
比如有一个比较大的数据文件要处理,这个文件由很多行组成。如果单进程实行要处理的任务,量很大时要耗时比较久。这时可以考虑多进程。
多进程处理分解任务,每个进程处理文件的一部分,这样须要均分割一下这个大文件成多个小文件(进程数和小文件的个数等同就可以)。
比如该文件file.log有10万行数据,现在想分4个进程处理。须要分割2.5万行一个文件。命令split可以做到。
split的用法比较大略,可以man split查看下手册。
-l是按照行分割,-d是分割后的文件名按照数字,-a是分割后的文件个数位数(默认是2,做多便是99个;比如超过100个,-a可以写3)。自己考试测验分割一下就知道了。
处理代码: