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脚本的10个技巧(8)
Oct 09 PHP
php5.2.0内存管理改进
Jan 22 PHP
PHP对MongoDB[NoSQL]数据库的操作
Mar 01 PHP
解析php curl_setopt 函数的相关应用及介绍
Jun 17 PHP
PHP中判断变量为空的几种方法小结
Nov 12 PHP
PHP中批量生成静态html(命令行下运行PHP)
Apr 19 PHP
php修改文件上传限制方法汇总
Apr 07 PHP
wamp服务器访问php非常缓慢的解决过程
Jul 01 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
Oct 08 PHP
浅谈php(codeigniter)安全性注意事项
Apr 06 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
Dec 24 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
咖啡豆要不要放冰箱的原因
2021/03/04 冲泡冲煮
实用函数5
2007/11/08 PHP
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
2014/06/23 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
Javascript与vbscript数据共享
2007/01/09 Javascript
JavaScript 中的事件教程
2007/04/05 Javascript
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
Python数据类型之String字符串实例详解
2019/05/08 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
Python3远程监控程序的实现方法
2019/07/15 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
pytorch逐元素比较tensor大小实例
2020/01/03 Python
django 取消csrf限制的实例
2020/03/13 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
canvas绘图按照contain或者cover方式适配并居中显示
2019/02/18 HTML / CSS
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
房地产员工找工作的自我评价
2013/11/15 职场文书
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
拉歌口号大全
2014/06/13 职场文书
基层党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
Python 如何解决稀疏矩阵运算
2021/05/26 Python
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
高考要来啦!用Python爬取历年高考数据并分析
2021/06/03 Python
详解Java实践之抽象工厂模式
2021/06/18 Java/Android
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技