每日17點準時技術乾貨分享
守護程序守護程序作為一種常駐程序服務,很常見,例如 php-fpm, nginx,redis,都需要乙個父程序來支援整個服務。
但是用 php 編寫守護程序不多見,今天就來用 php 來實現一下。步驟● fork 子程序
● 父程序退出
● 設定新的會話
● 重置檔案掩碼
● 關閉標準輸入輸出實現我們對著以上的步驟來實現,在這之前需要 pcntl 和 posix 擴充套件,請確保安裝了。
function daemon() else if ($pid > 0) // 設定新的會員 // setsid 有幾個注意點 // 不能是程序組的組長呼叫 // 對於程序組組員呼叫會產生新的會話和程序組,並成為該程序組的唯一成員,呼叫的程序將脫離終端 if (posix_setsid() < 0) // 重置檔案掩碼 umask(0); // 切換工作目錄 chdir('/'); // 關閉標準輸入輸出 fclose(stdin); fclose(stdout); fclose(stderr);}
細節// 獲取程序idvar_dump(posix_getpid());// 獲取程序組idvar_dump(posix_getpgid(posix_getpid()));// 獲取程序會話idvar_dump(posix_getsid(posix_getpid()));
三者結果相同,說明了該程序即使程序組的組長,也是會話首領。為什麼需要 umask (0)當你在 linux 呼叫 umask 的時候你會看到乙個掩碼值,這個掩碼決定了你建立檔案許可權範圍,例如本人當前機器的 umask 為0022檔案的最大許可權是 0666,而目錄的最大許可權是 0777, 那麼當前使用者的建立的目錄許可權就是 0755,對於當前使用者而言就是 rwx-rx-rx 許可權。
而檔案則是 0644,對於當前使用者而言 rw-r-r 許可權。
所以如果沒有重置掩碼的話,那麼對於目錄而言就是 0755,而檔案則是 0644 了。注意如果你在程序使用了 echo var_dump 等函式,一定要把標準輸出等重定向到其他檔案流中。
新增加下面**就可以了。
global $stdin, $stdout, $stderr;$stdin = fopen('/dev/null', 'r');$stdout = fopen('/www/php/txt.txt','wb');$stderr = fopen('/dev/null', 'wb');
因為在上面已經關閉了標準輸入輸出,此時檔案描述符 fd 已經沒有,所有重新開啟之後 fd 從非負開始依次是 0,1,2。
正好作為標準輸入輸出的檔案。
當然重定向到那裡需要你自己設定。最後的二次 fork這個問題需要好好斟酌,因為是非必須的。
目前想不到有什麼場景下必須兩次 fork。
-end-
宣告:本文選自「 php中文網 」,搜尋「 phpcnnew 」即可關注!
php 時間獲取,PHP獲取當前時間的5種實現方式
在日期和時間函式中,unix 時間戳的獲取非常重要,時間戳是乙個字串行,是指格林尼治時間 1970年 01 月 01 日 00 時 00 分 00 秒 北京時間 1970 年 01 月 01 日 08 時 00 分 00 秒 起至現在的總毫秒數。下面介紹幾個獲取當前時間的函式。gmmktime gm...
PHP獲取當前網域名稱
server server name 獲取當前網域名稱 不含埠號 server http host 獲取當前網域名稱 含埠號 server request uri 獲取當前網域名稱的字尾 網域名稱後面部分 獲取完整的url 包含埠號的完整url 獲取使用者 獲取 引數 echo server que...
php中獲取當前時間
time 在php中是得到乙個數字,這個數字表示從1970 01 01到現在共走了多少秒,很奇怪吧 不過這樣方便計算,要找出前一天的時間就是 time 60 60 24 要找出前一年的時間就是 time 60 60 24 365 那麼如何把這個數字換成日期格式呢,就要用到date函式了 t time...