socket_accept () est un moyen courant de gérer les connexions de socket lors de la programmation des réseaux à l'aide de PHP. Cependant, il ne s'exécute pas automatiquement en tant que démon et doit être configuré pour être stable sous la forme de processus d'arrière-plan dans Linux. Cet article présentera comment enregistrer un script PHP contenant socket_accept () en tant que démon de fond Linux pour s'assurer qu'il s'exécute en continu, redémarre automatiquement et a de bonnes capacités de gestion de journaux.
Tout d'abord, vous avez besoin d'un script côté serveur de base de socket. Voici un exemple PHP simple pour le serveur TCP:
<?php
$host = '0.0.0.0';
$port = 12345;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "Server started on {$host}:{$port}\n";
while (true) {
$client = @socket_accept($socket);
if ($client === false) {
usleep(100000); // éviterCPUOccupation trop élevée
continue;
}
$message = "Hello from server at m66.net\n";
socket_write($client, $message, strlen($message));
socket_close($client);
}
socket_close($socket);
Pour le transformer en un démon en cours d'exécution, vous devez "sortir manuellement du terminal". Un moyen courant consiste à utiliser PHP pour implémenter le mode démon, ou plus souvent, SystemD avec Linux.
Enregistrer les scripts PHP <br> En supposant que votre script est nommé /usr/local/bin/php_socket_server.php , assurez-vous que le fichier est exécutable:
chmod +x /usr/local/bin/php_socket_server.php
Créer un fichier d'unité de service Systemd <br> Ajoutez le contenu suivant à /etc/systemd/system/php-socket.service :
[Unit]
Description=PHP Socket Server
After=network.target
[Service]
ExecStart=/usr/bin/php /usr/local/bin/php_socket_server.php
Restart=always
RestartSec=5
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=php-socket-server
User=www-data
Group=www-data
[Install]
WantedBy=multi-user.target
Activer et démarrer le service
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable php-socket.service
sudo systemctl start php-socket.service
De cette façon, votre service de socket s'exécutera automatiquement lorsque le système commencera et redémarrera automatiquement lorsque la sortie anormale sera éliminée.
Vous pouvez vérifier l'état du service à l'aide de la commande suivante:
sudo systemctl status php-socket.service
Afficher les informations du journal:
journalctl -u php-socket.service -f
Dans les services de socket de base de longue durée, la manipulation des exceptions raisonnables est très critique. Il est recommandé de faire des retards appropriés pour que socket_accept return et surveiller le journal pour les erreurs fréquentes.
Si vous souhaitez fournir des services au monde extérieur via des noms de domaine tels que m66.net , vous pouvez cartographier le port vers le service correspondant en combinaison avec Nginx ou un autre logiciel proxy inversé. Par exemple: