用PHP寫一個Daemon守護(hù)進(jìn)程_PHP教程
Jul 13, 2016 am 10:33 AMDaemon守護(hù)進(jìn)程
這又是一個有趣的概念,daemon在英語中是"精靈"的意思,就像我們經(jīng)常在迪斯尼動畫里見到的那些,有些會飛,有些不會,經(jīng)常圍著動畫片的主人公轉(zhuǎn)來轉(zhuǎn)去,啰里啰唆地提一些忠告,時不時倒霉地撞在柱子上,有時候還會想出一些小小的花招,把主人公從敵人手中救出來,正因如此,daemon有時也被譯作"守護(hù)神"。所以,daemon進(jìn)程在國內(nèi)也有兩種譯法,有些人譯作"精靈進(jìn)程",有些人譯作"守護(hù)進(jìn)程",這兩種稱呼的出現(xiàn)頻率都很高。
與真正的daemon相似,daemon進(jìn)程也習(xí)慣于把自己隱藏在人們的視線之外,默默為系統(tǒng)做出貢獻(xiàn),有時人們也把它們稱作"后臺服務(wù)進(jìn)程"。daemon進(jìn)程的壽命很長,一般來說,從它們一被執(zhí)行開始,直到整個系統(tǒng)關(guān)閉,它們才會退出。幾乎所有的服務(wù)器程序,包括我們熟知的Apache和wu-FTP,都用daemon進(jìn)程的形式實(shí)現(xiàn)。很多Linux下常見的命令如inetd和ftpd,末尾的字母d就是指daemon。
為什么一定要使用daemon進(jìn)程呢?Linux中每一個系統(tǒng)與用戶進(jìn)行交流的界面稱為終端(terminal),每一個從此終端開始運(yùn)行的進(jìn)程都會依附于這個終端,這個終端就稱為這些進(jìn)程的控制終端(Controlling terminal),當(dāng)控制終端被關(guān)閉時,相應(yīng)的進(jìn)程都會被自動關(guān)閉。關(guān)于這點(diǎn),讀者可以用X-Window中的XTerm試驗(yàn)一下,(每一個XTerm就是一個打開的終端,)我們可以通過鍵入命令啟動應(yīng)用程序,比如:$netscape 然后我們關(guān)閉XTerm窗口,剛剛啟動的netscape窗口也會隨之一同突然蒸發(fā)。但是daemon進(jìn)程卻能夠突破這種限制,即使對應(yīng)的終端關(guān)閉,它也能在系統(tǒng)中長久地存在下去,如果我們想讓某個進(jìn)程長命百歲,不因?yàn)橛脩艋蚪K端或其他的變化而受到影響,就必須把這個進(jìn)程變成一個daemon進(jìn)程。
Daemon進(jìn)程的編程規(guī)則
如果想把自己的進(jìn)程變成daemon進(jìn)程,我們必須嚴(yán)格按照以下步驟進(jìn)行:
1. 調(diào)用fork產(chǎn)生一個子進(jìn)程,同時父進(jìn)程退出。我們所有后續(xù)工作都在子進(jìn)程中完成。這樣做我們可以:
- 如果我們是從命令行執(zhí)行的該程序,這可以造成程序執(zhí)行完畢的假象,shell會回去等待下一條命令;
- 剛剛通過fork產(chǎn)生的新進(jìn)程一定不會是一個進(jìn)程組的組長,這為第2步的執(zhí)行提供了前提保障。
這樣做還會出現(xiàn)一種很有趣的現(xiàn)象:由于父進(jìn)程已經(jīng)先于子進(jìn)程退出,會造成子進(jìn)程沒有父進(jìn)程,變成一個孤兒進(jìn)程(orphan)。每當(dāng)系統(tǒng)發(fā)現(xiàn)一個孤兒進(jìn)程,就會自動由1號進(jìn)程收養(yǎng)它,這樣,原先的子進(jìn)程就會變成1號進(jìn)程的子進(jìn)程。
2. 調(diào)用setsid系統(tǒng)調(diào)用。這是整個過程中最重要的一步。它的作用是創(chuàng)建一個新的會話(session),并自任該會話的組長(session leader)。如果調(diào)用進(jìn)程是一個進(jìn)程組的組長,調(diào)用就會失敗,但這已經(jīng)在第1步得到了保證。調(diào)用setsid有3個作用:
- 讓進(jìn)程擺脫原會話的控制;
- 讓進(jìn)程擺脫原進(jìn)程組的控制;
- 讓進(jìn)程擺脫原控制終端的控制;
總之,就是讓調(diào)用進(jìn)程完全獨(dú)立出來,脫離所有其他進(jìn)程的控制。
3. 把當(dāng)前工作目錄切換到根目錄。
如果我們是在一個臨時加載的文件系統(tǒng)上執(zhí)行這個進(jìn)程的,比如:/mnt/floppy/,該進(jìn)程的當(dāng)前工作目錄就會是/mnt/floppy/。在整個進(jìn)程運(yùn)行期間該文件系統(tǒng)都無法被卸下(umount),而無論我們是否在使用這個文件系統(tǒng),這會給我們帶來很多不便。解決的方法是使用chdir系統(tǒng)調(diào)用把當(dāng)前工作目錄變?yōu)楦夸?,?yīng)該不會有人想把根目錄卸下吧。
當(dāng)然,在這一步里,如果有特殊的需要,我們也可以把當(dāng)前工作目錄換成其他的路徑,比如/tmp。
4. 將文件權(quán)限掩碼設(shè)為0。
這需要調(diào)用系統(tǒng)調(diào)用umask,參見附錄3。每個進(jìn)程都會從父進(jìn)程那里繼承一個文件權(quán)限掩碼,當(dāng)創(chuàng)建新文件時,這個掩碼被用于設(shè)定文件的默認(rèn)訪問權(quán)限,屏蔽掉某些權(quán)限,如一般用戶的寫權(quán)限。當(dāng)另一個進(jìn)程用exec調(diào)用我們編寫的daemon程序時,由于我們不知道那個進(jìn)程的文件權(quán)限掩碼是什么,這樣在我們創(chuàng)建新文件時,就會帶來一些麻煩。所以,我們應(yīng)該重新設(shè)置文件權(quán)限掩碼,我們可以設(shè)成任何我們想要的值,但一般情況下,大家都把它設(shè)為0,這樣,它就不會屏蔽用戶的任何操作。
如果你的應(yīng)用程序根本就不涉及創(chuàng)建新文件或是文件訪問權(quán)限的設(shè)定,你也完全可以把文件權(quán)限掩碼一腳踢開,跳過這一步。
5. 關(guān)閉所有不需要的文件。
同文件權(quán)限掩碼一樣,我們的新進(jìn)程會從父進(jìn)程那里繼承一些已經(jīng)打開了的文件。這些被打開的文件可能永遠(yuǎn)不被我們的daemon進(jìn)程讀或?qū)?,但它們一樣消耗系統(tǒng)資源,而且可能導(dǎo)致所在的文件系統(tǒng)無法卸下。需要指出的是,文件描述符為0、1和2的三個文件(文件描述符的概念將在下一章介紹),也就是我們常說的輸入、輸出和報錯這三個文件也需要被關(guān)閉。很可能不少讀者會對此感到奇怪,難道我們不需要輸入輸出嗎?但事實(shí)是,在上面的第2步后,我們的daemon進(jìn)程已經(jīng)與所屬的控制終端失去了聯(lián)系,我們從終端輸入的字符不可能達(dá)到daemon進(jìn)程,daemon進(jìn)程用常規(guī)的方法(如printf)輸出的字符也不可能在我們的終端上顯示出來。所以這三個文件已經(jīng)失去了存在的價值,也應(yīng)該被關(guān)閉。
編寫守護(hù)進(jìn)程
在我之前的文章中,介紹過Gearman的使用。在我的項(xiàng)目中,我使用了PHP來編寫一直運(yùn)行的Worker。如果按照Gearman官方推薦的例子,只是簡單的一個循環(huán)來等待任務(wù),會有一些問題,包括:1、當(dāng)代碼進(jìn)行過修改之后,如何讓代碼的修改生效;2、重啟Worker的時候,如何保證當(dāng)前的任務(wù)處理完成才重啟。
針對這個問題,我考慮了以下的解決方法:
- 每次修改完代碼后,Worker需要手工重啟(先殺死然后啟動)。這個只能解決重新加載配置文件的問題。
- 在Worker中設(shè)置,單次任務(wù)循環(huán)完成后,就對Worker進(jìn)行重啟。這個方案的問題在于消耗比較大。
- 在Worker中添加一個退出函數(shù),如果需要Worker退出的時候,在Client端發(fā)送一個優(yōu)先級比較高的退出調(diào)用。這個需要客戶端配合,在使用后臺類任務(wù)時,不太適合。
- 在Worker中檢查文件是否發(fā)生變化,如果發(fā)生了變化,退出并重啟自身。
- 為Worker編寫信號控制,接受重啟指令,類似于 http restart graceful 指令。
最后,結(jié)合4和5兩種方法,可以實(shí)現(xiàn)這樣一個Daemon,如果配置文件發(fā)生了變化,他就會自動重啟;如果接受到了用戶的 kill -1 pid 信號,也會重新啟動。
代碼如下:
<?php declare( ticks = 1 ); // This case will check the config file regularly, if the config file changed, it will restart it self // If you want to restart the daemon gracefully, give it a HUP signal // by shiqiang<cocowool@gmail.com> at 2011-12-04 $init_md5 = md5_file( 'config.php'); // register signal handler pcntl_signal( SIGALRM, "signal_handler", true ); pcntl_signal( SIGHUP, 'signal_handler', TRUE ); $job_flag = FALSE; //Job status flag, to justify if the job has been finished $signal_flag = FALSE; //Signal status flag, to justify whether we received the kill -1 signal while( 1 ){ $job_flag = FALSE; //Job status flag print "Worker start running ... n"; sleep(5); print "Worker's task done ... n"; $flag = TRUE; //Job status flag AutoStart( $signal_flag ); } function signal_handler( $signal ) { global $job_flag; global $signal_flag; switch( $signal ){ case SIGQUIT: print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGQUIT - No : $signal n"; exit(0); break; case SIGSTOP: print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGSTOP - No : $signal n"; break; case SIGHUP: print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGHUP - No : $signal n"; if( $flag === TRUE ){ AutoStart( TRUE ); }else{ $signal_flag = TRUE; } break; case SIGALRM: print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGALRM - No : $signal n"; //pcntl_exec( '/bin/ls' ); pcntl_alarm( 5 ); break; default: break; } } function AutoStart( $signal = FALSE, $filename = 'config.php' ){ global $init_md5; if( $signal || md5_file( $filename ) != $init_md5 ){ print "The config file has been changed, we are going to restart. n"; $pid = pcntl_fork(); if( $pid == -1 ){ print "Fork error n"; }else if( $pid > 0 ){ print "Parent exit n"; exit(0); }else{ $init_md5 = md5_file( $filename ); print "Child continue to run n"; } } } ?>

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

