SimpleFork
項目地址:https://github.com/huyanping/simple-fork-php
基於PCNTL擴充的多進程進程並發架構,介面類似與Java的Thread和Runnable
為什麼要寫SimpleFork
多進程程式的編寫相比較多線程編寫更加複雜,需要考慮進程回收、同步、互斥、通訊等問題。對於初學者來說,處理上述問題會比較困難。 尤其是訊號處理和進程通訊這塊,很難做到不出問題。 SimpleFork提供一套類似於JAVA多線程的進程式控制制介面,提供回收、同步、互斥、通訊等方案,開發人員可以關注業務問題,不需要過多考慮進程式控制制。
引入
composer require jenner/simple_fork
requirepath/to/SimpleFork/autoload.php
依賴
必須
ext-pcntl 進程式控制制可選
ext-sysvmsg 訊息佇列
ext-sysvsem 同步互斥鎖
ext-sysvshm 共用記憶體特性
提供進程池
自動處理殭屍進程回收,支援無阻塞調用
提供共用記憶體、System V 訊息佇列、Semaphore鎖,方便IPC通訊(進程通訊)
提供Process和Runnable兩種方式實現進程
可以即時擷取到進程狀態
shutdown所有進程或單獨stop一個進程時,可以註冊覆蓋beforeExit()方法,返回true則退出,false繼續運行(在某些情境,進程不能立即退出)
支援子進程運行時reload注意事項
System V 訊息佇列由於在程式退出時可能存在尚未處理完的資料,所以不會銷毀。如果需要銷毀,請調用$queue->remove()方法刪除隊列
共用記憶體會在所有進程退出後刪除
Semaphore對象會在對象回收時進行銷毀
進程池start()後,需要調用wait()進行殭屍進程回收,可以無阻塞調用
擷取進程狀態(調用isAlive()方法)前,最好調用一個無阻塞的wait(false)進行一次回收,由於進程運行狀態的判斷不是原子操作,所以isAlive()方法不保證與實際狀態完全一致
如果你不清楚在什麼情況下需要在程式的最開始加入declare(ticks=1);,那麼最好預設第一行都加入這段聲明。如何使用declare(ticks=1);
declare(ticks=1); 這段聲明用於進程訊號處理。如果註冊了訊號處理器,程式會沒執行一行代碼後自動檢查是否有尚未處理的訊號。http://php.net/manual/zh/control-structures.declare.phpTODO
提供更多功能的進程池,模仿java
提供第三方進程通訊機制(Redis等)
更多的測試及樣本程式樣本程式
更多樣本程式見exmples目錄
simple.php
classTestRunnableextends\Jenner\SimpleFork\Runnable{/** * 進程執行入口 * @return mixed */publicfunctionrun() {echo"I am a sub process".PHP_EOL; }}$process=new\Jenner\SimpleFork\Process(newTestRunnable());$process->start();
shared_memory.php
classProducerextends\Jenner\SimpleFork\Process{publicfunctionrun(){for($i=0; $i<10; $i++){$this->cache->set($i, $i);echo"set {$i} : {$i}".PHH_EOL; } }}classWorkerextends\Jenner\SimpleFork\Process{publicfunctionrun(){sleep(5);for($i=0; $i<10; $i++){echo"get {$i} : ".$this->cache->get($i) .PHP_EOL; } }}$memory=new\Jenner\SimpleFork\IPC\SharedMemory();$producer=newProducer();$producer->setCache($memory);$worker=newWorker();$worker->setCache($memory);$pool=new\Jenner\SimpleFork\Pool();$pool->submit($producer);$pool->submit($worker);$pool->start();$pool->wait();
原創文章,轉載請註明: 轉載自始終不夠
本文連結地址: SimpleFork php多進程並發架構
轉載請註明:始終不夠 ? SimpleFork php多進程並發架構
以上就介紹了SimpleFork php多進程並發架構,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。