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的5个入手程序
Nov 23 PHP
劣质的PHP代码简化
Feb 08 PHP
PHP高级对象构建 多个构造函数的使用
Feb 05 PHP
php在程序中将网页生成word文档并提供下载的代码
Oct 09 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
Jun 20 PHP
解析thinkphp中的导入文件标签
Jun 20 PHP
PHP curl实现抓取302跳转后页面的示例
Jul 04 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
Nov 25 PHP
php三元运算符知识汇总
Jul 02 PHP
整理php防注入和XSS攻击通用过滤
Sep 13 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
Mar 25 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数据加密详解
2013/06/18 PHP
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
Document:getElementsByName()使用方法及示例
2013/10/28 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
JS判断表单输入是否为空(示例代码)
2013/12/23 Javascript
javascript使用onclick事件改变选中行的颜色
2013/12/30 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
浅析javascript中函数声明和函数表达式的区别
2015/02/15 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
2017/04/13 jQuery
微信小程序 页面跳转传值实现代码
2017/07/27 Javascript
详解Js中的模块化是如何实现的
2017/10/18 Javascript
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
自学python的建议和周期预算
2019/01/30 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
python3字符串输出常见面试题总结
2020/12/01 Python
Python实现一个论文下载器的过程
2021/01/18 Python
超市优秀员工事迹材料
2014/05/01 职场文书
工商管理专业自荐信
2014/06/03 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
民事和解协议书格式
2014/11/29 职场文书
护理培训心得体会
2016/01/22 职场文书
公司与个人合作协议书
2016/03/19 职场文书
画错魏国疆域啦!《派对咖孔明》动画因作画失误于官网致歉
2022/04/07 日漫