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和ACCESS写聊天室(一)
Oct 09 PHP
IStream与TStream之间的相互转换
Aug 01 PHP
php 删除记录实现代码
Mar 12 PHP
PHP 单引号与双引号的区别
Nov 24 PHP
php $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
Jun 21 PHP
php下网站防IP攻击代码,超级实用
Oct 24 PHP
php解析url的三个示例
Jan 20 PHP
php实现的http请求封装示例
Nov 08 PHP
Yii2表单事件之Ajax提交实现方法
May 04 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
Jun 06 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 PHP
PHP检查端口是否可以被绑定的方法示例
Aug 09 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
PHP获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
php 代码优化的42条建议 推荐
2009/09/25 PHP
通过dbi使用perl连接mysql数据库的方法
2014/04/16 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
Jquery下的26个实用小技巧(jQuery tips, tricks &amp; solutions)
2010/03/01 Javascript
div层的移动及性能优化
2010/11/16 Javascript
js 为label标签和div标签赋值的方法
2013/08/08 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
Javascript中获取对象的原型对象的方法小结
2015/02/25 Javascript
使用AngularJS来实现HTML页面嵌套的方法
2015/06/17 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
深入浅析AngularJS和DataModel
2016/02/16 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
vue实现前端分页完整代码
2020/06/17 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
python3编写C/S网络程序实例教程
2014/08/25 Python
Python selenium抓取微博内容的示例代码
2018/05/17 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
Django websocket原理及功能实现代码
2020/11/14 Python
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
自我鉴定范文
2013/11/10 职场文书
颁奖晚会主持词
2014/03/25 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
三年级学生评语大全
2014/12/26 职场文书
语文复习计划
2015/01/19 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
作文之亲情600字
2019/09/23 职场文书
Python机器学习算法之决策树算法的实现与优缺点
2021/05/13 Python
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL