เรียกใช้สคริปต์ php เป็นกระบวนการ daemon


154

ฉันต้องการเรียกใช้สคริปต์ php เป็นกระบวนการ daemon (รอคำแนะนำและทำสิ่งต่างๆ) งาน cron จะไม่ทำเพื่อฉันเพราะการกระทำจะต้องดำเนินการทันทีที่คำสั่งมาถึง ฉันรู้ว่า PHP ไม่ใช่ตัวเลือกที่ดีที่สุดสำหรับกระบวนการภูตเนื่องจากปัญหาการจัดการหน่วยความจำ แต่เนื่องจากเหตุผลต่าง ๆ ที่ฉันต้องใช้ PHP ในกรณีนี้ ฉันเจอเครื่องมือโดย libslack ชื่อ Daemon ( http://libslack.org/daemon ) ดูเหมือนว่าจะช่วยฉันจัดการกระบวนการ daemon แต่ไม่มีการปรับปรุงใด ๆ ในช่วง 5 ปีที่ผ่านมาดังนั้นฉันจึงสงสัยว่าคุณรู้ไหม ทางเลือกอื่น ๆ ที่เหมาะสมสำหรับกรณีของฉัน ข้อมูลใด ๆ ที่จะได้รับการชื่นชมจริงๆ


2
โปรดตรวจสอบคำตอบของฉัน ขอบคุณ
Henrik P. Hessel

เกี่ยวข้อง: stackoverflow.com/q/4717167/212218

1
ฉันเจอโพสต์นี้gonzalo123.com/2010/05/23/ …ซึ่งฉันเชื่อว่าทั้งผ่อนคลายและมั่นคง
Teson

มันง่ายมากที่จะทำกับsystemd
LeonanCarvalho

คำตอบ:


167

คุณสามารถเริ่มสคริปต์ php ของคุณจากบรรทัดคำสั่ง (เช่นทุบตี) โดยใช้

nohup php myscript.php &

&ทำให้กระบวนการของคุณในพื้นหลัง

แก้ไข:
ใช่มีข้อบกพร่องบางอย่าง แต่ไม่สามารถควบคุมได้? นั่นเป็นเพียงความผิด
ง่ายๆkill processidจะหยุดมัน และยังคงเป็นทางออกที่ดีที่สุดและง่ายที่สุด


หากเทอร์มินัลอยู่กระบวนการจะไม่ออก นั่นเป็นสาเหตุที่คำสั่ง "nohup" อยู่ที่นั่น ฉันใช้สคริปต์ PHP เป็น daemon ในเซิร์ฟเวอร์ทั้งหมดเช่นนี้มาหลายปีแล้ว อาจมีวิธีแก้ปัญหาที่ดีกว่า แต่นี่เป็นวิธีที่เร็วที่สุด
CDR

27
นี่จะไม่รีสตาร์ท daemon หากล้มเหลวและไม่มีวิธีง่ายๆในการจัดการ daemon เลย
Phil Wallach

6
ฉันเห็นด้วยกับสิ่งที่พูดที่นี่ - นี่เป็นวิธีแก้ปัญหาที่ไม่ดี คุณควรสร้างสคริปต์เริ่มต้นด้วยเหตุผลสองสามประการ: 1) สคริปต์เริ่มต้นถูกเรียกใช้โดยอัตโนมัติเมื่อเริ่มต้น 2) คุณสามารถจัดการ daemon ด้วยคำสั่ง start / stop / restart นี่คือตัวอย่างจาก servfault: serverfault.com/questions/229759/…
Simian

1
เฮ้พวก ... มันดูเหมือนว่าฉันnohupและ&ทำสิ่งเดียวกัน: การแยกกระบวนการเปิดตัวจากความตั้งใจปัจจุบันของเปลือก ทำไมฉันถึงต้องการพวกเขาทั้งคู่ ฉันไม่สามารถเพียงแค่ทำphp myscript.php &หรือnohup myscript.php?? ขอบคุณ
nourdine

1
ถ้าสคริปต์เขียนไป stdout (ผ่านเสียงสะท้อนหรือ var_dump) แล้วคุณสามารถจับข้อมูลนี้กับล็อกไฟล์เช่นนี้:nohup php myscript.php > myscript.log &
มิสชา

