Je dois exécuter le PHP WebSocket scripté dans PHP 24/7/365 en tant que service automatiquement à chaque fois que le serveur redémarre/arrête/démarre le processus. Le processus doit invoquer automatiquement
Supposons que si nous accédons au fichier test.php à partir du navigateur, c'est-à-dire www.example.com/libraries/server/test.php
, il démarre et continue de s'exécuter avec le port 8080.
Cependant, supposons que si nous essayons de terminer le processus en éliminant avec les commandes ci-dessous
# kill $(lsof -t -i:8080)
# lsof -i:8080
Il doit être invoqué automatiquement
Si nous prévoyons de fonctionner en tant que planificateur avec un travail cron toutes les secondes ou tous les jours. Comment pouvons-nous compromettre avec la compensation supportée par le temps de disponibilité du serveur ainsi que par les temps d'arrêt du serveur? ou si aucune des options n'est laissée, supposons que si nous essayons d'exécuter le travail cron toutes les secondes, comment puis-je écrire le code dans le code, que WebSocket s'exécute avec le port 8080, s'il n'est pas exécuté, Shell_exec()
ou via exec()
commandes
Voici le code pour test.php
<?php
# The maximum execution time, in seconds. If set to zero, no time limit is imposed.
set_time_limit(0);
# Make sure to keep alive the script when a client disconnect.
ignore_user_abort(true);
error_reporting(E_ALL);
ini_set('display_errors', 'On');
error_reporting(-1); // reports all errors
ini_set("display_errors", "1"); // shows all errors
ini_set("log_errors", 1);
ini_set("error_log", "/var/www/vhosts/somedomain.com/httpdocs/websocket.log");
echo "Script start at: " . date('h:i:s') . "\n";
exec('bash -c "exec Nohup php websocket_server.php >> /var/www/vhosts/somedomain.com/httpdocs/websocket.log 2>&1 &"');
Shell_exec('Nohup php /var/www/vhosts/somedomain.com/httpdocs/proj_ci/application/libraries/server/websocket_server.php 2>&1 >> /var/www/vhosts/somedomain.com/httpdocs/websocket.log &');
echo "Script end at: " . date('h:i:s');
?>
Alors, comment dois-je exécuter le processus en tant que service automatisé au démarrage du serveur HTTP?
À l’aide de supervisor
ou systemd
, qui le lance en arrière-plan et le maintient en marche. Quelles devraient être les commandes Linux à exécuter via SSH?
systemd
pour exécuter PHP en tant que démon/servicephp_socketme.sh
#!/bin/bash
Nohup /usr/bin/php /var/www/vhosts/somedomain.com/httpdocs/libraries/server/test.php >> /var/www/vhosts/somedomain.com/httpdocs/php_socketme.log 2>&1
php_socketme.service
[Unit]
Description=RunningPHPWebSockets(socketme.io)
[Service]
User=root
ExecStart=/var/www/vhosts/somedomain.com/httpdocs/libraries/server/php_socketme.sh
[Install]
WantedBy=multi-user.target
Du terminal
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# ./php_socketme.sh
-bash: ./php_socketme.sh: Permission denied
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# chmod a+x socketme.sh
chmod: cannot access 'socketme.sh': No such file or directory
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# chmod a+x php_socketme.sh
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# ./php_socketme.sh
-bash: ./php_socketme.sh: /bin/bash^M: bad interpreter: No such file or directory
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# dos2unix php_socketme.sh
dos2unix: Datei php_socketme.sh wird ins Unix-Format umgewandelt ...
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# chmod 755 test.php
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# cp php_socketme.service /etc/systemd/system/php_socketme.service
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl daemon-reload
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl start php_socketme.service
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl status php_socketme.service
● php_socketme.service - RunningPHPWebSockets(socketme.io)
Loaded: loaded (/etc/systemd/system/php_socketme.service; disabled; vendor preset: enabled)
Active: active (running) since Fr 2018-11-16 16:06:18 IST; 4min 9s ago
Main PID: 29799 (myphp.sh)
CGroup: /system.slice/php_socketme.service
├─29799 /bin/bash /var/www/vhosts/somedomain.com/httpdocs/libraries/server/myphp.sh
└─29800 /usr/bin/php /var/www/vhosts/somedomain.com/httpdocs/libraries/server/myservice.php
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl stop php_socketme.service
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl status php_socketme.service
● php_socketme.service - RunningPHPWebSockets(socketme.io)
Loaded: loaded (/etc/systemd/system/php_socketme.service; disabled; vendor preset: enabled)
Active: inactive (dead)
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl enable php_socketme.service
Created symlink from /etc/systemd/system/multi-user.target.wants/php_socketme.service to /etc/systemd/system/php_socketme.service.
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl is-enabled php_socketme.service
enabled
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server#
webs.sh
#!/bin/bash
### BEGIN INIT INFO
# Provides: webSocket
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: php webSocket
# Description: php webSocket
### END INIT INFO
Nohup /usr/bin/php /var/www/vhosts/somedomain.com/httpdocs/libraries/server/websocket_server.php >> /var/www/vhosts/somedomain.com/httpdocs/custom_logs/webssh.log 2>&1
websocket.service
[Unit]
Description=php webSocket
After=syslog.target network.target
[Service]
User=root
Type=simple
ExecStart=/var/www/vhosts/somedomain.com/httpdocs/libraries/server/webs.sh >> /var/www/vhosts/somedomain.com/httpdocs/custom_logs/AllStandardOutput.log>> /var/www/vhosts/somedomain.com/httpdocs/custom_logs/AllStandardError.log
TimeoutStopSec=20
KillMode=process
Restart=always
RestartSec=2
StandardOutput=file:/var/www/vhosts/somedomain.com/httpdocs/custom_logs/StandardOutput.log
StandardError=file:/var/www/vhosts/somedomain.com/httpdocs/custom_logs/StandardError.log
[Install]
WantedBy=multi-user.target
Alias=websocket.service
Les commandes sont comme suit
cp websocket.service /etc/systemd/system/websocket.service
systemctl daemon-reload
systemctl start websocket.service
systemctl status websocket.service
systemctl stop websocket.service
systemctl restart websocket.service
systemctl enable websocket.service
systemctl is-enabled websocket.service
systemctl disable websocket.service
lsof -i:8080
ExecStart=/bin/sh -c '/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server 2>&1 > /var/log.log'
ExecStart=/usr/bin/sh -c 'exec /usr/bin/my_binary [arguments] >>/var/log/flume-ng/log1.log 2>>/var/log/flume-ng/log2.log'
Si vous souhaitez conserver le journal des fichiers entre les redémarrages du service et y ajouter simplement les nouvelles lignes enregistrées, utilisez plutôt:
ExecStart=/usr/bin/sh -c 'exec /usr/bin/my_binary [arguments] >>/var/log/flume-ng/log1.log 2>>/var/log/flume-ng/log2.log'
exec signifie que le programme shell sera remplacé par le programme my_binary après la configuration des redirections sans forking. Donc, il ne sera pas différent d'exécuter my_binary directement après ExecStart=
.
Dans le pare-feu
Stratégie système pour le trafic entrant Autoriser tout autre trafic entrant
OR
créer une règle personnalisée:
WebSockets Autoriser les entrées de tous sur les ports 8080/tcp, 8080/udp