多进程:php
GO
语言能够很容易的实现多进程,对于 PHP
,有没有比较简单的方法去实现?code
这里有一种巧妙的方式,来实现多进程。游戏
可是须要注意一下 内存
和 CPU
的使用状况进程
场景:消息PUSH
。crontab
假设 PUSH
有多种类型,好比针对用户的,针对游戏的,针对全局的。内存
咱们使用 PHP
脚本去执行下发操做,长链接 PUSH
服务使用第三方系统提供的 API
来支持。多进程
PHP
脚本是顺序执行的,假设配置了 N
条PUSH
,后续的 PUSH
就要等前面的 PUSH
执行完毕,才能继续。配置
好比,第一条 PUSH
是处于 While(true)
之类的循环状态中,下发时间范围为一成天;那么其余的 PUSH
就只循环
能干等着,没法及时执行 PUSH
操做,从而耽误了业务。command
方案:Deamon
进程 和 Act
进程
一、Deamon
进程:配置 crontab
* * * * * flock -xn /tmp/push_deamon.lock -c "/usr/local/php/bin/php push_deamon.php >> /tmp/push_error.log 2>&1"
二、Act
进程:在 push_deamon.php
中,针对不一样 push_id
,启动如下脚本。
$command = flock -xn /tmp/push_act_{$push_id}.lock -c "nohup /usr/local/php/bin/php -f push_act.php $push_id >> /tmp/push_error.log 2>&1 &" exec($command);
问题:Act
进程被手动 Kill
有些 PUSH
是天天执行一次的,若是对应的 Act
进程被杀死。
那么对应的锁文件 push_act_{$push_id}.lock
,就没有被清理。
这样会致使 Deamon
进程重启 Act
进程时,发现有锁文件,就不会继续启动 Act
进程。
解决办法:在 Deamon
进程中自动删除昨天的锁文件
$command = "find /tmp/ -daystart -mtime 1 -type f -name push_act_{$id}.lock -exec rm -f {} \; >> /tmp/push_error.log 2>&1 &"; exec($command);