167

อีกตัวเลือกหนึ่งคือการใช้พุ่งพรวด เดิมได้รับการพัฒนาสำหรับ Ubuntu (และมาพร้อมกับมันโดยค่าเริ่มต้น) แต่มีวัตถุประสงค์เพื่อให้เหมาะสำหรับ distros Linux ทั้งหมด

วิธีการนี้คล้ายกับSupervisordและdaemontoolsซึ่งจะเริ่ม daemon โดยอัตโนมัติในการบูตระบบและตอบกลับเมื่อสคริปต์เสร็จสมบูรณ์

วิธีตั้งค่า:

/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

ขอบคุณ

ขอบคุณมากที่เควินแวนซอนเนลด์ซึ่งฉันได้เรียนรู้เทคนิคนี้จาก


2
รักสิ่งนี้ แค่สงสัยว่ามันเป็นไปได้ไหมที่จะมีคนทำงานหลายคนพร้อมกัน? ฉันเพิ่งมีปัญหาที่คนงานคนหนึ่งไม่เพียงพออีกต่อไป
มานูเอล

1
สิ่งนี้จะทำงานโดยอัตโนมัติเมื่อเริ่มต้นระบบ?
slier

2
Sudo "บริการ myphpworker start" ไม่ทำงานสำหรับฉัน ฉันใช้ "sudo start myphpworker" และมันทำงานได้อย่างสมบูรณ์แบบ
Matt Sich

3
@Pradeepta นั่นเป็นเพราะมีข้อผิดพลาดในการโพสต์ - ฉันไม่แน่ใจว่าสิ่งที่ (และยังไม่ได้ทดสอบนี้) แต่ฉันคิดว่าsudo service myphpworker start/stop/statusจะทำงานเฉพาะกับบริการที่/etc/init.dไม่ได้อยู่ในบริการพุ่งพรวด @ matt-sich ดูเหมือนว่าจะได้เปิดไวยากรณ์ที่ถูกต้อง อีกตัวเลือกหนึ่งคือใช้ Gearman หรือ Resque ซึ่งช่วยให้สามารถประมวลผลเบื้องหลัง
ckm

3
Ubuntu เองก็กำลังจะย้ายไปใช้ systemd แทนพุ่งพรวด: zdnet.com/article/after-linux-civil-war-ubuntu-to-adopt-systemd
zznet

72

ด้วย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 'แต่ต้องกังวลหากคุณไม่ทำมันจะได้รับการแจ้งเตือนเมื่อมีความจำเป็น


7
คำตอบที่ไม่ถูกต้อง คุณมี +1 ของฉัน
Gergely Lukacsy

2
น่ากลัว หวังว่าเราจะได้คำตอบจากใจเพราะไม่ควรฝังไว้ในหน้านี้
จัสติน

1
คุณควรตรวจสอบsystemctl status <your_service_name> -lผลลัพธ์มันจะทำให้คุณรู้ว่าเกิดอะไรขึ้น
LeonanCarvalho

1
@LeandroTupone MySQL และ Memcached เป็นการสาธิตวิธีการใช้การพึ่งพาบริการที่ไม่จำเป็น
LeonanCarvalho

3
สิ่งนี้ควรแทนที่คำตอบที่ยอมรับซึ่งเห็นขณะนี้ในขณะนี้ในปี 2019
เครื่องเทศ

47

หากคุณสามารถ - คว้าสำเนาของการเขียนโปรแกรมขั้นสูงในสภาพแวดล้อมระบบปฏิบัติการยูนิกซ์ บทที่ 13 ทั้งหมดมีไว้สำหรับการเขียนโปรแกรม daemon ตัวอย่างอยู่ใน C แต่ฟังก์ชั่นทั้งหมดที่คุณต้องการมี wrappers ใน PHP (โดยทั่วไปแล้วpcntlและposix extension)

