ด้วยsystemdใหม่ คุณสามารถสร้างบริการ
คุณต้องสร้างไฟล์หรือsymlinkใน /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 ควรมี "ลูป" เพื่อใช้งานต่อไป
<?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 ของคุณควรถูกเรียกใช้ครั้งเดียวในรอบ (เช่นไดเจสต์) คุณควรใช้เชลล์หรือสคริปสคริปต์เพื่อเรียกใช้ในไฟล์เซอร์วิส systemd แทน PHP โดยตรงตัวอย่างเช่น:
#!/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
กับกระบวนการทุบตี (หลัก) และ PHP (เด็ก) ถูกฆ่าตาย
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 'แต่ต้องกังวลหากคุณไม่ทำมันจะได้รับการแจ้งเตือนเมื่อมีความจำเป็น