[Origine] Tout le monde connaît le processus démon (Daemon) sous Linux/Unix, comme nos httpd, mysqld, etc. couramment utilisés, qui sont des programmes exécutés dans la mémoire résidente, similaires aux services sous Windows. Généralement, les processus démons sont écrits en C/C++, ce qui consiste à générer des processus enfants via fork. Lorsque le processus parent sous le shell actuel est tué, le processus enfant s'exécutera en arrière-plan afin de ne pas générer d'informations de sortie sur le terminal. , des fonctions telles que syslog sont utilisées pour écrire des fichiers journaux.
Nous savons que PHP est un langage de script et qu'il est exécuté via le moteur de script PHP, il est donc difficile de créer un processus démon. Aujourd'hui, nous allons combiner les commandes Unix/Linux pour réaliser la fonction de notre processus démon.
[Principe] La fonction de la commande nohup sous Unix est d'exécuter la commande sans raccrocher. En même temps, nohup place toute la sortie du programme dans le fichier nohup.out du répertoire courant. n'est pas accessible en écriture, il est placé dans le fichier <répertoire personnel de l'utilisateur> /nohup.out. Ainsi, après avoir reçu cette commande, notre programme php écrit un script shell et utilise une boucle pour maintenir notre script en cours d'exécution. Ensuite, que notre fenêtre de terminal soit fermée ou non, notre script php peut continuer à s'exécuter. Bien sûr, lorsque notre processus php est arrêté ou que notre système d'exploitation est redémarré, il se terminera naturellement.
[Fonction] Vous vous demanderez certainement, à quoi sert de faire de notre script php un démon ? Bien sûr, il existe, comme la fonction la plus typique, qui peut remplacer la fonction de cron. Par exemple, certaines opérations que nous devons effectuer régulièrement peuvent être effectuées par celle-ci, et cron n'est bien sûr plus nécessaire. Le serveur est redémarré, il n'y a aucun moyen. Cependant, les serveurs Unix généraux ne sont pas si faciles à redémarrer. De plus, nous pouvons également créer une fonction simple côté serveur, comme créer un serveur pouvant utiliser Telnet Hehe, cela peut être transformé en une petite porte dérobée, mais la mise en œuvre est un peu compliquée.
[Pratique] Exemple 1 : Générer automatiquement des fichiers Nous allons maintenant faire deux exemples pour prouver notre affirmation ci-dessus. Tout d'abord, la première consiste à générer automatiquement un fichier toutes les trente secondes et à l'exécuter pour toujours.
Tout d'abord, vous devez vous assurer que le système d'exploitation est Unix ou Linux, comme FreeBSD, Redhat, Fedora ou SUSE. Ensuite, nous devons nous assurer que notre moteur de script php est dans /usr/local/php/bin/php. Le chemin spécifique peut être écrit en fonction de votre chemin réel. S'il n'y a pas de moteur de script, veuillez l'installer vous-même.
Par exemple, si le répertoire actuel est /home/heiyeluren/, alors nous utilisons vi ou d'autres éditeurs pour écrire un fichier appelé php_daemon1.php :
$ vi php_daemon1.php
Écrivez ensuite le code suivant :
#!/usr/local/php/bin/php
<?
set_time_limit(0);
pendant que(1)
{
@fopen("test_".time().".txt","w");
dormir(30);
}
?>
Ensuite, enregistrez et quittez vi, puis donnez les autorisations exécutables au fichier php_daemon1.php :
$ chmod +x /home/heiyeluren/php_daemon1.php
Laissez ensuite notre script s'exécuter en arrière-plan et exécutez la commande suivante :
$ nohup /home/heiyeluren/php_daemon1.php &
N'oubliez pas d'ajouter le symbole & à la fin pour qu'il puisse s'exécuter en arrière-plan. Après avoir exécuté la commande ci-dessus, l'invite suivante apparaîtra :
[1] 82480
ajouter la sortie à nohup.out
Après être revenu à la voiture, une invite shell apparaîtra. Ainsi, le conseil ci-dessus signifie que les informations de sortie de toutes les exécutions de commandes seront placées dans le fichier nohup.out, qui a été mentionné ci-dessus. Ensuite, après avoir exécuté la commande ci-dessus, nous verrons plus de fichiers commençant par test_ dans le répertoire courant toutes les trente secondes, tels que : test_1139901144.txt test_1139901154.txt et d'autres fichiers, ce qui prouve que notre programme s'exécute en arrière-plan.
Alors, comment mettre fin au fonctionnement du programme ? Le meilleur moyen est de redémarrer le système d'exploitation. Haha, bien sûr, ce n'est pas conseillé. Nous pouvons utiliser la commande kill pour tuer le processus. Avant de tuer le processus, nous connaissons naturellement le numéro PID du processus. ID Vous pouvez utiliser la commande ps pour le voir arriver.
$ps
COMMANDE TEMPS STAT TT PID
82374 p3 Ss 0:00.14 -bash (bash)
82510 p3 S 0:00.06 /usr/local/php/bin/php /home/heiyeluren/php_daemon1.php
82528 p3 R+ 0:00.00ps
Ci-dessus nous avons vu que l'ID de processus de notre php est : 82510, nous exécutons donc la commande kill :
$ tuer -9 82510
[1]+ Nohup tué /home/heiyeluren/php_daemon1.php
Lorsque vous voyez cette invite, vous saurez que le processus a été interrompu. Si vous faites à nouveau un ps, vous constaterez qu'il a disparu :
$ps
COMMANDE TEMPS STAT TT PID
82374 p3 Ss 0:00.17 -bash (bash)
82535 p3 R+ 0:00.00ps
Si vous ne pouvez pas voir le processus directement avec la commande ps, utilisez les deux commandes combinées ps et apos pour le visualiser, et vous pourrez certainement voir le processus.
Sur la base du processus ci-dessus, vous pouvez étendre le processus pour créer votre propre programme cron, vous n'avez alors pas besoin de cron. Bien sûr, ce n'est qu'un exemple 2 : démon côté serveur. . Il est grossièrement simulé en utilisant PHP côté serveur, puis s'exécute en arrière-plan pour obtenir l'effet d'un démon côté serveur.
Continuez dans notre répertoire personnel : /home/heiyeluren et éditez le fichier php_daemon2.php :
$ vi php_daemon2.php
Entrez le code suivant (le code vient du manuel PHP, j'ai modifié les commentaires) :
#!/usr/local/php/bin/php
<?php
/* Les paramètres http://www.knowsky.com/php.asp n'affichent aucune erreur*/
rapport d'erreur (0);
/* Le délai d'attente du script est infini*/
set_time_limit(0);
/* Commencer la compensation fixe */
ob_implicit_flush();
/* L'IP de cette machine et les ports qui doivent être ouverts */
$adresse = '192.168.0.1';
$port = 10 000 ;
/* Générer un Socket */
si (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() a échoué : raison : " . socket_strerror($sock) .
}
/* Lier l'adresse IP et le port */
if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo « socket_bind() a échoué : raison : » . socket_strerror($ret) .
}
/* Connexion de la prise de moniteur */
si (($ret = socket_listen($sock, 5)) < 0) {
echo « socket_listen() a échoué : raison : » . socket_strerror($ret) .
}
/*Boucle indéfinie pour surveiller les connexions des utilisateurs*/
faire {
si (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() a échoué : raison : " . socket_strerror($msgsock) "n" ;
casser;
}
/* Envoyer des informations d'invite aux utilisateurs connectés*/
$msg = "===========================================rn " .
"Bienvenue sur le serveur de test PHP. rnrn".
" Pour quitter, tapez 'quitter'. rn" .
"Pour arrêter le serveur, tapez 'shutdown'.rn" .
"Pour obtenir un message d'aide, tapez 'help'.rn" .
"===========================================rn" .
"php>" ;
socket_write($msgsock, $msg, strlen($msg));
faire {
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo « socket_read() a échoué : raison : » . socket_strerror($ret) .
pause 2 ;
}
si ($buf = trim($buf)) {
continuer;
}
/*Ferme la connexion client lorsque le client entre la commande quit*/
si ($buf == 'quitter') {
casser;
}
/* Lorsque le client entre la commande shutdown, le serveur et le client sont arrêtés*/
si ($buf == 'arrêt') {
socket_close($msgsock);
pause 2 ;
}
/* Afficher les informations d'aide lorsque le client entre la commande d'aide*/
si ($buf == 'aide') {
$msg = « Message d'aide du serveur PHP rnrn ».
" Pour quitter, tapez 'quitter'. rn" .
"Pour arrêter le serveur, tapez 'shutdown'.rn" .
"Pour obtenir un message d'aide, tapez 'help'.rn" .
"php>" ;
socket_write($msgsock, $msg, strlen($msg));
continuer;
}
/*Message d'invite lorsque la commande d'entrée client n'existe pas*/
$talkback = « PHP : commande inconnue '$buf'.rnphp> « ;
socket_write($msgsock, $talkback, strlen($talkback));
echo « $bufn » ;
} while (vrai);
socket_close($msgsock);
} while (vrai);
/* Ferme la connexion Socket */
socket_close($chaussette);
?>
Enregistrez le code ci-dessus et quittez.
Le code ci-dessus remplit à peu près une fonction similaire à celle du côté serveur Telnet, c'est-à-dire que lorsque le côté serveur exécute le programme, le client peut se connecter au port 10000 du serveur pour la communication.
Ajoutez des autorisations exécutables au fichier :
$ chmod +x /home/heiyeluren/php_daemon2.php
Exécutez la commande sur le serveur :
$ nohup /home/heiyeluren/php_daemon2.php &
On entre en opération en arrière-plan, et on remonte via le telnet du client Windows :
C:>telnet 192.168.0.1 10000
Si vous y êtes invité :
Connexion à 192.168.0.188... Impossible d'ouvrir la connexion à l'hôte sur le port 10000 : Si la connexion échoue, cela signifie que le serveur n'est pas ouvert ou que le programme ci-dessus n'est pas exécuté correctement. Veuillez vérifier si php a l'option –enable. -Fonction de prises. Si vous y êtes invité :
===========================================
Bienvenue sur le serveur de test PHP.
Pour quitter, tapez « quitter ».
Pour arrêter le serveur, tapez « shutdown ».
Pour obtenir un message d'aide, tapez « aide ».
===========================================
php>
Cela signifie que nous nous sommes connectés avec succès au démon côté serveur écrit en PHP. Après l'invite php>, nous pouvons exécuter trois commandes telles que help, quit et shutdown. Si l'entrée de commande n'est pas ces trois, elle demandera :
php> asdf
PHP : commande inconnue 'asdf'.
Exécutez la commande help pour obtenir de l'aide php> help
Message d'aide du serveur PHP
Pour quitter, tapez « quitter ».
Pour arrêter le serveur, tapez « shutdown ».
Pour obtenir un message d'aide, tapez « aide ».
Ce côté serveur ne sera pas introduit et peut être étendu par vous-même.
L'arrêt du processus est similaire à l'exemple 1.
[Résumé] Grâce à l'apprentissage ci-dessus, nous savons que PHP peut également être utilisé comme processus démon s'il est bien conçu, la fonction sera plus puissante. Cependant, nous venons juste d'apprendre ici et vous pouvez la rechercher et la mettre à jour par vous-même. .
Cet article fait référence au manuel PHP en chinois. La lecture d’autres manuels vous sera très bénéfique.