ในคำสองสามคำ - การเขียน daemon (สิ่งนี้สามารถใช้ได้บนระบบปฏิบัติการ * * * * * * * * nix - Windows ใช้บริการ) เป็นดังนี้:

  1. โทรumask(0)เพื่อป้องกันปัญหาสิทธิ์
  2. fork() และมีทางออกหลัก
  3. โทรsetsid().
  4. การตั้งค่าการประมวลผลสัญญาณSIGHUP(โดยปกติจะถูกละเว้นหรือใช้เพื่อส่งสัญญาณให้ daemon เพื่อโหลดการกำหนดค่าใหม่) และSIGTERM(เพื่อบอกให้กระบวนการออกจากระบบอย่างสง่างาม)
  5. fork() อีกครั้งและมีทางออกหลัก
  6. เปลี่ยน dir chdir()ทำงานปัจจุบันด้วย
  7. fclose() stdin, stdoutและstderrและไม่ได้เขียนถึงพวกเขา วิธีที่ไม่ถูกต้องคือการเปลี่ยนเส้นทางไปยัง/dev/nullไฟล์ใดไฟล์หนึ่ง แต่ฉันไม่สามารถหาวิธีที่จะทำได้ใน PHP เป็นไปได้เมื่อคุณเรียกใช้ daemon เพื่อเปลี่ยนเส้นทางโดยใช้เชลล์ (คุณจะต้องค้นหาด้วยตัวคุณเองว่าต้องทำอย่างไรฉันไม่รู้ :)
  8. ทำงานของคุณ!

นอกจากนี้เนื่องจากคุณใช้ PHP ระวังการอ้างอิงแบบวนรอบเนื่องจากตัวรวบรวมขยะ PHP ก่อน PHP 5.3 ไม่มีวิธีรวบรวมการอ้างอิงเหล่านั้นและกระบวนการจะใช้หน่วยความจำรั่วจนกว่าจะล้มเหลวในที่สุด


1
ขอบคุณสำหรับข้อมูล. ดูเหมือนว่าโปรแกรม daemon ของ libslack ค่อนข้างจะทำงานเตรียมการทั้งหมดตามที่คุณพูดถึง ฉันคิดว่าตอนนี้ฉันจะติดกับมันจนกว่าฉันจะหาทางเลือกที่ดีอื่น ๆ
Beier

1
พบโพสต์นี้รหัสที่คาดว่าจะคัดลอกและวางลงในแอปพลิเคชันเก่า ๆ ที่ล้มเหลวในการปิด stdin ฯลฯ รู้สึกผิดหวัง : p
ThiefMaster

1
ทำไม (5) ทางแยก () อีกครั้ง?
TheFox

ทำงานให้ฉัน - งานยอดเยี่ยม!
Gautam Sharma

สำหรับผู้อ่านในอนาคตที่ถามว่าทำไมต้องแยกสองครั้ง: stackoverflow.com/questions/881388/… - TL; DR: ป้องกันซอมบี้
Ghedipunk

24

ฉันใช้ PHP daemons จำนวนมาก

ฉันเห็นด้วยกับคุณว่า PHP ไม่ใช่ภาษาที่ดีที่สุด (หรือแม้แต่ภาษาที่ดี) สำหรับการทำเช่นนี้ แต่ daemons ใช้รหัสร่วมกับองค์ประกอบที่ใช้กับเว็บดังนั้นโดยรวมจึงเป็นทางออกที่ดีสำหรับเรา

เราใช้ daemontools สำหรับสิ่งนี้ มันฉลาดสะอาดและเชื่อถือได้ ในความเป็นจริงเราใช้เพื่อเรียกใช้ daemons ทั้งหมดของเรา

คุณสามารถตรวจสอบนี้ออกที่http://cr.yp.to/daemontools.html

แก้ไข: รายการคุณสมบัติอย่างรวดเร็ว

  • เริ่ม daemon โดยอัตโนมัติเมื่อรีบูต
  • รีสตาร์ท dameon โดยอัตโนมัติเมื่อเกิดความล้มเหลว
  • การบันทึกนั้นได้รับการจัดการสำหรับคุณรวมถึงการโรลโอเวอร์และการตัดแต่ง
  • อินเทอร์เฟซการจัดการ: 'svc' และ 'svstat'
  • เป็นมิตรกับ UNIX (อาจไม่ใช่ข้อดีสำหรับทุกคน)

สามารถติดตั้งได้จากที่เก็บเช่นใน apt!
Kzqai

14

