2013/11/21工作随笔-PHP开启多进程

今天被问到一个问题,php如何开启多进程才比较稳定。

php开启多进程执行一个操作有哪些方法:

首先想到的是使用pcntl的fork

具体可以参考之前的文章:PHP的pcntl多进程

其次想到的方法是使用linux的crontab

有个php程序,内部实现大概是


1

2

3

4

5

6

7

8

9

<?php

$startTime = time();

while(1) {

    if (time() - $startTime > 600) {

        break;

    }

 

    // ... Do SomeThing

}

意思是这个程序会持续10分钟,10分钟循环做这同一个操作

然后开启一个cron:


1

*/2 * * * * /usr/local/bin/php XXX.php

这个cron每两分钟跑一个前面的php程序

这样就能保证同时会有5个程序在Do SomeThing。

还有想到的方法是使用php的exec函数

首先当然有个Do SomeThing的php程序:a.php

启动一个php父进程,在程序中使用exec:


1

2

3

4

5

<?php

 

for($i = 0; $i < $count; $i++){

    exec("nohup /user/local/bin/php a.php >> /dev/null &");

}

这个方法当然也有很多变种,比如

1 第二个循环启动的程序使用shell来做

2 第一个Do SomeThing的函数使用上个方法的持续进程

有啥区别呢

第一种使用pcntl的方法,感觉起来子进程“是受控制”的

意思就是父进程可以获取处理子进程的输出信息,也可以等待子进程处理完以后做后续操作。

而后面两种子进程是“不受控制”的。

PS:要想让后面两种子进程受控制,或许可以使用一些第三方存储,比如日志,比如redis等。

 

第二种和第三种方法,cron+php的方法,有种好处是不会出现长时间贮存内存中的进程。

由于php的底层实现很有可能导致内存泄漏,所以一个“写的不够好”的PHP程序如果长时间一直运行,很有可能导致内存使用出现问题。所以不应该让一个php程序“长时间运行”。

第二三种方法,一个程序运行完成之后就会立即结束进程,即使有内存泄漏也不会导致任何问题。所以比较让人放心点。

PS:再说一下,方法一也不是必须要起常驻内存的进程,但往往我们做的时候会让父进程常驻着。

 

还有啥呢,往往多进程的话要注意并发,可能会用到锁之类的。因为一般要保证Do SomeThing的原子性才行。

方法二我们在线上大量使用了,并上redis的pop队列操作,使用情况真是嘎嘎好用。

时间: 2024-11-10 10:26:49

2013/11/21工作随笔-PHP开启多进程的相关文章

2013/11/22工作随笔-缓存是放在Model层还是放在Controller层

web网站的典型代码框架就是MVC架构,Model层负责数据获取,Controller层负责逻辑控制,View层则负责展示. 一般数据获取是去mysql中获取数据 但是这里有个问题,我们不会每次请求都去mysql中获取,当并发量大的时候,我们希望mysql前面有层缓存做着. 这层缓存可能是redis,memcache,File等,但是这个逻辑代码是放在Controller中好还是Model中好呢? 放在Controller中: 好处:可以单个Controller进行控制,每个controller

《财富》杂志发布2013最适合工作的100家公司榜单

摘要: 没准,今天你觉得自己还活在2012年,总是不小心说出:这东西今年二月才买的...等等穿越的话.那么,看在这份上,我们现在再总结下 2012年也不会让人觉得太晚是不是?呵呵~如果你想 <财富>杂志发布了2013最适合工作的100家公司榜单,结果让人有些意外:Google 位列第一,微软 75,苹果和 Facebook 不入选.科技公司排名如下.细数下来,100 家最佳雇主当中就有 10 家为科技公司,成绩已然不错. 1:Google 2:SAS 11:高通 19:Salesforce 2

