Eine weitere Option ist die Verwendung von Upstart. Es wurde ursprünglich für Ubuntu entwickelt (und wird standardmäßig mitgeliefert), soll aber für alle Linux-Distributionen geeignet sein.
Dieser Ansatz ähnelt Supervisord und Daemontools, da es den Daemon automatisch beim Systemstart startet und nach Abschluss des Skripts neu startet.
So richten Sie es ein:
Erstellen Sie eine neue Skriptdatei unter /etc/init/myphpworker.conf
. Hier ist ein Beispiel:
# Info
description "My PHP Worker"
author "Jonathan"
# Events
start on startup
stop on shutdown
# Automatically respawn
respawn
respawn limit 20 5
# Run the script!
# Note, in this example, if your PHP script returns
# the string "ERROR", the daemon will stop itself.
script
[ $(exec /usr/bin/php -f /path/to/your/script.php) = 'ERROR' ] && ( stop; exit 1; )
end script
Daemon starten und stoppen:
sudo service myphpworker start
sudo service myphpworker stop
Überprüfen Sie, ob Ihr Daemon läuft:
sudo service myphpworker status
Danke
Ein großes Dankeschön an Kevin van Zonneveld, von dem ich diese Technik gelernt habe.
Sie können Ihr PHP-Skript von der Befehlszeile (z. B. Bash) aus starten, indem Sie
verwenden
nohup php myscript.php &
die &
stellt Ihren Prozess in den Hintergrund.
Bearbeiten:
Ja, es gibt einige Nachteile, aber nicht möglich zu kontrollieren? Das ist einfach falsch.
Eine einfache kill processid
wird es stoppen. Und es ist immer noch die beste und einfachste Lösung.
Mit new systemd können Sie einen Dienst erstellen.
Sie müssen eine Datei oder einen Symlink in /etc/systemd/system/
erstellen , z.B. myphpdaemon.service und Inhalte wie diesen platzieren, wird myphpdaemon der Name des Dienstes sein:
[Unit]
Description=My PHP Daemon Service
#May your script needs MySQL or other services to run, eg. MySQL Memcached
Requires=mysqld.service memcached.service
After=mysqld.service memcached.service
[Service]
User=root
Type=simple
TimeoutSec=0
PIDFile=/var/run/myphpdaemon.pid
ExecStart=/usr/bin/php -f /srv/www/myphpdaemon.php arg1 arg2> /dev/null 2>/dev/null
#ExecStop=/bin/kill -HUP $MAINPID #It's the default you can change whats happens on stop command
#ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
StandardOutput=null #If you don't want to make toms of logs you can set it null if you sent a file or some other options it will send all PHP output to this one.
StandardError=/var/log/myphpdaemon.log
[Install]
WantedBy=default.target
Sie können die Dienste mit dem Befehl
starten, Status abrufen, neu starten und stoppen
systemctl <start|status|restart|stop|enable> myphpdaemon
Sie können den nativen PHP-Server mit php -S 127.0.0.1:<port>
verwenden oder als Skript ausführen. Wenn Sie ein PHP-Skript verwenden, sollten Sie eine Art "Endlosschleife" haben, um weiter ausgeführt zu werden.
<?php
gc_enable();//
while (!connection_aborted() || PHP_SAPI == "cli") {
//Code Logic
//sleep and usleep could be useful
if (PHP_SAPI == "cli") {
if (rand(5, 100) % 5 == 0) {
gc_collect_cycles(); //Forces collection of any existing garbage cycles
}
}
}
Arbeitsbeispiel:
[Unit]
Description=PHP APP Sync Service
Requires=mysqld.service memcached.service
After=mysqld.service memcached.service
[Service]
User=root
Type=simple
TimeoutSec=0
PIDFile=/var/run/php_app_sync.pid
ExecStart=/bin/sh -c '/usr/bin/php -f /var/www/app/private/server/cron/app_sync.php 2>&1 > /var/log/app_sync.log'
KillMode=mixed
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=default.target
Wenn Ihre PHP-Routine einmal in einem Zyklus ausgeführt werden soll (wie ein Digest), können Sie anstelle von PHP direkt ein Shell- oder Bash-Skript verwenden, das in der Systemdienstdatei aufgerufen wird, zum Beispiel:
#!/usr/bin/env bash
script_path="/app/services/"
while [ : ]
do
# clear
php -f "$script_path"${1}".php" fixedparameter ${2} > /dev/null 2>/dev/null
sleep 1
done
Wenn Sie diese Option gewählt haben, sollten Sie den KillMode auf mixed
ändern zu Prozessen, bash(main) und PHP(child) getötet werden.
ExecStart=/app/phpservice/runner.sh phpfile parameter > /dev/null 2>/dev/null
KillMode=process
This method also is effective if you're facing a memory leak.
Hinweis:Jedes Mal, wenn Sie Ihren "myphpdaemon.service" ändern, müssen Sie `systemctl daemon-reload' ausführen, aber machen Sie sich Sorgen, wenn Sie dies nicht tun, wird es gewarnt, wenn es nötig ist.