隊列運行
- 守護進程: nohup命令運行主進程,由主進程開啟並監控子進程,在子進程正常或意外結束後及時重新開啟對應子進程。
- 進程間通信: Unix信號機制,子進程通過
pcntl_signal
綁定信號,通過pcntl_signal_dispatch
調用等待信號,即有信號被調用後,此函數會觸發相應的處理句柄(參考queue_v2/CSignal.php
)。主進程可以通過posix_kill
來向子進程發送信號。
- 數據處理: 子進程阻塞地從Redis的list中取出數據,然後交由 配置的
worker
程序處理。
隊列代碼
- - CRedisQueueBases # 隊列運行的基礎類
- CRedisQueueMaster extends CRedisQueueBases # 主進程,常駐的守護進程
- CRedisQueueWorker extends CRedisQueueBases # 子進程,由主進程開啟,負責處理數據
- QueueCommands # 隊列命令,控制隊列開啟、關閉、重啟等,由該類實現
- QueueConfig # 配置管理類
- QueueLoger # 日志記錄類
- CSignal # Unix信號處理類
- worker # 存放worker處理程序的文件夾,不同項目,在這裡做開發,實現自己的worker即可
|- abstract CWorker # worker處理程序抽象類,真實的worker從這裡繼承,並實現抽象方法
|- CWorkerForYii extends CWorker # 適用於YII的worker
- store # 可擴展的存儲,用於存放PID等數據
|- interface IStore # 存儲類接口
|- abstract class CStore implements IStore # 抽象類
|- CFileStore extends CStore # 文件存儲
執行流程
-Yii 框架與隊列處理程序的結合腳本: framework/cli/commands/QueueV2Command.php
QueueV2Command extends CConsoleCommand
手動執行shell: php yiic.php queueV2 start
- QueueV2Command->actionStart()
- QueueCommands->start()
- PHP執行shell:'nohup /usr/bin/php /data/www/project/protected/yiic.php queueV2 master >> /dev/null 2>&1 &'
- QueueV2Command->actionMaster()
- QueueCommands->runMaster()
- CRedisQueueMaster->run() # pcntl_waitpid,不斷判斷子進程狀態
$this->forkWorker() , pcntl_fork() # pcntl_fork開啟子進程
- CRedisQueueWorker->run()
- $worker = new $this->config->WORKER($this->logger); # 配置文件中讀取worker,更靈活
$data = $worker->pop();
$worker->setData($data[1])->run();