【PHP】一種實現多進程的方式

多進程php

GO 語言能夠很容易的實現多進程,對於 PHP,有沒有比較簡單的方法去實現?code

這裏有一種巧妙的方式,來實現多進程。遊戲

可是須要注意一下 內存CPU 的使用狀況進程

場景:消息PUSHcrontab

假設 PUSH 有多種類型,好比針對用戶的,針對遊戲的,針對全局的。內存

咱們使用 PHP 腳本去執行下發操做,長鏈接 PUSH 服務使用第三方系統提供的 API 來支持。多進程

PHP 腳本是順序執行的,假設配置了 NPUSH,後續的 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);
相關文章
相關標籤/搜索