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 相关文章推荐
mysq GBKl乱码
Nov 28 PHP
基于PHP array数组的教程详解
Jun 05 PHP
初识PHP
Sep 28 PHP
简单说说PHP优化那些事(经验分享)
Nov 27 PHP
php简单实现多字节字符串翻转的方法
Mar 31 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
Sep 28 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
Feb 23 PHP
Yii2前后台分离及migrate使用(七)
May 04 PHP
基于 Swoole 的微信扫码登录功能实现代码
Jan 15 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 PHP
PHP正则判断一个变量是否为正整数的方法
Feb 27 PHP
掌握PHP垃圾回收机制详解
Mar 13 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数组总结篇(一)
2008/09/30 PHP
php 中英文语言转换类代码
2011/08/11 PHP
PHP句法规则详解 入门学习
2011/11/09 PHP
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
PHP删除数组中的特定元素的代码
2012/06/28 PHP
php去除HTML标签实例
2013/11/06 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
PHP获取毫秒级时间戳的方法
2015/04/15 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
一个可以显示阴历的JS代码
2007/03/05 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
xmlhttp缓存清除的2种解决方法
2013/12/13 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
2019/05/27 Python
使用 Python 处理 JSON 格式的数据
2019/07/22 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
广告业务员岗位职责
2014/02/06 职场文书
大学开学计划书
2014/04/30 职场文书
幼儿园师德演讲稿
2014/05/06 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
综合管理员岗位职责
2015/02/11 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android
5个pandas调用函数的方法让数据处理更加灵活自如
2022/04/24 Python
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android