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 相关文章推荐
使用PHP数组实现无限分类,不使用数据库,不使用递归.
Dec 09 PHP
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
Mar 13 PHP
完美解决PHP中文乱码
Nov 26 PHP
PHP 类商品秒杀计时实现代码
May 05 PHP
字母顺序颠倒而单词顺序不变的php代码
Aug 08 PHP
关于IIS php调用com组件的权限问题
Jan 11 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
Aug 07 PHP
利用浏览器的Javascript控制台调试PHP程序
Jan 08 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
Sep 29 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP使用curl_multi实现并发请求的方法示例
Apr 29 PHP
Laravel框架Eloquent ORM删除数据操作示例
Dec 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
第1次亲密接触PHP5(2)
2006/10/09 PHP
php shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
比较strtr, str_replace和preg_replace三个函数的效率
2013/06/26 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
Javascript将string类型转换int类型
2010/12/09 Javascript
Javascript中产生固定结果的函数优化技巧
2013/01/16 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
2020/11/16 Javascript
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
Python中for循环和while循环的基本使用方法
2015/08/21 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
python logging 日志的级别调整方式
2020/02/21 Python
猎人靴英国官网:Hunter Boots
2017/02/02 全球购物
三查三看党性分析材料
2014/02/18 职场文书
珍爱生命演讲稿
2014/05/10 职场文书
总经理任命书范本
2014/06/05 职场文书
社区两委对照检查材料
2014/08/23 职场文书
2014年乡镇工作总结
2014/11/21 职场文书
上班迟到检讨书范文
2015/05/06 职场文书
首都博物馆观后感
2015/06/05 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
golang为什么要统一错误处理
2022/04/03 Golang
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