多个任务同时执行

比如,我们要对已知的用户数据进行判断,是否需要发送邮件和短信,如果需要发送则发送。

不使用多进程时,我们首先判断是否发送邮件,如果需要则发送;然后再判断是否需要发送短信,如果需要则发送。如果发送邮件耗时2s,发送短信耗时2s,那么我们完成任务大概需要4s左右的时间。

如果我们使用多线程的话,可以开两个线程,一个用于处理邮件,一个用于处理短信,则耗时一共需要2s左右,处理时间缩短了一半。

以下是代码实例:

<?php
/*** Created by PhpStorm.* User: cyw0413* Date: 2018/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']);}
}

大任务划分成多个小任务

假设我们现在有一个通过curl抓取网页内容的需求,需要抓取10个网页,url地址通过数组读取,每个curl耗时2s。如果我们通过for循环来抓取这10个网页,需要耗时20s,使用多进程我们可以将任务划分成5份,分别由5个进程执行,每个进程抓取2个url,并发执行,共耗时4s,效率提高5倍。

以下是代码实例

<?php
/*** Created by PhpStorm.* User: cyw0413* Date: 2018/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机制本身不提供多线程的操作,ptcl扩展提供了php操作linux多进程的接口。

点关注,不迷路

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。之前说过,PHP方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以

点击进入暗号: PHP+「平台」


更多学习内容可以访问

阿布阿布:【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)​​zhuanlan.zhihu.com

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的 PHP技术交流群

php foreach 收邮件_php机制本身不提供多线程的操作,有了swoole就不一样了相关推荐

  1. 使用javaMail收邮件 支持附件下载

    http://haohaoxuexi.iteye.com/blog/1162044 使用javaMail收邮件主要有两种协议,一种是pop3,一种是imap.这两种协议都可以用来收邮件,但是在其中的处 ...

  2. Python微调文本顺序对抗朴素贝叶斯算法垃圾邮件分类机制

    封面图片:<Python可以这样学>,ISBN:9787302456469,董付国,清华大学出版社 图书详情(京东): ================= 关于朴素贝叶斯算法中文垃圾邮件分 ...

  3. sendmail收邮件

    你的sendmail的本地配置文件里面需要配置一个文件:local-host-names,里面需要有你想用来接收邮件的域名比如mail.xxx.com,同时你的DNS的MX记录必须是mail这个主机的 ...

  4. Outlook收不到邮件, 或者收邮件很慢, 怎么办?

    有的时候, 客户打来电话, 说邮件已经发过来了. 可是过了半个小时, Outlook里还是没有看到邮件过来. 可能再等半个小时, 还是没有动静. 作为客户端的end user, 该怎么做呢? 如果有O ...

  5. 【JMAIL】jmail无法收邮件问题

    调试这个问题已经好几天了,今天终于解决,分享给大家. 其实只有一句话,jmail支持收邮件的版本只有jmail4.4 pro破解版. 网上论坛有不少地址可以下载,别忘了注册(注册方式见上一个帖子). ...

  6. VC++ 开发pop3收邮件程序的相关问题

    首先用VC做个pop3收邮件程序:不能连接:pop3的端口是110或995: 用telnet看一下能否收到邮箱邮件:这些都是不从浏览器进入邮箱收邮件的方式:telnet方式见此: https://bl ...

  7. java eml解析_javamail 收邮件 解析eml文件

    内容来自:http://www.oschina.net/bbs/thread/528 以下代码经过测试了的能通过 我在用javaMail做收邮件时怎么邮件内容重复(一种文本格式的,一种html格式的) ...

  8. python3收邮件_认真对待 Python3 收邮件

    前言 之前老是用Python发邮件,用起来挺方便的.但是一直没实现用Python收邮件,最近忙着笔试面试,但是又不能时刻打开浏览器,刷手机看看有没有新邮件(尤其是有没有关于面试,笔试通知的邮件)啊.所 ...

  9. outlook收邮件延迟_如何计划或延迟在Outlook中发送电子邮件

    outlook收邮件延迟 When you click Send on an email, it is typically sent immediately. But what if you want ...

最新文章

  1. fs:[124]对应CurrentThread
  2. COLING 2018 最佳论文解读:序列标注经典模型复现
  3. 使用实例_EM菌使用实例
  4. c 指针打印变量_C程序打印不同类型的指针变量的大小。
  5. ZSH and oh-my-zsh 强强联合
  6. (个人使用)uni-app开发(官方资源)· 汇总
  7. pyspark —— spark dataframe 从hdfs读写文件
  8. 制作删不掉的php唯读档,ppt母版logo删除不了怎么办
  9. wps怎么做文档分享
  10. java实现关键字查询_SpringData关键字查询实现方法详解
  11. java编程自学教程笔记,大量教程
  12. 100个优秀实用性网站
  13. 采购计算机硬件的理论,计算机硬件采购合同要点分析.doc
  14. Apache shiro反序列化(CVE-2016-4437)复现
  15. 2016年8月24日 星期三 --出埃及记 Exodus 16:25
  16. CTO作为过来人,给20、30岁年轻人的5个学习方法!​
  17. pyalgotrade量化回测框架简单试用
  18. 安卓调用微信sdk正常,ios报invalid signature的错误
  19. FreeType 学习笔记
  20. 《Python编程从入门到实践》学习笔记9:类

热门文章

  1. 优化JMeter自身性能
  2. oracle数据库安装过程中出现主目录不兼容的问题
  3. 64位Windows2003 Enterprise sp2 上64位Oracle10.2.0.1升级到Oracle10.2.0.3具体步骤
  4. oracle过滤器基础,示例过滤器表达式 (Oracle Solaris Studio 12.2:性能分析器)
  5. oracle 其他表空间,Oracle查询表空间使用情况以及其他查询
  6. vue 怎么清空依赖_vuejs如何在把对象所有属性清空?
  7. linux php cgi.sock,nginx中unix:/tmp/php-cgi.sock错误解决解决
  8. html锚点反向联动,小程序菜单左右联动
  9. c++检测ip是否匹配子网掩码_网络工程师从入门到精通通俗易懂系列 | ARP和IP这篇文章讲的相当详细了,这么基础的知识往往也是最容易遗忘的!...
  10. spring 基于xml方式配置aop