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 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
PHP类中Static方法效率测试代码
Oct 17 PHP
奇怪的PHP引用效率问题分析
Mar 23 PHP
Zend Framework教程之Application用法实例详解
Mar 14 PHP
PHP数组函数知识汇总
May 12 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
Sep 22 PHP
php数组指针操作详解
Feb 14 PHP
替换php字符串中的单引号为双引号的方法
Feb 16 PHP
PHP自定义函数实现数组比较功能示例
Oct 19 PHP
关于php开启错误提示的总结
Sep 24 PHP
在laravel框架中实现封装公共方法全局调用
Oct 14 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 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实现登陆验证码(类似条行码状)
2006/10/09 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
生成二维码方法汇总
2014/12/26 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
js实现图片切换(动画版)
2016/12/25 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
基于AngularJS实现表单验证功能
2017/07/28 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
Python抓取框架 Scrapy的架构
2016/08/12 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
2020/05/19 Python
python操作redis数据库的三种方法
2020/09/10 Python
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
美德少年事迹材料
2014/01/23 职场文书
会计专业自荐信
2014/06/03 职场文书
体育课外活动总结
2014/07/08 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
范文之农村基层党建工作报告
2019/10/24 职场文书
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers
SqlServer常用函数及时间处理小结
2023/05/08 SQL Server