L'entrée vocale de l'utilisateur est capturée et envoyée au backend PHP via l'API MediaRecorder du JavaScript frontal; 2. PHP enregistre l'audio en tant que fichier temporaire et appelle STTAPI (tel que Google ou Baidu Voice Recognition) pour le convertir en texte; 3. PHP envoie le texte à un service d'IA (comme Openaigpt) pour obtenir une réponse intelligente; 4. PHP appelle ensuite TTSAPI (comme Baidu ou Google Voice Synthesis) pour convertir la réponse en fichier vocal; 5. PHP diffuse le fichier vocal vers l'avant pour jouer, terminant l'interaction. L'ensemble du processus est dominé par PHP pour assurer une connexion transparente entre toutes les liens.

La méthode principale de création de fonctions de partage social dans PHP est de générer dynamiquement des liens de partage qui répondent aux exigences de chaque plate-forme. 1. Obtenez d'abord la page actuelle ou les informations d'URL et d'article spécifiées; 2. Utilisez UrLencode pour coder les paramètres; 3. épisser et générer des liens de partage en fonction des protocoles de chaque plate-forme; 4. Afficher les liens sur l'avant pour que les utilisateurs puissent cliquer et partager; 5. Générez dynamiquement des balises OG sur la page pour optimiser l'affichage du contenu du partage; 6. Assurez-vous d'échapper à la saisie des utilisateurs pour empêcher les attaques XSS. Cette méthode ne nécessite pas d'authentification complexe, a de faibles co?ts de maintenance et convient à la plupart des besoins de partage de contenu.

