当前位置:编程学习 > > 正文

php的流程控制语句(PHP基于swoole多进程操作示例)

时间:2021-11-08 16:30:23类别:编程学习

php的流程控制语句

PHP基于swoole多进程操作示例

本文实例讲述了php基于swoole多进程操作。分享给大家供大家参考,具体如下:

多个任务同时执行

将顺序执行的任务,转化为并行执行(任务在逻辑上可以并行执行)
比如,我们要对已知的用户数据进行判断,是否需要发送邮件和短信,如果需要发送则发送。

不使用多进程时,我们首先判断是否发送邮件,如果需要则发送;然后再判断是否需要发送短信,如果需要则发送。如果发送邮件耗时2s,发送短信耗时2s,那么我们完成任务大概需要4s左右的时间。

如果我们使用多线程的话,可以开两个线程,一个用于处理邮件,一个用于处理短信,则耗时一共需要2s左右,处理时间缩短了一半。

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • <?php
  • /**
  •  * created by phpstorm.
  •  * user: zhezhao
  •  * date: 2016/10/20
  •  * time: 10:37
  •  */
  • $info = array(
  •   "sendmail"=>1,
  •   "mailto"=>"12345@qq.com",
  •   "sendsms"=>1,
  •   "smsto"=>"123456"
  • );
  • echo "start:".date("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_eol;
  • echo $sms_process->read();
  • echo php_eol;
  • echo "end:".date("y-m-d h:i:s").php_eol;
  • //并行函数
  • function sendmail(swoole_process $worker){
  •   global $info;
  •   if($info['sendmail']==1){
  •     sleep(2);
  •     $worker->write("send mail to ".$info['mailto']);
  •   }
  • }
  • function sendsms(swoole_process $worker){
  •   global $info;
  •   if($info['sendmail']==1){
  •     sleep(2);
  •     $worker->write("send sms to ".$info['smsto']);
  •   }
  • }
  • php的流程控制语句(PHP基于swoole多进程操作示例)

    大任务划分成多个小任务

    将循环执行的任务,划分为多个进程执行,提高工作效率

    假设我们现在有一个通过curl抓取网页内容的需求,需要抓取10个网页,url地址通过数组读取,每个curl耗时2s。如果我们通过for循环来抓取这10个网页,需要耗时20s,使用多进程我们可以将任务划分成5份,分别由5个进程执行,每个进程抓取2个url,并发执行,共耗时4s,效率提高5倍。

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • <?php
  • /**
  •  * created by phpstorm.
  •  * user: zhezhao
  •  * date: 2016/10/20
  •  * time: 10:51
  •  */
  • $url_arr = array();
  • for ($i=0;$i<10;$i++){
  •   $url_arr[] = "www.baidu.com?wd=".$i;
  • }
  • echo "start:".date("y-m-d h:i:s").php_eol;
  • $workers = array();
  • for ($i=0;$i<5;$i++){
  •   $process = new swoole_process('getcontents',true);
  •   $process->start();
  •   $process->write($i);
  •   $workers[] = $process;
  • }
  • //主进程数据结果
  • foreach ($workers as $process){
  •   echo $process->read();
  •   echo php_eol;
  • }
  • echo "end:".date("y-m-d h:i:s").php_eol;
  • function getcontents(swoole_process $worker){
  •   $i = $worker->read();
  •   global $url_arr;
  •   $res1 = execcurl($url_arr[($i*2)]);
  •   $res2 = execcurl($url_arr[($i*2+1)]);
  •   echo $res1.php_eol.$res2;
  • }
  • function execcurl($url){
  •   sleep(2);
  •   return "handle ".$url." finished";
  • }
  • php的流程控制语句(PHP基于swoole多进程操作示例)

    总结

    以上两种情况,本质上都是将逻辑上没有先后关系的任务,用多个进程程并发执行,提高效率。

    php机制本身不提供多线程的操作,ptcl扩展提供了php操作linux多进程的接口。

    个人感觉swoole的多进程process方法更加方便一些。

    关于两者的比较:http://wiki.swoole.com/wiki/page/214.html

    参考文章: 
    https://segmentfault.com/a/1190000002946586

    希望本文所述对大家PHP程序设计有所帮助。

    原文链接:https://blog.csdn.net/koastal/article/details/52871316
     

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