如何使用PHP編寫daemon process

2021-06-28 15:29:08 字數 3720 閱讀 9217

今天下午在segmentfault.com看到乙個提問,提問標題是「php怎麼做服務化」,其中問道php是不是只能以web方式呼叫。其實很多人對php的使用場景都有誤解,認為php只能用於編寫web指令碼,實際上,從php4開始,php的使用場景早已不限於處理web請求。 從php的架構體系來說,php分為三個層次:sapi、php core和zend engine。php core本身和web沒有任何耦合,php通過sapi與其它應用程式通訊,例如mod_php就是為apache編寫的sapi實現,同樣,fpm是乙個基於fastcgi協議的sapi實現,這些sapi都是與web server配合用於處理web請求的。但是也有許多sapi與web無關,例如cli sapi可以使得在命令列環境下直接執行php,embed sapi可以將php嵌入其它語言(如lua)那樣。這裡我並不打算詳細討論php的架構體系和sapi的話題,只是說明從架構體系角度目前的php早已被設計為支援各種環境,而非為web獨有。 除了架構體系的支援外,php豐富的擴充套件模組也為php在不同環境發揮作用提供了後盾,例如本文要提到的pcntl模組和posix模組配合可以實現基本的程序管理、訊號處理等作業系統級別的功能,而sockets模組可以使php具有socket通訊的能力。因此php完全可以用於編寫類似於shell或perl常做的工具性指令碼,甚至是具有server性質的daemon process。 為了展示php如何編寫daemon server,我用php編寫了乙個簡單的http server,這個server以daemon process的形式執行。當然,為了把重點放在如何使用php編寫daemon,我沒有為這個http server實現具體業務邏輯,但它可以監聽指定埠,接受http請求並返回給客戶端一條固定的文字,整個過程通過socket實現,全部由php編寫而成。

下面是這個程式的完整**:

這裡我假設各位對unix環境程式設計都比較了解,所以不做太多細節的解釋,只梳理一下。簡單來看,這個程式主要由兩個部分組成,handle_http_request函式負責處理http請求,其編寫方法與用c編寫的tcp server類似:建立socket、繫結、監聽,然後通過乙個迴圈處理每個connect過來的客戶端,一旦accept到乙個連線...

如何使用PHP編寫RESTful介面

這是乙個輕量級框架,專為快速開發restful介面而設計。如果你和我一樣,厭倦了使用傳統的mvc框架編寫微服務或者前後端分離的api介面,受不了為了乙個簡單介面而做的很多多餘的coding 和ctrl c ctrl v 那麼,你肯定會喜歡這個框架!寫個helloworld.php,放到框架指定的目錄...

使用PHP指令碼來寫Daemon程式

什麼是daemon程序 這又是乙個有趣的概念,daemon在英語中是 精靈 的意思,就像我們經常在迪斯尼動畫裡見到的那些,有些會飛,有些不會,經常圍著動畫片的主人公轉來轉去,囉裡囉唆地提一些忠告,時不時倒霉地撞在柱子上,有時候還會想出一些小小的花招,把主人公從敵人手中救出來,正因如此,daemon有...

使用PHP指令碼來寫Daemon程式

什麼是daemon程序 這又是乙個有趣的概念,daemon在英語中是 精靈 的意思,就像我們經常在迪斯尼動畫裡見到的那些,有些會飛,有些不會,經常圍著動畫片的主人公轉來轉去,囉裡囉唆地提一些忠告,時不時倒霉地撞在柱子上,有時候還會想出一些小小的花招,把主人公從敵人手中救出來,正因如此,daemon有...