2009-03-14 8 views
22

मैं पृष्ठभूमि प्रक्रिया बनाना चाहता हूं और मुझे बताया गया है कि ये आमतौर पर सी या उस तरह के कुछ में लिखे जाते हैं। मुझे हाल ही में पता चला है कि PHP को डिमन बनाने के लिए इस्तेमाल किया जा सकता है और अगर मुझे इस तरह से PHP का उपयोग करना चाहिए तो मुझे कुछ सलाह लेने की उम्मीद थी।क्या डेमॉन के लिए PHP का उपयोग करना बुद्धिमान है?

यहां डेमॉन के लिए मेरी आवश्यकताएं हैं।

  • लगातार जाँच करता है, तो एक पंक्ति में किया गया है MySQL डेटाबेस तालिका
  • भागो FFmpeg क्या
  • MySQL तालिका में उत्पादन सम्मिलित डेटाबेस से लिया गया था पर आदेश को जोड़ा गया

मुझे यकीन है कि नहीं कर रहा हूँ यह निर्णय लेने में सहायता के लिए मैं और क्या पेशकश कर सकता हूं। बस जोड़ने के लिए, मैंने पहले सी नहीं किया है। केवल जावा और PHP और मूल बैश स्क्रिप्टिंग।

क्या यह भी प्रदर्शन प्रदर्शन का इतना अधिक बनाता है?

कृपया मेरी अज्ञानता की अनुमति दें, मैं सीख रहा हूं! :)

धन्यवाद सभी

+0

PHP और सी के बीच "बहुत से" भाषाएं हैं! यदि PHP काम नहीं करता है (और यह इस तरह के कार्य के लिए एक गहरी भाषा है) तो आपको पाइथन या कुछ और मिल सकता है जिसे आम तौर पर सी –

उत्तर

28

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

दूसरी समस्या कुछ हद तक छोटी गाड़ी संकेत है। मेरे अनुभव में, सिग्नल हैंडलर हमेशा PHP के साथ सही ढंग से दर्ज नहीं होते हैं, खासकर जब सिग्नल विलय के बजाय कतारबद्ध होता है। यह आपके लिए कोई मुद्दा नहीं हो सकता है, यानी अगर आपको सिगिनट/सिग्सआर 1/सिगसआर 2/SIGHUP को संभालने की आवश्यकता है।

तो, मेरा सुझाव है: डेमॉन सरल है

, तो आगे बढ़ें और PHP का उपयोग करें। अगर ऐसा लगता है कि यह जटिल हो रहा है, या बहुत सारी मेमोरी आवंटित करता है, तो आप PHP में प्रोटोटाइप करने के बाद इसे सी में लिखने पर विचार कर सकते हैं।

मैं एक सुंदर मरने वाला व्यक्ति हूं। हालांकि, मुझे PHP का उपयोग करके कुछ जल्दी से छेड़छाड़ करने में कुछ भी गलत नहीं लगता (उन मामलों से परे जिन्हें मैंने समझाया)। मुझे कुछ ऐसा प्रोटोटाइप करने के लिए PHP का उपयोग करने में कुछ भी गलत नहीं लगता है जिसे सी में बाद में लिखा जा सकता है या नहीं। उदाहरण के लिए, यदि आप PHP का उपयोग करते हैं, तो डेटाबेस सामग्री को संभालना बहुत आसान होगा, इसलिए सी में अन्य इंटरफेस का उपयोग करके कॉलबैक प्रबंधित करना। उस उदाहरण के लिए, 'एक ऑफ' के लिए, आप निश्चित रूप से इसे बहुत तेज कर लेंगे।

0

मैं इसकी अनुशंसा नहीं करता। PHP लंबे समय तक निष्पादन के लिए डिज़ाइन नहीं किया गया है। यह मुख्य रूप से अल्पकालिक पृष्ठों के साथ बनाया गया है।

मेरे अनुभव में PHP को कुछ बड़े कार्यों के लिए स्मृति को लीक करने में समस्या हो सकती है।

+1

से 'विश्वसनीय' माना जाता है। PHP का कचरा संग्रह तब तक उत्कृष्ट होता है जब तक आप पर्याप्त रूप से अपने दायरे की योजना बनाते हैं। – Nolte

+0

अच्छी तरह से, आत्म-संदर्भित सरणी संरचनाओं के अलावा, जहां यह स्मृति को रिसाव करता है और कंसोल को संदेश भेजता है। ओह। –

17

मैं डेमॉन में डेटाबेस को मतदान करने के बजाय, इस कार्य को क्रॉन नौकरी के साथ करने के इच्छुक हूं।

