Với systemd mới, bạn có thể tạo một dịch vụ.
Bạn phải tạo một tập tin hoặc một liên kết tượng trưng trong /etc/systemd/system/
, ví dụ. myphpdaemon.service và đặt nội dung như thế này, myphpdaemon sẽ là tên của dịch vụ:
[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
Bạn sẽ có thể bắt đầu, nhận trạng thái, khởi động lại và dừng dịch vụ bằng lệnh
systemctl <start|status|restart|stop|enable> myphpdaemon
Kịch bản PHP nên có một loại "vòng lặp" để tiếp tục chạy.
<?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
}
}
}
Ví dụ làm việc:
[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
Nếu thường trình PHP của bạn nên được thực thi một lần trong một chu kỳ (như một digest), bạn có thể nên sử dụng tập lệnh shell hoặc bash để được gọi vào tệp dịch vụ systemd thay vì trực tiếp PHP, ví dụ:
#!/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
Nếu bạn chọn các tùy chọn mà bạn nên thay đổi KillMode đến mixed
các quy trình, bash (chính) và PHP (trẻ em) bị giết.
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.
Lưu ý: Mỗi khi bạn thay đổi "myphpdaemon.service", bạn phải chạy `systemctl daemon-reload ', nhưng lo lắng nếu bạn không làm, nó sẽ được cảnh báo khi cần thiết.