Pilihan lainnya adalah menggunakan Pemula. Ini awalnya dikembangkan untuk Ubuntu (dan dikemas dengannya secara default), tetapi dimaksudkan agar cocok untuk semua distro Linux.
Pendekatan ini mirip dengan Supervisord dan daemontools, yang secara otomatis memulai daemon saat boot sistem dan muncul kembali saat skrip selesai.
Cara menyiapkannya:
Buat file skrip baru di /etc/init/myphpworker.conf
. Ini contohnya:
# 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
Memulai &menghentikan daemon Anda:
sudo service myphpworker start
sudo service myphpworker stop
Periksa apakah daemon Anda berjalan:
sudo service myphpworker status
Terima kasih
Terima kasih banyak kepada Kevin van Zonneveld, tempat saya mempelajari teknik ini.
Anda dapat memulai skrip php Anda dari baris perintah (yaitu bash) dengan menggunakan
nohup php myscript.php &
&
letakkan proses Anda di latar belakang.
Sunting:
Ya, ada beberapa kekurangan, tetapi tidak mungkin untuk dikendalikan? Itu salah.
Sebuah kill processid
sederhana akan menghentikannya. Dan itu masih merupakan solusi terbaik dan paling sederhana.
Dengan systemd baru Anda dapat membuat layanan.
Anda harus membuat file atau symlink di /etc/systemd/system/
, mis. myphpdaemon.service dan tempatkan konten seperti ini, myphpdaemon akan menjadi nama layanan:
[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
Anda akan dapat memulai, mendapatkan status, memulai ulang, dan menghentikan layanan menggunakan perintah
systemctl <start|status|restart|stop|enable> myphpdaemon
Anda dapat menggunakan server asli PHP menggunakan php -S 127.0.0.1:<port>
atau jalankan sebagai skrip. Dengan menggunakan skrip PHP, Anda harus memiliki semacam "loop selamanya" untuk terus berjalan.
<?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
}
}
}
Contoh kerja:
[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
Jika rutinitas PHP Anda harus dijalankan sekali dalam satu siklus (seperti intisari), Anda dapat menggunakan skrip shell atau bash untuk dipanggil ke file layanan sistem alih-alih PHP secara langsung, misalnya:
#!/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
Jika Anda memilih opsi ini, Anda harus mengubah KillMode menjadi mixed
untuk memproses, bash(main) dan PHP(child) dibunuh.
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.
Catatan:Setiap kali Anda mengubah "myphpdaemon.service" Anda, Anda harus menjalankan `systemctl daemon-reload', tetapi jangan khawatir jika Anda tidak melakukannya, ini akan diberi tahu saat diperlukan.