別のオプションは、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' を実行する必要がありますが、そうしないと、必要なときにアラートが表示されるので心配しないでください。