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 相关文章推荐
一个阿拉伯数字转中文数字的函数
Oct 09 PHP
PHP初学者常见问题集合 修正版(21问答)
Mar 23 PHP
PHP动态创建Web站点的方法
Aug 14 PHP
php object转数组示例
Jan 15 PHP
PHP判断远程图片或文件是否存在的实现代码
Feb 20 PHP
ThinkPHP实现二级循环读取的方法
Nov 03 PHP
PHP函数extension_loaded()用法实例
Jan 19 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
Laravel5.1框架路由分组用法实例分析
Jan 04 PHP
php的对象传值与引用传值代码实例讲解
Feb 26 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
了解咖啡雨林联盟认证 什么是雨林认证 雨林认证是什么意思
2021/03/05 新手入门
PHP 八种基本的数据类型小结
2011/06/01 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
2015/11/10 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
在vue中使用eslint,配合vscode的操作
2020/11/09 Javascript
python使用循环实现批量创建文件夹示例
2014/03/25 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
2017/07/25 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
Python简易版图书管理系统
2019/08/12 Python
Python修改列表值问题解决方案
2020/03/06 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
python os模块常用的29种方法使用详解
2020/06/02 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
给儿子的表扬信
2014/01/15 职场文书
开学典礼演讲稿
2014/05/23 职场文书
优秀电子工程系毕业生求职信
2014/05/24 职场文书
党员自我剖析材料范文
2014/10/06 职场文书
预备党员介绍人意见
2015/06/01 职场文书
奖学金主要事迹范文
2015/11/04 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis