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中强制下载文件的代码(解决了IE下中文文件名乱码问题)
May 09 PHP
php学习笔记 PHP面向对象的程序设计
Jun 13 PHP
mysql,mysqli,PDO的各自不同介绍
Sep 19 PHP
PHP中使用GD库创建圆形饼图的例子
Nov 19 PHP
php面向对象中static静态属性和静态方法的调用
Feb 08 PHP
php查询mysql数据库并将结果保存到数组的方法
Mar 18 PHP
深入理解PHP中的Streams工具
Jul 03 PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
Sep 11 PHP
搭建自己的PHP MVC框架详解
Aug 16 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
Nov 13 PHP
如何运行/调试你的PHP代码
Oct 23 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防止刷新重复提交页面的示例代码
2015/11/11 PHP
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
js解析与序列化json数据(二)序列化探讨
2013/02/01 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
Nodejs下用submit提交表单提示cannot post错误的解决方法
2016/11/21 NodeJs
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
Vue中计算属性computed的示例解读
2017/07/26 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
利用python实现xml与数据库读取转换的方法
2017/06/17 Python
python pyinstaller 加载ui路径方法
2019/06/10 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
2019/07/01 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
NYX Professional Makeup俄罗斯官网:世界知名的化妆品品牌
2019/12/26 全球购物
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
高中毕业自我鉴定
2013/12/16 职场文书
给校长的一封建议书
2014/03/12 职场文书
大学校务公开实施方案
2014/03/31 职场文书
大学新闻系自荐书
2014/05/31 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
2019年干货:自我鉴定
2019/03/25 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
MySQL 用 limit 为什么会影响性能
2021/09/15 MySQL