本文的例子讲述了基于swoole的PHP多进程操作。分享给大家参考,如下:
多个任务同时执行
将按顺序执行的任务转换为并行执行(任务可以按逻辑并行执行)。比如我们要判断已知的用户数据,是否需要发邮件和短信,如果需要就发。
当不使用多进程时,我们首先判断是否发送邮件,必要时发送;然后判断是否发短信,如果发了就发。如果发邮件需要2秒,发短信需要2秒,那么我们完成任务大概需要4秒。
如果使用多线程,可以打开两个线程,一个用于邮件处理,一个用于短信处理,总共耗时2s左右,处理时间缩短一半。
?php/** *由PhpStorm创建。* User:赵哲* date : 2016/10/20 * time : 10:37 */$ info=array(' sendmail '=1,' mailto'='[emailprotected]',' sendsms'=1,' smsto '=' 123456 ');回声“start:”。日期(' Y-m-d H:i:s ')。PHP _ EOL$ mail _ process=new swoole _ process(' sendMail ',true);$ mail _ process-start();$ SMS _ process=new swoole _ process(' sendSMS ',true);$ SMS _ process-start();//主进程输出子进程范围内容echo $ mail _ process-read();echo PHP _ EOLecho $ SMS _ process-read();echo PHP _ EOL回显“end:”。日期(' Y-m-d H:i:s ')。PHP _ EOL//并行函数函数sendmail(swole _ process $ worker){ global $ info;if($ info[' sendmail ']==1){ sleep(2);$worker-write('发送邮件到'。$ info[' mailto ']);} }函数sendSMS(swoole _ process $ worker){ global $ info;if($ info[' sendmail ']==1){ sleep(2);$worker-write('向发送短信'。$ info[' smsto ']);} }
大任务被分成几个小任务
将循环执行的任务划分为多个流程,以提高工作效率
假设我们现在有一个通过curl抓取网页的需求,需要抓取10个网页并通过数组读取url地址,每个curl需要2秒钟。如果我们通过for循环抓取这10个网页,需要20秒。使用多个进程,我们可以将任务分成五个部分,分别由五个进程执行。每个进程抓取两个URL并发执行,总共耗时4秒,效率提升5倍。
?php/** *由PhpStorm创建。*用户:赵哲*日期: 2016/10/20 *时间: 10:51 */$ URL _ arr=array();for($ I=0;$ i10$i ){ $url_arr[]='www.baidu.com?wd='。$ I;} echo“start :”。日期(' Y-m-d H:i:s ')。PHP _ EOL$ workers=array();for($ I=0;$ i5$ I){ $ process=new swoole _ process(' GetContents ',true);$ process-start();$ process-write($ I);$ workers[]=$ process;}//主流程数据结果foreach($ workers as $ process){ echo $ process-read();echo PHP _ EOL}回显“end:”。日期(' Y-m-d H:i:s ')。PHP _ EOL函数GetContents(swoole _ process $ worker){ $ I=$ worker-read();全局$ url _ arr$ res1=Execcurl($ URL _ arr[($ I * 2)];$ res2=Execcurl($ URL _ arr[($ I * 2 1)];echo $res1。PHP_EOL。$ res2}函数exec curl($ URL){ sleep(2);返回“句柄”。$url。“完成”;}
摘要
在上述两种情况下,逻辑上互不相关的任务由多个进程并发执行,以提高效率。
Php机制本身不提供多线程操作,ptcl扩展提供php接口来操作linux多进程。
个人认为,swoole的多流程处理方法更方便。
两者的比较:http://wiki.swoole.com/wiki/page/214.html
参考文章:https://segmentfault.com/a/1190000002946586
更多对PHP相关内容感兴趣的读者可以查看本网站专题:《PHP进程与线程操作技巧总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》、《php常见数据库操作技巧汇总》、0103010
希望本文对PHP编程有所帮助。