डेमॉन प्रक्रिया के रूप में php स्क्रिप्ट चलाएँ


154

मुझे डेमन प्रक्रिया के रूप में php स्क्रिप्ट चलाने की जरूरत है (निर्देशों का इंतजार करें और सामान करें)। क्रॉन जॉब मेरे लिए ऐसा नहीं करेगा क्योंकि निर्देश आते ही कार्रवाई की जानी चाहिए। मुझे पता है कि मेमोरी प्रबंधन के मुद्दों के कारण PHP वास्तव में डेमॉन प्रक्रियाओं के लिए सबसे अच्छा विकल्प नहीं है, लेकिन विभिन्न कारणों से मुझे इस मामले में PHP का उपयोग करना होगा। मुझे डेमन ( http://libslack.org/daemon ) नाम से libslack का एक टूल आया, इससे मुझे डेमन प्रक्रियाओं को प्रबंधित करने में मदद मिलती है, लेकिन पिछले 5 वर्षों में कोई अपडेट नहीं हुआ है, इसलिए मुझे आश्चर्य है कि यदि आप कुछ जानते हैं मेरे मामले के लिए उपयुक्त अन्य विकल्प। किसी भी जानकारी वास्तव में सराहना की जाएगी।


2
कृपया मेरा उत्तर जांचें। साभार
हेनरिक पी। हेसेल

संबंधित: stackoverflow.com/q/4717167/212218

1
मैं इस पोस्ट पर आया हूँ gonzalo123.com/2010/05/23/… जो मैं मानता हूँ कि दोनों आराम और स्थिर हैं।
टेसन

यह से कोई लेना देना बहुत आसान है systemd
LeonanCarvalho

जवाबों:


167

आप कमांड लाइन (यानी बैश) से अपनी php स्क्रिप्ट शुरू कर सकते हैं

nohup php myscript.php &

&पृष्ठभूमि में अपने प्रक्रिया डालता है।

संपादित करें:
हां, कुछ कमियां हैं, लेकिन नियंत्रित करना संभव नहीं है? यह सिर्फ गलत है।
एक साधारण kill processidइसे रोक देगा। और यह अभी भी सबसे अच्छा और सरल उपाय है।


यदि टर्मिनल मौजूद है तो प्रक्रिया बाहर नहीं निकलेगी। इसलिए "नोहुप" कमांड है। मैं अब तक के वर्षों के लिए इस तरह से सभी सर्वरों पर डेमॉन के रूप में एक PHP स्क्रिप्ट का उपयोग कर रहा हूं। बेहतर समाधान हो सकता है, लेकिन यह सबसे तेज है।
CDR

27
यह विफल होने पर डेमॉन को पुनरारंभ नहीं करेगा, और डेमन को प्रबंधित करने का कोई आसान तरीका नहीं है।
फिल वलाच

6
मैं यहाँ जो कहा गया है उससे सहमत हूँ - यह एक बुरा समाधान है। आपको कुछ कारणों से एक init स्क्रिप्ट बनानी चाहिए: 1) Init script को स्टार्टअप 2 पर स्वचालित रूप से लॉन्च किया जाता है) आप कमांड को स्टार्ट / स्टॉप / रिस्टार्ट कमांड से प्रबंधित कर सकते हैं। यहाँ से एक उदाहरण हैffault: serverfault.com/questions/229759/…
सिमीयन

1
हे दोस्तों ... यह मुझे लगता है nohupऔर &एक ही काम करता है: खोल के वर्तमान उद्देश्य से लॉन्च की गई प्रक्रिया को अलग करना। मुझे उन दोनों की आवश्यकता क्यों है? क्या मैं बस नहीं कर सकता php myscript.php &या nohup myscript.php?? धन्यवाद
nourdine

1
यदि स्क्रिप्ट stdout (echo या var_dump के माध्यम से लिखती है) तो आप इस जानकारी को एक लॉग फ़ाइल के साथ इस तरह से पकड़ सकते हैं:nohup php myscript.php > myscript.log &
Mischa