คุณสามารถ

  1. ใช้nohupตามคำแนะนำของเฮนริก
  2. ใช้screenและเรียกใช้โปรแกรม PHP ของคุณเป็นกระบวนการปกติภายใน nohupนี้จะช่วยให้คุณสามารถควบคุมได้มากกว่าการใช้
  3. ใช้ daemoniser เช่น http://supervisord.org/ (เขียนเป็น Python แต่สามารถ daemonise โปรแกรมบรรทัดคำสั่งใดก็ได้และให้การควบคุมระยะไกลแก่คุณเพื่อจัดการ)
  4. เขียน wrapper daemonise ของคุณเองตามที่ Emil แนะนำ แต่มันเกินไป IMO

ฉันขอแนะนำวิธีที่ง่ายที่สุด (หน้าจอในความคิดของฉัน) แล้วถ้าคุณต้องการคุณสมบัติหรือฟังก์ชั่นเพิ่มเติมให้ย้ายไปยังวิธีการที่ซับซ้อนมากขึ้น


คุณช่วยกำหนดค่า supervisord ที่คล้ายกัน
Alix Axel

11

มีมากกว่าหนึ่งวิธีในการแก้ปัญหานี้

ฉันไม่ทราบรายละเอียดเฉพาะ แต่อาจมีวิธีที่จะทำให้กระบวนการ PHP ทำงานได้ ตัวอย่างเช่นหากคุณต้องการรหัสที่จะเรียกใช้ตามเหตุการณ์ในฐานข้อมูล SQL คุณสามารถตั้งค่าทริกเกอร์เพื่อรันสคริปต์ของคุณ นี่เป็นเรื่องง่ายที่จะทำภายใต้ PostgreSQL: http://www.postgresql.org/docs/current/static/external-pl.html http://www.postgresql.org/docs/current/static/external-pl.html

สุจริตฉันคิดว่าทางออกที่ดีที่สุดของคุณคือการสร้างกระบวนการ Damon โดยใช้ nohup nohup อนุญาตให้คำสั่งดำเนินการต่อได้แม้หลังจากผู้ใช้ออกจากระบบแล้ว:

nohup php myscript.php &

อย่างไรก็ตามมีปัญหาร้ายแรงมาก อย่างที่คุณบอกว่าตัวจัดการหน่วยความจำของ PHP นั้นเป็นขยะที่สมบูรณ์มันถูกสร้างขึ้นโดยมีข้อสันนิษฐานว่าสคริปต์กำลังดำเนินการเพียงไม่กี่วินาทีและมีอยู่แล้ว สคริปต์ PHP ของคุณจะเริ่มใช้หน่วยความจำ GIGABYTES หลังจากนั้นไม่กี่วัน คุณต้องสร้างสคริปต์ cron ที่ทำงานทุกๆ 12 หรือ 24 ชั่วโมงซึ่งจะฆ่าและวางสคริปต์ php ของคุณใหม่ดังนี้:

killall -3 php
nohup php myscript.php &

แต่ถ้าสคริปต์อยู่กลางงานล่ะ Well kill -3 คือการขัดจังหวะมันเหมือนกับการทำ ctrl + c บน CLI สคริปต์ php ของคุณสามารถดักจับอินเทอร์รัปต์นี้และออกจากระบบได้อย่างสง่างามโดยใช้ไลบรารี PHP pcntl: http://php.oregonstate.edu/manual/en/function.pcntl-signal.php

นี่คือตัวอย่าง:

function clean_up() {
  GLOBAL $lock;
  mysql_close();
  fclose($lock)
  exit();
}
pcntl_signal(SIGINT, 'clean_up');

แนวคิดเบื้องหลังการ $ lock คือสคริปต์ PHP สามารถเปิดไฟล์ที่มี fopen ("file", "w"); มีเพียงหนึ่งกระบวนการเท่านั้นที่สามารถล็อคการเขียนไฟล์ดังนั้นการใช้สิ่งนี้ทำให้คุณมั่นใจได้ว่ามีสคริปต์ PHP ของคุณทำงานอยู่

โชคดี!



6

ตรวจสอบhttps://github.com/shaneharter/PHP-Daemon