यह संभावना है कि आपके FFmpeg कमांड में कुछ भी समय लगेगा, है ना? उस स्थिति में, क्या यह है वास्तव में डेटाबेस को लगातार मतदान करने के लिए आवश्यक है? प्रत्येक मिनट (या उस मामले के लिए हर पांच, दस या बीस मिनट) चलने वाला क्रोनबॉज एक ही चीज़ प्राप्त करने का एक आसान तरीका नहीं होगा?

+0

विचार की अच्छी लाइन। लेकिन जो मैं समझता हूं, से डीमन डीबी में जोड़े गए किसी भी नए चीज़ के लिए बाल प्रक्रिया बनाना जारी रखेगा। इसलिए, एफएफएमपीजी जितना समय लगेगा उतना समय ले सकता है और इससे कोई फर्क नहीं पड़ता, है ना? – Abs

+0

आप लॉन्चड (अगली जेन क्रॉन) –

+2

का उपयोग करके जांच सकते हैं गतिविधि स्तर पर निर्भर करता है। प्रक्रिया को लॉन्च करना एक प्रक्रिया में टाइमर चलाने से कहीं अधिक भारी है, साथ ही यदि आप बहुत बार होते हैं तो आपको कई नौकरियों से निपटने के लिए तर्क जोड़ने की आवश्यकता होती है।क्रॉन नौकरी को किसी भी मामले में मतदान तर्क को डुप्लिकेट करने की आवश्यकता होगी। – dkretz

7

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

एकमात्र नीचे की तरफ यह है कि PHP, यूनिक्स के लगभग हर स्वाद पर स्थापित, जैसा कि कहता है, पेर्ल या पायथन के रूप में सर्वव्यापी नहीं है। Php केवल उन सिस्टम पर पाया जाता है जो गतिशील वेब सामग्री की सेवा करने जा रहे हैं। ऐसा नहीं है कि एक पीएचपी दुभाषिया भी स्थापित करने के लिए बहुत बड़ा या महंगा है, लेकिन यदि आपकी सबसे बड़ी चिंता आपके सिस्टम को कई प्रणालियों में प्राप्त कर रही है, तो यह मामूली बाधा हो सकती है।

+0

अधिकांश डिस्ट्रोज़ में पीएचएल और पायथन –

+2

जितना अधिक PHP शामिल है, लेकिन डिफ़ॉल्ट रूप से अक्सर इंस्टॉल नहीं किया जाता है। – SingleNegationElimination

1

आप एक MySQL trigger बनाने पर विचार करना चाहेंगे जो एक डेमॉन के बजाय system कमांड (यानी एफएफएमपीईजी) निष्पादित करता है। अगर कुछ अंतराल कोई समस्या नहीं है, तो आप क्रॉन में कुछ भी डाल सकते हैं जो जांचने के लिए हर कुछ मिनट निष्पादित करता है। यदि यह एक विकल्प है तो क्रॉन मेरी पसंद होगी।

अपने प्रश्न का उत्तर देने के लिए, php एक डेमॉन के रूप में चलाने के लिए बिल्कुल ठीक है। इसे सी

+0

आह, मुझे mysql ट्रिगर्स के बारे में पता नहीं था। हां क्रॉन जॉब एक ​​विकल्प भी है, इसलिए अब MySQL ट्रिगर्स है। :) – Abs

+0

सामान्य रूप से बुरा विचार: ट्रिगर एक तुल्यकालिक की अवधि के लिए ताले जोड़ने, तुल्यकालिक होगा; वे लेनदेन अधिक समय लेते हैं (जाहिर है); और परीक्षण और डीबग करने के लिए और अधिक कठिन हैं। – dkretz

+0

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

1

में किया जाना आवश्यक नहीं है यदि आप केंट फ्रेड्रिक, टोकनमैकगुए और डोमस्टर के उत्तरों को जोड़ते हैं तो आपको कुछ उपयोगी मिलता है।

php शायद लंबे निष्पादन समय, के लिए अच्छा नहीं है, तो चलिए प्रत्येक निष्पादन चक्र को छोटा रखें और सुनिश्चित करें कि ओएस किसी भी मेमोरीलेक्स की सफाई का ख्याल रखता है। अपनी PHP स्क्रिप्ट क्रॉन शुरू करने के लिए एक उपकरण के रूप में एक अच्छा उपकरण हो सकता है। और यदि आप ऐसा करते हैं, तो भाषाओं के बीच बहुत अंतर नहीं है।

हालांकि, सवाल अभी भी खड़ा है। क्या PHP भी लंबे समय तक (सामान्य वर्ष) के लिए सामान्य डिमन के रूप में चलाने में सक्षम है? या मिश्रित मेमोरीक्स आपके सभी राम को खाएंगे और सिस्टम को मार देंगे?

/जोहान

0