167

एक अन्य विकल्प अपस्टार्ट का उपयोग करना है । यह मूल रूप से उबंटू के लिए विकसित किया गया था (और डिफ़ॉल्ट रूप से इसके साथ पैक किया जाता है), लेकिन सभी लिनक्स डिस्ट्रो के लिए उपयुक्त है।

यह दृष्टिकोण के समान है Supervisord और daemontools में है कि यह स्वचालित रूप से सिस्टम बूट और स्क्रिप्ट पूरा होने पर respawns पर डेमॉन शुरू होता है,।

इसे कैसे सेट करें:

पर एक नई स्क्रिप्ट फ़ाइल बनाएँ /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
क्या यह स्वचालित रूप से सिस्टम स्टार्टअप पर चल रहा है?
स्लीयर

2
सूडो "सेवा myphpworker start" मेरे लिए काम नहीं किया। मैंने "sudo start myphpworker" का इस्तेमाल किया और यह पूरी तरह से काम करता है
मैट सिच

3
@Pradeepta ऐसा इसलिए है क्योंकि पोस्ट में कोई त्रुटि है - मुझे यकीन नहीं है कि क्या (और यह परीक्षण नहीं किया है), लेकिन मुझे लगता है कि sudo service myphpworker start/stop/statusकेवल उन सेवाओं के साथ काम करता है जो /etc/init.dअपस्टार्ट सेवाओं में नहीं हैं। @ मैट-सिच ने सही सिंटैक्स को उजागर किया है। एक अन्य विकल्प गियरमैन या रेसक का उपयोग करना है, जो पृष्ठभूमि प्रसंस्करण और बहराकरण की अनुमति देता है।
किमी

3
उबंटू खुद को ऊपर की बजाय सिस्टमड
Kzqai

72

नई के साथ 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 स्क्रिप्ट को चालू रखने के लिए एक प्रकार का "लूप" होना चाहिए।

<?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 रूटीन को एक चक्र में (एक बार की तरह) निष्पादित किया जाना चाहिए, तो आपको उदाहरण के लिए सीधे PHP के बजाय 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प्रक्रियाओं के लिए, पार्टी (मुख्य) और 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" को बदलते हैं तो आपको `सिस्टेक्टल डेमॉन-रीलोड 'चलाना होगा, लेकिन चिंता न करें यदि आप ऐसा नहीं करते हैं, तो यह आवश्यक होने पर सतर्क हो जाएगा।


7
अधूरा जवाब। आपको मेरा +1 है।
गेरिकली लुकासी

2
बहुत बढ़िया। काश हम दिल के जवाब भी दे पाते क्योंकि यह इस पेज पर दफन नहीं होना चाहिए।
जस्टिन

1
आपको systemctl status <your_service_name> -lआउटपुट की जांच करनी चाहिए , यह आपको एक सुराग देगा कि क्या हो रहा है।
लियोनकार्वल्हो

1
@LeandroTupone MySQL और Memcached सेवा निर्भरता का उपयोग कैसे करें यह आवश्यक नहीं है का एक प्रदर्शन था।
लियोनकार्वेलो

3
यह वास्तव में 2019 को देखते हुए स्वीकार किए गए उत्तर को बदलना चाहिए।
मसाले

47

यदि आप कर सकते हैं - UNIX पर्यावरण में उन्नत प्रोग्रामिंग की एक प्रति ले लो । संपूर्ण अध्याय 13 डेमन प्रोग्रामिंग के लिए समर्पित है। उदाहरण सी में हैं, लेकिन सभी कार्य आप PHP में रैपर (मूल रूप से है की जरूरत pcntl और POSIX एक्सटेंशन)।

