在Web開發中,PHP是非常常見的一種編程語言,并且php的性能一直是被人們所關注。為了解決php運行效率的問題,很多php開發者或工程師采用了諸如Nginx、Apache等負載均衡器來管理PHP進程,因此,php PM(進程管理器)成為了一種非常實用的技術。PHP PM Dynamic(簡稱PPM)是一種使用php編寫的進程管理器,它允許你不需要Apache或者Nginx來管理PHP進程,從而提高php運行的性能。
PPM的使用非常靈活,它經常運用于實時Web技術開發,例如:Web套接字服務器,WebSocket服務器,長作業處理,以及PHP框架。基本上,任何的PHP應用程序都能夠在PPM上運行,因為它的運行原理是每一個客戶端都與PPM之間形成了一條短鏈接來完成TCP連接,從而得到請求響應的過程。這一點和我們平時使用的Apache或者Nginx不太一樣,因為他們都采用單獨的http請求。
不過你也不要覺得該技術十分簡單,其實也存在其一些缺陷。例如,在測試大量的簡單web請求時,PPM常常會比傳統的Apache或者Nginx負載均衡器慢。而且,在處理繁忙的請求時,該技術無法像傳統的負載均衡器那樣去釋放資源池。但是這也僅僅是它的缺點而已,并未影響它在眾多的Web開發工程中的地位以及成為了一個非常受歡迎的PHP技術
PPM如何工作
PPM采用了動態的方式來管理php進程。在傳統的負載均衡器中,通常采用啟動固定數量的php進程來處理http請求。而在PPM中,它采用了一種動態的方式管理php進程。
$dispatcher = require __DIR__.'/vendor/autoload.php'; $bridge = new React\http\Server($dispatcher); $loop = React\EventLoop\Factory::create(); $loop->addPeriodicTimer(60, function() { gc_collect_cycles(); }); $loop->run();
如上代碼所示,PPM中通常有一個默認的啟動腳本,默認情況下,該腳本會創建一個PHP進程,并且運行事件循環(loop)。該事件循環會定期重啟PHP子進程,同時也會開啟PHP命令行或者面向Web套接字的進程。這些PHP進程的運行數量的由的響應一些特定的請求決定。
在PHP應用中使用PPM
在PHP應用中使用PPM是非常方便的。只需要在應用中引用PPM模塊,然后編寫一個啟動腳本即可。PHP應用便可以運行在PPM上了。下面是一個簡易的PPM啟動腳本:
$worker = new \PPM\Worker( "tcp://127.0.0.1:8080", function () { require __DIR__ . '/vendor/autoload.php'; require __DIR__ . '/index.php'; } ); $worker->setProcesses(1); $worker->run();
上面的代碼非常簡單,并且與PHP應用程序綁定,然后啟動一個進程池。這個進程池將在端口8080上等待Websocket連接。如此簡單又實用的技術真是讓人不得不夸贊。
結語
PPM(Stream)是一種高性能的PHP PM,其利用open source項目React PHP實現了異步并發處理。而且它現在已經成熟并且非常穩定。當然,PPM并不是完美無瑕的,它與傳統的負載均衡器以及其他PHP PM相比,仍然存在缺點。但是即使如此,它在Web開發中依然是一種十分出色的技術,這也是無可厚非的。