PHP基于swoole多进程操作示例


Posted in PHP onAugust 12, 2019

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

多个任务同时执行

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

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

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

<?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基于swoole多进程操作示例

大任务划分成多个小任务

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

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

<?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基于swoole多进程操作示例

总结

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

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

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

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

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

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

PHP 相关文章推荐
杏林同学录(六)
Oct 09 PHP
function.inc.php超越php
Dec 09 PHP
在yii中新增一个用户验证的方法详解
Jun 20 PHP
ThinkPHP CURD方法之data方法详解
Jun 18 PHP
3款值得推荐的微信开发开源框架
Oct 28 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
Nov 24 PHP
PHP XML和数组互相转换详解
Oct 26 PHP
php的常量和变量实例详解
Jun 27 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
Jun 14 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
Oct 11 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
Mar 03 PHP
PHP swoole和redis异步任务实现方法分析
Aug 12 #PHP
php使用pecl方式安装扩展操作示例
Aug 12 #PHP
PHP实现与java 通信的插件使用教程
Aug 11 #PHP
PHP利用DWZ.CN服务生成短网址
Aug 11 #PHP
thinkPHP和onethink微信支付插件分享
Aug 11 #PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
Aug 09 #PHP
PHP实现提高SESSION响应速度的几种方法详解
Aug 09 #PHP
You might like
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
yii框架配置默认controller和action示例
2014/04/30 PHP
简单的pgsql pdo php操作类实现代码
2016/08/25 PHP
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
jQuery中clone()方法用法实例
2015/01/16 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
js装饰设计模式学习心得
2018/02/17 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
vue百度地图 + 定位的详解
2019/05/13 Javascript
js 根据对象数组中的属性进行排序实现代码
2019/09/12 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
javascript+css实现进度条效果
2020/03/25 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
python使用opencv进行人脸识别
2017/04/07 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
django迁移数据库错误问题解决
2019/07/29 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
Surfdome西班牙:世界上最受欢迎的生活方式品牌
2019/02/13 全球购物
建筑专业毕业生推荐信
2013/11/21 职场文书
环境工程专业个人求职信
2013/12/05 职场文书
数控专业自荐书范文
2014/03/16 职场文书
医学专业自荐信
2014/06/14 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
2019年销售人员的职业生涯规划书
2019/03/25 职场文书
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers