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生成随机密码的三种方法小结
Sep 04 PHP
PHP原生模板引擎 最简单的模板引擎
Apr 25 PHP
php 批量生成html,txt文件的实现代码
Jun 26 PHP
php中用date函数获取当前时间有误的解决办法
Aug 02 PHP
php对数组排序代码分享
Feb 24 PHP
又一个PHP实现的冒泡排序算法分享
Aug 21 PHP
浅谈php冒泡排序
Dec 30 PHP
启用Csrf后POST数据时出现的400错误
Jul 05 PHP
PHP书写格式详解(必看)
May 23 PHP
基于PHP后台的Android新闻浏览客户端
May 23 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
Aug 18 PHP
phpstudy后门rce批量利用脚本的实现
Dec 12 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
COM in PHP (winows only)
2006/10/09 PHP
php递归实现无限分类生成下拉列表的函数
2010/08/08 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
php实现生成验证码实例分享
2016/04/10 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
Jquery Validation插件防止重复提交表单的解决方法
2010/03/05 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
jQuery实现的五子棋游戏实例
2015/06/13 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
浅谈js基本数据类型和typeof
2016/08/09 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
python3中dict(字典)的使用方法示例
2017/03/22 Python
python 读取DICOM头文件的实例
2018/05/07 Python
Django实现学员管理系统
2019/02/26 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
python中pow函数用法及功能说明
2020/12/04 Python
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
招聘与培训专员岗位职责
2014/01/30 职场文书
人代会标语
2014/06/30 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
营销计划书
2015/01/17 职场文书
开除员工通知
2015/04/22 职场文书
老公出轨后的保证书
2015/05/08 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
如何在Python中创建二叉树
2021/03/30 Python