นี่เป็นไลบรารี daemon เชิงวัตถุ มันมีการสนับสนุนในตัวสำหรับสิ่งต่าง ๆ เช่นการบันทึกและการกู้คืนข้อผิดพลาดและมีการสนับสนุนสำหรับการสร้างผู้ทำงานเบื้องหลัง


3

ฉันเพิ่งมีความต้องการโซลูชันข้ามแพลตฟอร์ม (Windows, Mac และ Linux) กับปัญหาในการใช้งานสคริปต์ PHP เป็น daemons ฉันแก้ไขปัญหาด้วยการเขียนโซลูชันที่ใช้ภาษา C ++ และสร้างไบนารี:

https://github.com/cubiclesoft/service-manager/

รองรับ Linux อย่างสมบูรณ์ (ผ่าน sysvinit) แต่ยังรวมถึงบริการ Windows NT และ Mac OSX launchd

หากคุณต้องการเพียง Linux แล้วโซลูชันอื่น ๆ ที่นำเสนอที่นี่ทำงานได้ดีพอและขึ้นอยู่กับรสชาติ นอกจากนี้ยังมีการพุ่งพรวดและ systemd วันนี้ซึ่งมีทางเลือกในการสคริปต์ sysvinit แต่ครึ่งหนึ่งของการใช้ PHP คือมันเป็นแพลตฟอร์มข้ามแพลตฟอร์มดังนั้นการเขียนโค้ดในภาษาจึงมีโอกาสที่ดีมากที่จะทำงานได้ทุกที่ตามที่เป็นอยู่ ข้อบกพร่องเริ่มปรากฏขึ้นเมื่อบางแง่มุมภายนอก OS ระดับพื้นเมืองบางอย่างเข้ามาในรูปภาพเช่นบริการระบบ แต่คุณจะได้รับปัญหาที่เกิดขึ้นกับภาษาสคริปต์ส่วนใหญ่

ความพยายามในการจับสัญญาณเป็นคนที่แนะนำที่นี่ใน PHP userland ไม่ใช่ความคิดที่ดี อ่านเอกสารเกี่ยวกับpcntl_signal()อย่างระมัดระวังและคุณจะได้เรียนรู้อย่างรวดเร็วว่า PHP จัดการสัญญาณโดยใช้วิธีการที่ไม่พึงประสงค์ (โดยเฉพาะ 'เห็บ') ที่เคี้ยววงจรหลายอย่างสำหรับกระบวนการที่ไม่ค่อยเห็น (เช่นสัญญาณ) การจัดการสัญญาณใน PHP นั้นแทบจะไม่พร้อมใช้งานบนแพลตฟอร์ม POSIX เท่านั้นและการสนับสนุนแตกต่างกันไปตามเวอร์ชันของ PHP ตอนแรกมันฟังดูเหมือนเป็นคำตอบที่ดี แต่มันสั้นมากที่จะเป็นประโยชน์อย่างแท้จริง

PHP ยังเริ่มดีขึ้นเกี่ยวกับปัญหาการรั่วไหลของหน่วยความจำเมื่อเวลาผ่านไป คุณยังคงต้องระวัง (ตัวแยกวิเคราะห์ DOM XML มีแนวโน้มที่จะรั่วไหล) แต่ฉันไม่ค่อยเห็นกระบวนการหลบหนีในวันนี้และตัวติดตามข้อผิดพลาดของ PHP ค่อนข้างเงียบเมื่อเทียบกับสมัยก่อน


1

อย่างที่คนอื่น ๆ พูดไปแล้วการใช้ PHP เป็น daemon นั้นค่อนข้างง่ายและสามารถทำได้โดยใช้คำสั่งเพียงบรรทัดเดียว แต่ปัญหาที่แท้จริงคือการทำให้มันทำงานและจัดการมัน ฉันเคยมีปัญหาแบบเดียวกันเมื่อไม่นานมานี้และถึงแม้ว่าจะมีวิธีแก้ปัญหามากมายที่มีอยู่ แต่ส่วนใหญ่มีการพึ่งพาจำนวนมากหรือใช้งานยากและไม่เหมาะสำหรับการใช้งานขั้นพื้นฐาน ฉันเขียนเชลล์สคริปต์ที่สามารถจัดการกระบวนการ / แอปพลิเคชันใด ๆ รวมถึงสคริปต์ PHP cli สามารถตั้งค่าเป็น cronjob เพื่อเริ่มแอปพลิเคชันและจะมีแอปพลิเคชันและจัดการมัน หากมีการดำเนินการอีกครั้งตัวอย่างเช่นผ่าน cronjob เดียวกันตรวจสอบว่าแอปทำงานอยู่หรือไม่หากแอปนั้นออกจากระบบและปล่อยให้อินสแตนซ์ก่อนหน้านี้จัดการแอปพลิเคชันต่อไป