कुछ शब्दों में - एक डेमॉन लिखना (यह केवल * nix आधारित OS-es - विंडोज़ उपयोग सेवाओं पर स्थित है) इस तरह है:

  1. umask(0)अनुमति के मुद्दों को रोकने के लिए कॉल करें।
  2. fork() और माता-पिता से बाहर निकलें।
  3. पुकारते हैं setsid()
  4. का सेटअप सिग्नल प्रोसेसिंग SIGHUP(आमतौर पर इसे नजरअंदाज कर दिया जाता है या इसके विन्यास को फिर से लोड करने के लिए डेमन को संकेत देने के लिए इस्तेमाल किया जाता है) और SIGTERM(इस प्रक्रिया को इनायत से बाहर निकलने के लिए कहा जाता है)।
  5. fork() फिर से और माता-पिता से बाहर निकलें।
  6. वर्तमान में काम कर रहे डायर को बदल दें chdir()
  7. fclose() stdin, stdoutऔर stderrउन्हें मत लिखो। सही तरीका यह है कि उन /dev/nullया तो एक फ़ाइल को रीडायरेक्ट किया जाए , लेकिन मुझे इसे PHP में करने का कोई तरीका नहीं मिला। यह संभव है जब आप शेल का उपयोग करके उन्हें पुनर्निर्देशित करने के लिए डेमॉन को लॉन्च करते हैं (आपको खुद पता लगाना होगा कि यह कैसे करना है, मुझे नहीं पता :)।
  8. अपना काम करो!

इसके अलावा, चूंकि आप PHP का उपयोग कर रहे हैं, तो चक्रीय संदर्भों के लिए सावधान रहें, क्योंकि PHP 5.3 से पहले PHP कचरा संग्रहकर्ता के पास उन संदर्भों को इकट्ठा करने का कोई तरीका नहीं है और यह प्रक्रिया लीक हो जाएगी, जब तक कि यह दुर्घटनाग्रस्त न हो जाए।


1
जानकारी के लिए धन्यवाद। ऐसा लगता है कि libslack का डेमॉन प्रोग्राम आपके द्वारा बताए गए सभी प्रीप वर्क की तरह ही है। मुझे लगता है कि अब मैं इसके साथ तब तक टिकूंगा जब तक मुझे अन्य अच्छे विकल्प नहीं मिल जाते।
बीयर

1
इस पोस्ट को मिला, एक भद्दे पुराने एप्लिकेशन में कॉपी और पेस्ट करने की अपेक्षित कोड, जो स्टड आदि को बंद करने में विफल रहता है, निराश था। : पी
थिएमेस्टर

1
क्यों (5) कांटा () फिर?
18

मेरे लिए काम किया - महान काम!
गौतम शर्मा

भविष्य के पाठकों से यह पूछने के लिए कि दो बार कांटा क्यों लगाया गया है: stackoverflow.com/questions/881388/… - TL; DR: रोकता है लाश।
गेदीपंक

24

मैं बड़ी संख्या में PHP डेमॉन चलाता हूं।

मैं आपके साथ सहमत हूं कि ऐसा करने के लिए PHP सबसे अच्छी (या यहां तक ​​कि एक अच्छी) भाषा नहीं है, लेकिन डेमॉन वेब का सामना करने वाले घटकों के साथ कोड साझा करते हैं इसलिए कुल मिलाकर यह हमारे लिए एक अच्छा समाधान है।

हम इसके लिए डेमोनटूल का इस्तेमाल करते हैं। यह स्मार्ट, स्वच्छ और विश्वसनीय है। वास्तव में हम इसका उपयोग अपने सभी डेमों को चलाने के लिए करते हैं।

आप इसे http://cr.yp.to/daemontools.html पर देख सकते हैं ।

