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

目录
相关文章
|
1天前
|
PHP
PHP的pcntl多进程用法实例
PHP使用PCNTL系列的函数也能做到多进程处理一个事务。
|
PHP
PHP swoole 监听端口进程
PHP swoole 监听端口进程
101 0
|
PHP
PHP:php-fpm进程数控制配置
PHP:php-fpm进程数控制配置
120 0
|
Unix API PHP
PHP如何实现多进程并发?底层原理是什么?
PHP如何实现多进程并发?底层原理是什么?
190 0
PHP进程池的数量是如何配置的?底层原理是什么?
PHP进程池的数量是如何配置的?底层原理是什么?
172 0
PHP进程池是干什么的?底层原理是什么?
PHP进程池是干什么的?底层原理是什么?
149 0
|
消息中间件 Linux PHP
php进程通信-消息队列(2)
php进程通信-消息队列
106 0
php进程通信-消息队列(2)
|
消息中间件 Linux PHP
php进程通信-消息队列(1)
php进程通信-消息队列
117 0
php进程通信-消息队列(1)
|
Linux PHP
php进程通信-PIPE管道通信
php进程通信-PIPE管道通信
127 0
php进程通信-PIPE管道通信
|
Linux PHP
php进程通信-进程信号(2)
php进程通信-进程信号
271 0
php进程通信-进程信号(2)