एक क्रॉन जॉब और बैश पटकथा का एक छोटा सा सब कुछ आप यह की आवाज़ से की जरूरत होनी चाहिए। आप चीजें कर सकते हैं जैसे:

$file=`mysqlquery -h server < "select file from table;"` 
ffmpeg $file -fps 50 output.a etc. 

तो PHP का उपयोग करने के बजाय आईएमएचओ लिखना, पोर्ट करना और बनाए रखना आसान होगा।

6

मैं इसके विपरीत होगा और आपको php daemon को आजमाने की सलाह दूंगा। यह स्पष्ट रूप से वह भाषा है जिसे आप सबसे अच्छी तरह जानते हैं। आप संभवतः किसी भी मामले में टाइमर को शामिल करेंगे, ताकि आप डेटाबेस पर क्वेरी आवृत्ति को डुप्लिकेट कर सकें। वास्तव में कोई दंड नहीं है जब तक कि आप एक प्रश्न पर मूर्खतापूर्वक लूपिंग नहीं कर रहे हैं।

यदि यह निष्पादित अक्सर, आप वैकल्पिक रूप से, क्रॉन से php चला सकते हैं दे youor कोड कतार नाली और फिर मर नहीं कुछ।

लेकिन, क्या आप बेहतर जानते हैं के साथ रहना एक पहली सन्निकटन के रूप में डर नहीं है।

ट्रिगर्स का उपयोग न करने का प्रयास करें। वे अनावश्यक युग्मन लगाएंगे, और वे परीक्षण और डीबग करने के लिए कोई मजेदार नहीं हैं।

1

यदि आप ऐसा करते हैं, तो स्मृति लीक पर ध्यान दें। this (5.3 में तय) के अनुसार PHP 5.2 में कचरा कलेक्टर के साथ कुछ समस्याएं हैं। शायद क्रॉन का उपयोग करना बेहतर है, इसलिए स्क्रिप्ट प्रत्येक रन को साफ़ करना शुरू कर देती है।

-2

क्रॉन नौकरी? हाँ।

डेमॉन जो हमेशा के लिए चलता है? सं

पीएचपी एक कचरा कलेक्टर नहीं है (या कम से कम, पिछली बार मैं ऐसा नहीं है की जाँच की)। इसलिए, यदि आप एक परिपत्र संदर्भ बनाते हैं, तो इसे कभी भी साफ़ नहीं किया जाता है - कम से कम जब तक मुख्य स्क्रिप्ट निष्पादन समाप्त नहीं होता है। डेमॉन प्रक्रिया में यह लगभग कभी नहीं है।

वे नए संस्करण है, तो हाँ तुम कर सकते में एक जीसी जोड़ा है, तो।

2

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

+0

हाय करीम, उस उत्तर के लिए धन्यवाद। :) – Abs

1

जो आपने वर्णन किया है, उसके लिए मैं एक डेमन के साथ जाऊंगा। सुनिश्चित करें कि आप पोल लूप में नींद लेते हैं, ताकि जब कोई नया कार्य न हो तो आप डेटाबेस पर बमबारी न करें। एक cronjob वर्कफ़्लो/रिपोर्ट प्रकार की नौकरियों के लिए बेहतर काम करता है, जहां कोई विशेष घटना नहीं है जो अगले भाग को ट्रिगर करती है।

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

3

एक क्रॉन-जॉब शायद ठीक काम करेगा, अगर निकट-तत्काल कार्रवाइयों की आवश्यकता नहीं है।

मैं क्यूइंग डेमॉन 'बीनस्टॉकड' के आधार पर, एक प्रणाली जिसे मैंने बनाया है, जीने वाला हूं। मैं विभिन्न छोटे संदेशों को भेजता हूं (इस मामले में, PHP) वेबपृष्ठ को डिमन पर कॉल करता है, और एक PHP स्क्रिप्ट उन्हें कतार से उठाती है और विभिन्न कार्यों को निष्पादित करती है, जैसे छवियों का आकार बदलना या डेटाबेस जांचना (अक्सर मेमकैच के माध्यम से जानकारी को पास करना आधारित स्टोर)।

लंबी चल रही प्रक्रियाओं से बचने के लिए, मैंने इसे एक बास्क्रिप्ट स्क्रिप्ट में लपेट लिया है, कि, स्क्रिप्ट से लौटाए गए मान के आधार पर ("बाहर निकलें (1);") स्क्रिप्ट को पुनरारंभ करेगा, प्रत्येक के लिए (कहें) 50 कार्य इसे किया गया है। अगर यह पुनरारंभ हो रहा है क्योंकि मैं इसे करने की योजना बना रहा हूं, तो यह तत्काल ऐसा करेगा, कोई अन्य निकास मान (डिफ़ॉल्ट 0 है, इसलिए मैं इसका उपयोग नहीं करता) इसे पुनरारंभ करने से पहले कुछ सेकंड रोक देगा।

