zoukankan      html  css  js  c++  java
  • 2013/11/21工作随笔-PHP开启多进程

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

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

    首先想到的是使用pcntl的fork

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

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

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

    <?php
    $startTime = time();
    while(1) {
    	if (time() - $startTime > 600) {
    		break;
    	}
    
    	// ... Do SomeThing
    }

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

    然后开启一个cron:

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

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

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

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

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

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

    <?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队列操作,使用情况真是嘎嘎好用。

  • 相关阅读:
    SDUT 2143 图结构练习——最短路径 SPFA模板,方便以后用。。 Anti
    SDUT ACM 1002 Biorhythms 中国剩余定理 Anti
    nyist OJ 119 士兵杀敌(三) RMQ问题 Anti
    SDUT ACM 2157 Greatest Number Anti
    SDUT ACM 2622 最短路径 二维SPFA启蒙题。。 Anti
    二叉索引树 区间信息的维护与查询 Anti
    SDUT ACM 2600 子节点计数 Anti
    UVA 1428 Ping pong 二叉索引树标准用法 Anti
    2010圣诞Google首页效果
    Object
  • 原文地址:https://www.cnblogs.com/yjf512/p/3436141.html
Copyright © 2011-2022 走看看