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 相关文章推荐
第五节--克隆
Nov 16 PHP
php学习笔记之 函数声明
Jun 09 PHP
PHP中strtotime函数使用方法分享
Jan 10 PHP
关于使用coreseek并为其做分页的介绍
Jun 21 PHP
php验证是否是md5编码的简单代码
Apr 01 PHP
CodeIgniter CLI模式简介
Jun 17 PHP
thinkphp中空模板与空模块的用法实例
Nov 26 PHP
Java和PHP在Web开发方面对比分析
Mar 01 PHP
codeigniter发送邮件并打印调试信息的方法
Mar 21 PHP
thinkphp实现分页显示功能
Dec 03 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
May 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 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
Look And Say 序列php实现代码
2011/05/22 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
简单实现php上传文件功能
2017/09/21 PHP
PHP示例演示发送邮件给某个邮箱
2019/04/03 PHP
jquery 选择器部分整理
2009/10/28 Javascript
一个挺有意思的Javascript小问题说明
2011/09/26 Javascript
js实现网站首页图片滚动显示
2013/02/04 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
jquery选择器原理介绍($()使用方法)
2014/03/25 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
jQuery自定义添加&quot;$&quot;与解决&quot;$&quot;冲突的方法
2015/01/19 Javascript
JS动态加载当前时间的方法
2015/02/09 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
微信小程序 navbar实例详解
2017/05/11 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
基于javascript的无缝滚动动画实现2
2020/08/07 Javascript
关于Node.js中频繁修改代码重启服务器的问题
2020/10/15 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
python中wx将图标显示在右下角的脚本代码
2013/03/08 Python
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
python利用装饰器进行运算的实例分析
2015/08/04 Python
Python3爬虫学习入门教程
2018/12/11 Python
Pureology官网:为染色头发打造最好的产品
2019/09/13 全球购物
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
Wiggle新西兰:自行车、跑步、游泳
2020/05/06 全球购物
销售人员求职的自我评价分享
2014/03/15 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
反邪教教育心得体会
2016/01/15 职场文书
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL