GNU/Linux >> Znalost Linux >  >> Linux

Spusťte php skript jako proces démona

Další možností je použít Upstart. Původně byl vyvinut pro Ubuntu (a je s ním standardně dodáván), ale má být vhodný pro všechny linuxové distribuce.

Tento přístup je podobný jako Supervisord a daemontools v tom, že automaticky spustí démona při startu systému a znovu se objeví po dokončení skriptu.

Jak to nastavit:

Vytvořte nový soubor skriptu na /etc/init/myphpworker.conf . Zde je příklad:

# 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

Spuštění a zastavení vašeho démona:

sudo service myphpworker start
sudo service myphpworker stop

Zkontrolujte, zda váš démon běží:

sudo service myphpworker status

Děkuji

Velké díky Kevinu van Zonneveldovi, od kterého jsem se tuto techniku ​​naučil.


Skript php můžete spustit z příkazového řádku (tj. bash) pomocí

nohup php myscript.php &

& přesune váš proces do pozadí.

Upravit:
Ano, existují určité nevýhody, ale nelze je ovládat? To je prostě špatně.
Jednoduchý kill processid zastaví to. A stále je to nejlepší a nejjednodušší řešení.


S novým systemd můžete vytvořit službu.

Musíte vytvořit soubor nebo symbolický odkaz v /etc/systemd/system/ , např. myphpdaemon.service a umístěte obsah, jako je tento, myphpdaemon bude název služby:

[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

Budete moci spustit, získat stav, restartovat a zastavit služby pomocí příkazu

systemctl <start|status|restart|stop|enable> myphpdaemon

Můžete použít nativní server PHP pomocí php -S 127.0.0.1:<port> nebo jej spusťte jako skript. Pomocí PHP skriptu byste měli mít jakousi "věčnou smyčku", abyste mohli pokračovat v běhu.

<?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
        }
    }
}

Pracovní příklad:

[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

Pokud by se vaše PHP rutina měla spouštět jednou za cyklus (jako diggest), můžete použít shell nebo bash skript k vyvolání do servisního souboru systemd místo přímo PHP, například:

#!/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

Pokud zvolíte tuto možnost, měli byste změnit KillMode na mixed k procesům, bash(main) a PHP(child) budou zabity.

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.

Poznámka:Pokaždé, když změníte svůj "myphpdaemon.service", musíte spustit `systemctl daemon-reload', ale pokud to neuděláte, nebojte se, bude to v případě potřeby upozorněno.


Linux
  1. Služba OS Linux „scsi_reserve“

  2. Jak testovat PHP skript

  3. Jak mohu spustit skript v Perlu jako systémový démon v linuxu?

  1. Jak zajistit, aby skript Python běžel jako služba nebo démon v Linuxu

  2. Ruby skript jako služba

  3. Spuštění PHP skriptu z příkazového řádku jako proces na pozadí

  1. Jak zajistit, aby skript Python běžel jako služba?

  2. Spusťte bash skript jako démona

  3. Jak spustit sbt jako démona?