GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Führen Sie das PHP-Skript als Daemon-Prozess aus

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.


Linux
  1. Init.d-Skript wird beim Booten nicht ausgeführt?

  2. Linux-Betriebssystemdienst „scsi_reserve“

  3. So testen Sie ein PHP-Skript

  4. Wie kann ich ein Perl-Skript als System-Daemon unter Linux ausführen?

  5. Wie man ein Python-Skript wie einen Dienst oder Daemon in Linux laufen lässt

So führen Sie ein Python-Skript in PHP aus

So führen Sie Shell-Skript als SystemD-Dienst in Linux aus

So führen Sie ein Bash-Skript aus

Führen Sie den Prozess mit Echtzeitausgabe in PHP aus

Wie lässt sich ein Python-Skript als Dienst ausführen?

Führen Sie das Bash-Skript als Daemon aus