ฉันอัปโหลดไปยัง github อย่าลังเลที่จะใช้: https://github.com/sinasalek/EasyDeamonizer

EasyDeamonizer

เพียงเฝ้าดูแอปพลิเคชันของคุณ (เริ่มรีสตาร์ทบันทึกตรวจสอบและอื่น ๆ ) สคริปต์ทั่วไปเพื่อให้แน่ใจว่าใบสมัครของคุณยังคงทำงานอย่างถูกต้อง โดยเจตนาจะใช้ชื่อกระบวนการในการสร้างไฟล์ pid / lock เพื่อป้องกันผลข้างเคียงทั้งหมดและทำให้สคริปต์นั้นเรียบง่ายและปั่นป่วนที่สุดเท่าที่จะเป็นไปได้ดังนั้นจึงสามารถใช้งานได้แม้ว่าจะรีสตาร์ท EasyDaemonizer แล้วก็ตาม คุณสมบัติ

  • เริ่มต้นแอปพลิเคชันและอาจเลือกกำหนดเวลาล่าช้าสำหรับการเริ่มต้นแต่ละครั้ง
  • ตรวจสอบให้แน่ใจว่ามีเพียงหนึ่งอินสแตนซ์เท่านั้นที่ทำงาน
  • ตรวจสอบการใช้งาน CPU และรีสตาร์ทแอปโดยอัตโนมัติเมื่อถึงเกณฑ์ที่กำหนด
  • การตั้งค่า EasyDeamonizer ให้เรียกใช้ผ่าน cron เพื่อให้ทำงานได้อีกครั้งหากหยุดทำงานไม่ว่าด้วยเหตุผลใดก็ตาม
  • บันทึกกิจกรรมของมัน

1

ขยาย คำตอบEmil Ivaovคุณสามารถทำสิ่งต่อไปนี้เพื่อปิด STDIN, STDOUT และ STDERROR ใน php

if (!fclose(STDIN)) {
    exit("Could not close STDIN");
}

if (!fclose(STDOUT)) {
    exit("Could not close STDOUT");
}

if (!fclose(STDERR)) {
    exit("Could not close STDERR");
}

$STDIN = fopen('/dev/null', 'r');
$STDOUT = fopen('/dev/null', 'w');
$STDERR = fopen('/var/log/our_error.log', 'wb');

โดยทั่วไปแล้วคุณปิดสตรีมมาตรฐานเพื่อให้ PHP ไม่มีที่เขียน ต่อไปนี้fopenสายจะตั้งมาตรฐาน IO /dev/nullไป

ฉันได้อ่านสิ่งนี้จากหนังสือของRob Aley - PHP นอกเหนือจากเว็บแล้ว


0

ฉันเขียนและปรับใช้ php-daemon อย่างง่ายรหัสออนไลน์อยู่ที่นี่

https://github.com/jmullee/PhpUnixDaemon

คุณสมบัติ: สิทธิ์ลดลง, การจัดการสัญญาณ, การบันทึก

ฉันใช้มันในตัวจัดการคิว (กรณีการใช้งาน: ทริกเกอร์การดำเนินการที่มีความยาวจากหน้าเว็บโดยไม่ต้องรอการสร้างหน้า php คือเริ่มการทำงานแบบอะซิงโครนัส) https://github.com/jmullee/PhpIPCMessageQueue


0

คุณสามารถตรวจสอบ PM2 ที่นี่คือhttp://pm2.keymetrics.io/

สร้างไฟล์ ssh เช่น worker.sh ใส่ลงในสคริปต์ PHP ของคุณที่คุณจะจัดการกับ

worker.sh

php /path/myscript.php

ภูตเริ่มต้น

pm2 start worker.sh

ไชโยนั่นแหละ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.