EDIT: सुविधाओं की एक त्वरित सूची।

  • रिबूट पर स्वचालित रूप से डेमॉन शुरू होता है
  • विफलता पर स्वचालित रूप से डेमॉन को पुनरारंभ करें
  • लॉगिंग आपके लिए हैंडल की जाती है, जिसमें रोलओवर और प्रूनिंग शामिल है
  • प्रबंधन इंटरफ़ेस: 'svc' और 'svstat'
  • UNIX अनुकूल (शायद सभी के लिए प्लस नहीं)

इसके अलावा, रिपॉजिटरी से इंस्टॉल करने योग्य, उदाहरण के लिए उपयुक्त!
21 सितंबर को Kzqai

14

आप ऐसा कर सकते हैं

  1. nohupसुझाव के रूप में हेनरिक का उपयोग करें ।
  2. screenअपने PHP प्रोग्राम को उसके भीतर एक नियमित प्रक्रिया के रूप में उपयोग करें और चलाएं। यह आपको उपयोग करने से अधिक नियंत्रण देता है nohup
  3. की तरह एक daemoniser का प्रयोग करें http://supervisord.org/ (यह अजगर में लिखा गया है, लेकिन किसी भी कमांड लाइन कार्यक्रम daemonise और आप इसे प्रबंधन करने के लिए एक रिमोट कंट्रोल दे सकते हैं)।
  4. अपना खुद का डेमनीज रैपर लिखें जैसे कि एमिल ने सुझाव दिया था लेकिन यह आईएमओ से अधिक है।

मैं सबसे सरल विधि (मेरी राय में स्क्रीन) की सिफारिश करूंगा और फिर यदि आप अधिक सुविधाएँ या कार्यक्षमता चाहते हैं, तो अधिक जटिल तरीकों पर जाएँ।


क्या आप एक समान पर्यवेक्षक विन्यास प्रदान कर सकते हैं?
एलिक्स एक्सल

11

इस समस्या को हल करने के लिए एक से अधिक तरीके हैं।

मैं बारीकियों को नहीं जानता लेकिन शायद PHP प्रक्रिया को ट्रिगर करने का एक और तरीका है। उदाहरण के लिए यदि आपको SQL डेटाबेस में घटनाओं के आधार पर कोड चलाने की आवश्यकता है तो आप अपनी स्क्रिप्ट निष्पादित करने के लिए ट्रिगर सेट कर सकते हैं। PostgreSQL के तहत ऐसा करना वास्तव में आसान है: http://www.postgresql.org/docs/current/static/external-pl.html

ईमानदारी से, मुझे लगता है कि आपका सबसे अच्छा शर्त है कि नोह का उपयोग करके डेमन प्रक्रिया बनाना। उपयोगकर्ता द्वारा लॉग आउट करने के बाद भी nohup कमांड को निष्पादित करने की अनुमति देता है:

nohup php myscript.php &

हालांकि एक बहुत गंभीर समस्या है। जैसा कि आपने कहा कि PHP का मेमोरी मैनेजर पूरा कचरा है, यह इस धारणा के साथ बनाया गया था कि एक स्क्रिप्ट केवल कुछ सेकंड के लिए निष्पादित हो रही है और फिर मौजूद है। आपकी PHP स्क्रिप्ट केवल कुछ दिनों के बाद मेमोरी के GIGABYTES का उपयोग करना शुरू कर देगी। तुम भी एक क्रोन स्क्रिप्ट है कि हर 12 या शायद 24 घंटे चलता है कि मारता है और इस के साथ अपने php स्क्रिप्ट फिर से बनाता है:

killall -3 php
nohup php myscript.php &

लेकिन क्या होगा अगर स्क्रिप्ट नौकरी के बीच में थी? खैर मार -3 एक व्यवधान है, यह CLI पर ctrl + c करने के समान है। आपकी 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');

$ लॉक के पीछे का विचार यह है कि PHP स्क्रिप्ट एक फ़ाइल को एक fopen ("फ़ाइल", "w") ;। केवल एक प्रक्रिया में एक फ़ाइल पर राइट लॉक हो सकता है, इसलिए इसका उपयोग करके आप यह सुनिश्चित कर सकते हैं कि आपकी PHP स्क्रिप्ट की केवल एक प्रति चल रही है।