Pour réaliser la correction d'erreur de texte et l'optimisation de la syntaxe avec l'IA, vous devez suivre les étapes suivantes: 1. Sélectionnez un modèle ou une API d'IA appropriée, tels que Baidu, Tencent API ou bibliothèque NLP open source; 2. Appelez l'API via Curl ou Guzzle de PHP et traitez les résultats de retour; 3. Afficher les informations de correction d'erreur dans l'application et permettre aux utilisateurs de choisir d'adopter l'adoption; 4. Utilisez PHP-L et PHP_CODESNIFFER pour la détection de syntaxe et l'optimisation du code; 5. Collectez en continu les commentaires et mettez à jour le modèle ou les règles pour améliorer l'effet. Lorsque vous choisissez AIAPI, concentrez-vous sur l'évaluation de la précision, de la vitesse de réponse, du prix et du support pour PHP. L'optimisation du code doit suivre les spécifications du PSR, utiliser le cache raisonnablement, éviter les requêtes circulaires, revoir le code régulièrement et utiliser x

1. La maximisation de la valeur commerciale du système de commentaires nécessite de combiner la livraison précise de la publicité native, les services à valeur ajoutée par l'utilisateur (tels que le téléchargement d'images, les commentaires de recharge), d'influencer le mécanisme d'incitation basé sur la qualité des commentaires et la conformité de la monétisation anonyme des données de données; 2. La stratégie d'audit doit adopter une combinaison de mécanismes de filtrage des mots clés dynamiques pré-audit et de signalement des utilisateurs, complétés par une note de qualité des commentaires pour réaliser une exposition hiérarchique de contenu; 3. Anti-brosses nécessite la construction d'une défense multicouche: la vérification sans capteur RecaptChav3, le robot de reconnaissance de champ de miel, IP et la limite de fréquence d'horodatage empêchent l'arrosage, et la reconnaissance du modèle de contenu marque les commentaires suspects et itéra en continu pour traiter les attaques.

