多進程: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);