शुभ लाभ!



6

की जाँच करें https://github.com/shaneharter/PHP-Daemon

यह एक ऑब्जेक्ट-ओरिएंटेड डेमन लाइब्रेरी है। इसमें लॉगिंग और एरर रिकवरी जैसी चीजों के लिए बिल्ट-इन सपोर्ट है और इसमें बैकग्राउंड वर्कर्स बनाने के लिए सपोर्ट है।


3

मुझे हाल ही में डेमोंस के रूप में PHP स्क्रिप्ट चलाने की समस्या के लिए एक क्रॉस-प्लेटफ़ॉर्म समाधान (विंडोज, मैक और लिनक्स) की आवश्यकता थी। मैंने अपना C ++ आधारित समाधान लिखकर और बायनेरिज़ बनाकर समस्या का हल किया:

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

लिनक्स के लिए पूर्ण समर्थन (sysvinit के माध्यम से), लेकिन विंडोज एनटी सेवाओं और मैक ओएसएक्स लॉन्च भी।

यदि आपको बस लिनक्स की जरूरत है, तो यहां प्रस्तुत किए गए अन्य समाधानों में से एक जोड़ी स्वाद के आधार पर अच्छी तरह से काम करती है और। इन दिनों अपस्टार्ट और सिस्टमड भी है, जिसमें सिसविनीट स्क्रिप्ट की कमियां हैं। लेकिन PHP का उपयोग करने के आधे बिंदु यह है कि यह प्रकृति में क्रॉस-प्लेटफ़ॉर्म है, इसलिए भाषा में लिखे गए कोड में हर जगह काम करने का एक अच्छा मौका है। जब कुछ बाहरी देशी ओएस-स्तरीय पहलू सिस्टम सेवाओं जैसे चित्र में प्रवेश करते हैं, तो कमियां दिखना शुरू हो जाती हैं, लेकिन आपको अधिकांश स्क्रिप्टिंग भाषाओं के साथ यह समस्या आएगी।

PHP यूजरलैंड में सुझाए गए किसी व्यक्ति के रूप में संकेतों को पकड़ने का प्रयास करना एक अच्छा विचार नहीं है। दस्तावेज़ीकरण को pcntl_signal()ध्यान से पढ़ें और आप जल्दी से जानेंगे कि PHP कुछ अप्रिय तरीकों (विशेष रूप से, 'टिक्स') का उपयोग करके संकेतों को संभालता है जो कि शायद ही कभी प्रक्रियाओं (अर्थात संकेतों) द्वारा देखी गई चीज़ों के लिए चक्रों का एक गुच्छा चबाते हैं। PHP में सिग्नल हैंडलिंग केवल POSIX प्लेटफार्मों पर ही उपलब्ध है और PHP के संस्करण के आधार पर समर्थन भिन्न है। यह शुरू में एक सभ्य समाधान की तरह लगता है, लेकिन यह वास्तव में उपयोगी होने की बहुत कमी आती है।

समय के बढ़ने के साथ PHP भी मेमोरी लीक के मुद्दों के बारे में बेहतर हो रही है। आपको अभी भी सावधान रहना होगा (DOM XML पार्सर अभी भी लीक होता है) लेकिन मैं शायद ही कभी इन दिनों भगोड़ा प्रक्रिया देखता हूं और PHP के दिनों की तुलना में PHP बग ट्रैकर बहुत शांत है।


1