php开启多进程的方法

 本文实例讲述了php开启多进程的方法.分享给大家供大家参考.具体实现方法如下:   代码如下: <?php $IP='192.168.1.1';//Windows電腦的IP $Port='5900'; //VNC使用的Port $ServerPort='9999';//Linux Server對外使用的Port $RemoteSocket=false;//連線到VNC的Socket function SignalFunction($Signal){ //這是主Process的訊息處理函數 gl

双11鬼混 倍斯特移动电源抽奖活动开启

双11鬼混 倍斯特移动电源抽奖活动开启 类型:厂商稿 作者:倍斯特 时间:2014-11-05 05:29:00 倍斯特移动电源<双11脱光 小倍带你去鬼混>活动. 脱光时间:http://www.aliyun.com/zixun/aggregation/33721.html">2014年11月1日――11月30日. 脱光攻略: 1.在卖场门店购买倍斯特移动电源: 2.扫二维码关注倍斯特官方微信: 3.输入产品防伪码及个人信息: 4.大转盘转起来,大奖抽出来! 5.约会,领奖!

《上古神殿》首次测试已定于11月17日神气开启

<上古神殿>是金山首款以古希腊神话为背景的次世代硬派动作网游,在研发团队的努力奋战下,游戏近期即将破冰,首次测试已定于11月17日神气开启.热衷于西方古典神话的玩家,对热血激荡的动作游戏钟情的朋友,现在你终于可以将一腔热血尽情的挥洒于壮阔的上古神域--斗战神,灭猎人.金山次时代神话动作新游<上古神殿>,11月17日强势来袭! <上古神殿>以古希腊神话为背景,这里有巍峨的奥林匹斯山,这里有万人敬仰的神明,而我们的故事也从这里开始为大家娓娓道来:苍茫的神域不再是诸神和苍生休

Big Faceless PDF Library 2.11.21发布 PDF文档创建的Java类库

Big Faceless PDF Library是一个用于创建http://www.aliyun.com/zixun/aggregation/16864.html">PDF文档的Java类库.当前扩展版本提供了创建和编辑AcroForms,PDF格式转换到HTML表单的功能,PDF导入阅读和编辑,支持FDF,数字签名和验证文本提取.PDF表单包含文本框.单选按钮和 JavaScript 函数调用.它提供了完整的Unicode支持.加密.嵌入的TrueType和Type1字体.条形码.超链接

php开启多进程的方法_php技巧

本文实例讲述了php开启多进程的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <?php  $IP='192.168.1.1';//Windows電腦的IP  $Port='5900';        //VNC使用的Port  $ServerPort='9999';//Linux Server對外使用的Port  $RemoteSocket=false;//連線到VNC的Socket  function SignalFunction($Signal){   //這是主P

《中国人工智能学会通讯》——11.21 结束语

11.21 结束语 本文针对交通流的网络性.异质性和动态性特点,结合当前多任务学习方法的不足提出了相应的解决方案.然而,在实际的应用场景中还存在更多的挑战,需要进一步深入的研究方向包括:① 高维任务的共同学习方法.在高维数据场景下,任务也体现出高维的特点,其中的难点在于高维任务中所蕴含的关系模式更为复杂,这种关系可能是聚类模式,甚至层次模式无法刻画的.如何解决高维任务场景下的多任务共同学习的问题是未来需要深入研究的方向之一.② 数据延迟或缺失下的多任务学习.在交通应用场景中,交通流采集数据由于上

外链工具升级版11月22日内测开启公告

各位网站管理员, 大家好,为了让大家使用更精确的外链工具升级版本,百度站长平台外链工具升级版调整至11月22日开启内测,在11月21日之前通过规定方式发送邮件进行申请内测资格的用户,已开通内测权限,可在11月22日直接进入外链工具页面优先使用升级版外链工具. 本次升级主要功能: 1.支持全网外链的查询,为网站的外链建设提供更权威有效的数据参考. 2.优化展示的外链信息. 内测资格申请方式: 请将需要申请内测资格的站长平台账号信息及网站信息通过邮件的形式发送至站长平台官方邮箱zhanzhangpi