模拟一个多进程的场景:
仿照我们需要把几个网站的内容获取过来,最快的多进程获取方式:
如:我们需要百度、360、腾讯、新浪、csdn、163首页内容。
解决思路:
按照传统的思想,通过file_get_contents() 循环执行,我做了一个测试,获取百度大概消耗了6s多把网站获取完成,也就是这么执行下来大概6*(6秒+) 如此方式执行至少需要半分多钟,相当费劲!
echo "PROCESS STA RT:".date("Y-m-d H:i:s").PHP_EOL;
//我们用多线程来解决这个问题 我们充分发挥计算机的性能,高效的来实现这个问题
//初始化任务地址数组
$urls = [
'http://www.baidu.com',
'http://www.360.com',
'http://www.qq.com',
'http://www.sina.com',
'http://www.csdn.net',
'http://www.163.com'
];
$workers=[];//初始化一个数组 回收线程管道内容
//按照任务分配线程
for($i=0;$i<count($urls);$i++){
$process = new swoole_process(function(swoole_process $woker) use($urls,$i){
//为了代码工整查看案例结果 我们写一个模拟获取页面方法 实际获取得到的文档太大不变查看 也不容易核对好使时间
$content = curlData($urls[$i]);
echo $content;
},true);//true 配置后 让线程打印内容输出到管道
$pid = $process->start();
$workers[$pid] = $process;
}
//模拟执行耗时任务函数
function curlData($url){
//实际中应该写 file_get_contents($url);
//模拟耗时1秒
sleep(1);
return $url.PHP_EOL;
}
//打印管道内容
foreach($workers as $k=>$pro){
echo "PID:".$pro->read();
}
echo "PROCESS END:".date("Y-m-d H:i:s").PHP_EOL;
测试打印结果:
[root@localhost process]# php test.php
PROCESS STA RT:2018-11-02 14:27:04
PID:http://www.baidu.com
PID:http://www.360.com
PID:http://www.qq.com
PID:http://www.sina.com
PID:http://www.csdn.net
PID:http://www.163.com
PROCESS END:2018-11-02 14:27:05
看到了吗,虽然我们每个线程执行的时候,都消耗1s,但是开始的时间戳 跟结束的时仅仅有1s的时间间隔哦!