जैसा कि दूसरों ने पहले ही उल्लेख किया है, डेमॉन के रूप में पीएचपी चलाना काफी आसान है, और कमांड की एक पंक्ति का उपयोग करके किया जा सकता है। लेकिन वास्तविक समस्या यह चल रही है और इसे प्रबंधित करना है। मुझे कुछ समय पहले भी यही समस्या थी और हालाँकि पहले से ही बहुत सारे समाधान मौजूद हैं, उनमें से अधिकांश में बहुत सारी निर्भरताएँ हैं या उपयोग करना मुश्किल है और बुनियादी उपयोगों के लिए उपयुक्त नहीं है। मैंने एक शेल स्क्रिप्ट लिखी है जो PHP cli स्क्रिप्ट सहित किसी भी प्रक्रिया / एप्लिकेशन को प्रबंधित कर सकती है। इसे एप्लिकेशन को शुरू करने के लिए क्रोनजोब के रूप में सेट किया जा सकता है और इसमें एप्लिकेशन शामिल होगा और इसे प्रबंधित करेगा। यदि इसे फिर से निष्पादित किया जाता है, उदाहरण के लिए उसी क्रोनजॉब के माध्यम से, तो यह जांचें कि ऐप चल रहा है या नहीं, अगर ऐसा होता है तो बस बाहर निकलता है और अपने पिछले उदाहरण को एप्लिकेशन को प्रबंधित करना जारी रखता है।

मैंने इसे github पर अपलोड किया, इसे उपयोग करने के लिए स्वतंत्र महसूस करें: https://github.com/sinasalek/EasyDeamonizer

EasyDeamonizer

बस अपने आवेदन पर देखता है (शुरू, पुनः आरंभ, लॉग, मॉनिटर, आदि)। यह सुनिश्चित करने के लिए एक सामान्य लिपि कि आपकी प्रशंसा ठीक से चल रही है। जानबूझकर यह अपने सभी दुष्प्रभावों को रोकने के लिए pid / lock फ़ाइल के प्रक्रिया नाम इंस्ट्रेड का उपयोग करता है और स्क्रिप्ट को यथासंभव सरल और यथासंभव सरल बनाए रखता है, इसलिए यह हमेशा तब भी काम करता है जब EasyDaemonizer स्वयं को पुनरारंभ होता है। विशेषताएं

  • आवेदन शुरू करता है और वैकल्पिक रूप से प्रत्येक शुरुआत के लिए एक अनुकूलित देरी
  • यह सुनिश्चित करता है कि केवल एक उदाहरण चल रहा है
  • सीपीयू मॉनिटर का उपयोग करता है और परिभाषित सीमा तक पहुंचने पर ऐप को स्वचालित रूप से पुनरारंभ करता है
  • EasyDeamonizer की स्थापना किसी भी कारण से रुकी होने पर इसे फिर से चलाने के लिए क्रॉन के माध्यम से चलाना
  • इसकी गतिविधि लॉग करता है

1

एमिल इवोव उत्तर का विस्तार करते हुए , आप STDIN, STDOUT AND 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

मैंने इसे वेब से परे रोब एले - पीएचपी की पुस्तक से पढ़ा है


0

मैंने एक साधारण php-daemon लिखा और तैनात किया, कोड यहाँ ऑनलाइन है

https://github.com/jmullee/PhpUnixDaemon

विशेषताएं: विशेषाधिकार छोड़ने, सिग्नल हैंडलिंग, लॉगिंग

मैंने इसे एक कतार-हैंडलर में उपयोग किया (उपयोग का मामला: एक वेब पेज से एक लंबा ऑपरेशन ट्रिगर करें, बिना पेज-जेनरेट किए हुए php प्रतीक्षा करें, अर्थात एक एसिंक्रोनस ऑपरेशन लॉन्च करें ) https://github.com/jmullee/Php4CMessageQueue


0

आप देख सकते हैं pm2 यहाँ है, http://pm2.keymetrics.io/

एक ssh फ़ाइल बनाएं, जैसे कि कार्यकर्ता। आप अपनी php स्क्रिप्ट में डालते हैं, जिससे आप निपटेंगे।

worker.sh

php /path/myscript.php

डेमॉन शुरू

pm2 start worker.sh

चीयर्स, कि यह है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.