GNU/Linux >> Linux の 問題 >  >> Linux

PHPスクリプトをデーモンプロセスとして実行

別のオプションは、Upstart を使用することです。元々は Ubuntu 用に開発されました (デフォルトでパッケージ化されています) が、すべての Linux ディストリビューションに適していることを意図しています。

このアプローチは、システムの起動時にデーモンを自動的に開始し、スクリプトの完了時に再生成するという点で、Supervisord および daemontools に似ています。

設定方法:

/etc/init/myphpworker.conf に新しいスクリプト ファイルを作成します。 .以下に例を示します:

# 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

デーモンの開始と停止:

sudo service myphpworker start
sudo service myphpworker stop

デーモンが実行されているかどうかを確認します:

sudo service myphpworker status

ありがとう

このテクニックを学んだ Kevin van Zonneveld に大いに感謝します。


を使用して、コマンド ライン (つまり、bash) から php スクリプトを開始できます。

nohup php myscript.php &

& プロセスをバックグラウンドに置きます。

編集:
はい、いくつかの欠点がありますが、制御することはできませんか?それは間違っています。
シンプルな kill processid それを停止します。そして、それは今でも最善かつ最もシンプルなソリューションです。


新しい systemd を使用すると、サービスを作成できます。

/etc/systemd/system/ でファイルまたはシンボリックリンクを作成する必要があります 、例えば。 myphpdaemon.service を配置し、このようなコンテンツを配置すると、myphpdaemon がサービスの名前になります:

[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

コマンドを使用して、サービスの開始、ステータスの取得、再起動、および停止を行うことができます

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

php -S 127.0.0.1:<port> を使用して PHP ネイティブ サーバーを使用できます。 またはスクリプトとして実行します。 PHP スクリプトを使用すると、実行を継続するために一種の「永久ループ」が必要になります。

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

作業例:

[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

PHP ルーチンを (ダイジェストのように) サイクルで 1 回実行する必要がある場合は、PHP を直接使用する代わりに、シェルまたは bash スクリプトを使用して systemd サービス ファイルを呼び出すことができます。例:

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

これらのオプションを選択した場合は、KillMode を mixed に変更する必要があります。 プロセスに対して、bash(main) と PHP(child) が強制終了されます。

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.

<ブロック引用>

注:"myphpdaemon.service" を変更するたびに、`systemctl daemon-reload' を実行する必要がありますが、そうしないと、必要なときにアラートが表示されるので心配しないでください。


Linux
  1. Init.dスクリプトが起動時に実行されていませんか?

  2. Linux OS サービス「scsi_reserve」

  3. PHP スクリプトをテストする方法

  1. Linux サービスを別のユーザーとして実行するためのベスト プラクティス

  2. Linux で Python スクリプトをサービスまたはデーモンのように実行する方法

  3. サービスとしての Ruby スクリプト

  1. バックグラウンド プロセスとしてコマンド ラインから PHP スクリプトを実行する

  2. Linux でのデーモンの作成

  3. Linux:サービスへの処理