程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> php 隊列機制詳解

php 隊列機制詳解

編輯:PHP基礎知識
 

隊列運行

  • 守護進程: 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();
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved