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下连接ftp实现文件的上传、下载、删除文件实例代码
Jun 03 PHP
PHP,ASP.JAVA,JAVA代码格式化工具整理
Jun 15 PHP
php中去除所有js,html,css代码
Oct 12 PHP
解析centos中Apache、php、mysql 默认安装路径
Jun 25 PHP
一个显示效果非常不错的PHP错误、异常处理类
Mar 21 PHP
MySql数据库查询结果用表格输出PHP代码示例
Mar 20 PHP
Yii2中关联查询简单用法示例
Aug 10 PHP
php实现自定义中奖项数和概率的抽奖函数示例
May 26 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
Sep 29 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
PHP实现的curl批量请求操作示例
Jun 06 PHP
关于PHP5.6+版本“No input file specified”问题的解决
Dec 11 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
操作Oracle的php类
2006/10/09 PHP
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
PHP防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
Laravel5.1框架路由分组用法实例分析
2020/01/04 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
javascript 面向对象思想 附源码
2009/07/07 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
jQuery+koa2实现简单的Ajax请求的示例
2018/03/06 jQuery
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
详解vue项目接入微信JSSDK的坑
2018/12/14 Javascript
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
[35:39]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第二场 11.22
2020/11/24 DOTA
Python的类实例属性访问规则探讨
2015/01/30 Python
Python中几种导入模块的方式总结
2017/04/27 Python
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
解读python logging模块的使用方法
2018/04/17 Python
详解Python并发编程之创建多线程的几种方法
2019/08/23 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
求职推荐信
2013/10/28 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
交通安全横幅标语
2014/10/07 职场文书
2014年环卫工作总结
2014/11/22 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python
Go语言grpc和protobuf
2022/04/13 Golang