+0

आपके उदाहरण के लिए धन्यवाद। – Abs

-4

इसके लिए जाएं। मुझे इसे एक बार भी करना था। दूसरों की तरह कहा, यह आदर्श नहीं है लेकिन यह मिल जाएगा। विंडोज का उपयोग करना, है ना? अच्छा।

यदि आपको केवल कभी-कभी (एक बार प्रति घंटे, आदि) चलाने की आवश्यकता होती है। अपने फ़ायरफ़ॉक्स में एक नया शॉर्टकट बनाएं, इसे कहीं प्रासंगिक रखें।

"C:\Program Files\Mozilla Firefox\firefox.exe" http://localhost/path/to/script.php 

जाओ शॉर्टकट में कक्ष> अनुसूचित कार्य प्वाइंट अपने नए शेड्यूल किए गए कार्य नियंत्रित करने के लिए: के लिए शॉर्टकट, परिवर्तन "लक्ष्य" के लिए गुण खोलें।

यदि आपको लगातार या छद्म-लगातार चलाने के लिए इसकी आवश्यकता है, तो आपको स्क्रिप्ट को थोड़ी-थोड़ी मसाला करने की आवश्यकता होगी।

स्क्रिप्ट एक पाश (जैसे जबकि) का उपयोग करता है

set_time_limit(0); 
ob_implicit_flush(true); 

साथ अपनी स्क्रिप्ट शुरू आप बफर स्पष्ट करने के लिए है: ठीक से daemonizing एक PHP स्क्रिप्ट है साथ

$i=0; 
while($i<sizeof($my_array)){ 
    //do stuff 
    flush();   
    ob_clean(); 
    sleep(17); 
    $i++; 
} 
+2

मैन यह दृष्टिकोण सिर्फ इतना गलत है ... – loostro

3

एक समस्या यह है कि PHP में डुप्लिकेट() या dup2() syscalls में इंटरफेस नहीं हैं, जिन्हें फ़ाइल डिस्क्रिप्टर को अलग करने के लिए आवश्यक हैं।

1

आप डेमॉन मार्ग नीचे जाने का फैसला किया है, तो वहाँ एक महान नाशपाती मॉड्यूल System_Daemon कहा जाता है जो मैंने हाल ही में एक PHP v5.3.0 स्थापना पर सफलतापूर्वक इस्तेमाल किया गया है। http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php

आप नाशपाती स्थापित किया है, तो आप का उपयोग कर इस मॉड्यूल स्थापित कर सकते हैं: तो फिर तुम /etc/init.d/<your_daemon_name>

:

pear install -f System_Daemon 

तुम भी एक initialisation स्क्रिप्ट बनाने की आवश्यकता होगी यह लेखकों ब्लॉग पर प्रलेखित है कर सकते हैं:

  • प्रारंभ Daemon: /etc/init.d/projNotifMailDaemon start
  • एसटू पी Daemon: /etc/init.d/projNotifMailDaemon stop

लॉग्स पर रखा जाता है: /var/log/<your_daemon_name>.log

+0

वी। सहायक। लिपियों को शुरू करने और रोकने के बारे में लिंक और बिट के लिए धन्यवाद। – Joe

0

आप जानते हैं कि क्या आप वाकई कर रहे हैं। आपको अपने ऑपरेटिंग सिस्टम को अच्छी तरह से समझने की जरूरत है। PHP आमतौर पर अधिकांश डिमॉन्स के लिए उपयुक्त नहीं है क्योंकि यह थ्रेड नहीं होता है और सभी कार्यों के लिए एक सभ्य घटना आधारित प्रणाली नहीं है। हालांकि अगर यह आपकी जरूरतों के अनुरूप है तो कोई समस्या नहीं है। आधुनिक PHP (5.3+) वास्तव में स्थिर है और इसमें कोई मेमोरी लीक नहीं है। जब तक आप जीसी को सक्षम करते हैं और अपनी मेमोरी लीक लागू नहीं करते हैं, तो आप ठीक होंगे।

यहां एक डेमॉन के आंकड़े दिए गए हैं: अपटाइम 17 दिन (PHP अपग्रेड के कारण अंतिम पुनरारंभ)। बाइट्स लिखा: 200GB कनेक्शन: सैकड़ों कनेक्शन संभाला, लाखों आइटम/अनुरोध संसाधित: हालांकि कुछ मामूली खीज है लाखों

Node.js आम तौर पर बेहतर अनुकूल है। कुछ क्षेत्रों में PHP को सुधारने के कुछ प्रयास किए गए हैं लेकिन वे वास्तव में महान नहीं हैं।