PHP n'effectue pas directement un traitement d'image AI, mais s'intègre via les API, car il est bon dans le développement Web plut?t que dans les taches à forte intensité informatique. L'intégration de l'API peut atteindre une division professionnelle du travail, réduire les co?ts et améliorer l'efficacité; 2. Intégration des technologies clés incluez l'utilisation de Guzzle ou Curl pour envoyer des demandes HTTP, le codage et le décodage des données JSON, l'authentification de la sécurité des clés de l'API, les taches de traitement de la file d'attente asynchrones, les taches prenant du temps, la gestion des erreurs robuste et le mécanisme de retrait, le stockage et l'affichage d'images; 3. Les défis courants incluent le co?t des API incontr?lable, les résultats de génération incontr?lables, la mauvaise expérience utilisateur, les risques de sécurité et la gestion difficile des données. Les stratégies de réponse consistent à définir des quotas et des caches utilisateur, en fournissant des conseils ProTT et une sélection multi-images, des notifications asynchrones et des invites de progrès, un stockage et un audit de contenu de la variable d'environnement clé et un stockage cloud.

PHP assure l'atomicité de la déduction des stocks via les transactions de base de données et les verrous en ligne de Forupdate pour empêcher la survente élevée élevée en simultation; 2. La cohérence de l'inventaire multiplateforme dépend de la gestion centralisée et de la synchronisation axée sur les événements, combinant des notifications API / WebHook et des files d'attente de messages pour assurer une transmission fiable de données; 3. Le mécanisme d'alarme doit définir un faible inventaire, un inventaire zéro / négatif, des ventes invidables, des cycles de réapprovisionnement et des stratégies de fluctuations anormales dans différents scénarios, et sélectionner Dingtalk, SMS ou les personnes responsables par e-mail en fonction de l'urgence, et les informations d'alarme doivent être complètes et claires pour réaliser l'adaptation et la réponse rapide.

PhpisstillRelevantinmodernerterpriseenvironments.1.modernPhp (7.xand8.x) offre des performances, des stricts, un jitcompilation, et modernsyntax, rendant la main

Le r?le principal de Homebrew dans la construction de l'environnement Mac est de simplifier l'installation et la gestion des logiciels. 1. Homebrew gère automatiquement les dépendances et encapsule les processus de compilation et d'installation complexes en commandes simples; 2. Fournit un écosystème de package logiciel unifié pour assurer la normalisation de l'emplacement et de la configuration de l'installation logicielle; 3. Intègre les fonctions de gestion des services et peut facilement démarrer et arrêter les services via BrewServices; 4. Mise à niveau et maintenance des logiciels pratiques et améliore la sécurité et les fonctionnalités du système.
