相關(guān)關(guān)鍵詞
關(guān)于我們
最新文章
- PHP中opcode緩存簡單用法分析
- thinkPHP控制器變量在模板中的顯示方法示例
- PHP move_uploaded_file() 函數(shù)(將上傳的文件移動到新位置)
- dirname(__FILE__)的含義和應(yīng)用說明
- thinkPHP5框架實(shí)現(xiàn)分頁查詢功能的方法示例
- PHP中單雙號與變量
- PHP獲得當(dāng)日零點(diǎn)時(shí)間戳的方法分析
- Laravel ORM對Model::find方法進(jìn)行緩存示例詳解
- PHP讀寫文件高并發(fā)處理操作實(shí)例詳解
- 【CLI】利用Curl下載文件實(shí)時(shí)進(jìn)度條顯示的實(shí)現(xiàn)
PHP守護(hù)進(jìn)程化在C和PHP環(huán)境下的實(shí)現(xiàn)
本文為大家介紹了一下PHP守護(hù)進(jìn)程化在C環(huán)境以及PHP環(huán)境下實(shí)現(xiàn)的方法以及實(shí)例代碼,一起來學(xué)習(xí)一下。
什么是守護(hù)進(jìn)程?
一個(gè)守護(hù)進(jìn)程通常補(bǔ)認(rèn)為是一個(gè)不對終端進(jìn)行控制的后臺任務(wù)。它有三個(gè)很顯著的特征:在后臺運(yùn)行,與啟動他的進(jìn)程脫離,無須控制終端。常用的實(shí)現(xiàn)方式是fork() -> setsid() -> fork()
在glibc里有一個(gè)函數(shù)daemon。調(diào)用此函數(shù),就可使當(dāng)前進(jìn)程脫離終端變成一個(gè)守護(hù)進(jìn)程,具體內(nèi)容參見man daemon。PHP中暫時(shí)沒有此函數(shù),PHP程序?qū)崿F(xiàn)守護(hù)進(jìn)程化有2種方法:
1.使用系統(tǒng)命令nohup
nohup php myprog.php > log.txt 這樣執(zhí)行程序雖然也是轉(zhuǎn)為后臺運(yùn)行,但實(shí)際上是依賴終端的,當(dāng)用戶退出終端時(shí)進(jìn)程就會被殺掉。需要使用nohup來實(shí)現(xiàn)
2.使用supervisor工具 (推薦此方案)
詳解supervisor使用教程
3.當(dāng)然也可以用程序?qū)崿F(xiàn)(不建議生產(chǎn)環(huán)境使用) C程序?qū)崿F(xiàn):
#include#include #include #include #include #include //實(shí)現(xiàn)守護(hù)進(jìn)程步驟 void crete_daemon(void) { pid_t pid = 0; pid = fork(); if (pid<0) { perror("fork"); exit(-1); } if (pid > 0) { //1.父進(jìn)程直接退出 exit(0); } //2. //執(zhí)行到這里就是子進(jìn)程 //setsid 將當(dāng)前進(jìn)程設(shè)置為一個(gè)新的會話期session,目的就是 //讓當(dāng)前進(jìn)程脫離控制臺,成為守護(hù)進(jìn)程。 pid = setsid(); if (pid < 0) { perror("setsid"); exit(-1); } //3.設(shè)置當(dāng)前進(jìn)程的工作目錄為根目錄,不依賴于其他 chdir("/"); //4.umask設(shè)置為0確保將來進(jìn)程有最大的文件操作權(quán)限 umask(0); //5.關(guān)閉文件描述符 //先要獲取當(dāng)前系統(tǒng)中所允許打開的最大文件描述符數(shù)目 int i = 0; int cnt = sysconf(_SC_OPEN_MAX); for (i=0;i