2012-06-29 19 views
6

मैं CakePHP (1.2) का उपयोग करने के कुछ महीने पहले कंपनी के आवेदन करने के लिए छोटे सुविधाओं को जोड़ने के लिए शुरू कर दिया और मैं इसके साथ बहुत परिचित नहीं हूँ।CakePHP क्रॉन जॉब एक ​​नियंत्रक की कार्रवाई कॉल करने के लिए

हम उत्पादन सर्वर पर विलय करने से पहले स्थानीय स्तर पर विकास सर्वर पर परीक्षण करते हैं।

मैं एक नियंत्रक कार्रवाई मैं क्या मेरे शोध, एक क्रॉन जॉब के माध्यम से यह करने के लिए सबसे अच्छा तरीका माना के साथ हर घंटे के नाम से जाना चाहते हैं।


प्रयास 1

इन पढ़ने के बाद,

http://bakery.cakephp.org/articles/mathew_attlee/2006/12/05/calling-controller-actions-from-cron-and-the-command-line

http://book.cakephp.org/1.2/en/view/110/Creating-Shells-Tasks

मैं त्रुटियों के बिना कुछ को लागू सकता है, लेकिन कार्रवाई निष्पादित नहीं है।

इन उदाहरणों के आधार पर, मैं अपने ऐप निर्देशिका (नहीं एप्लिकेशन/webroot) में एक फ़ाइल का नाम cron_dispatcher.php जोड़ा और फिर ऐप्स dir

php cron_dispatcher.php/नियंत्रक/कार्रवाई से इस आदेश किया था/param

अभी भी कुछ भी नहीं हुआ है, लेकिन जब मैं इसे यूआरएल के माध्यम से कॉल करता हूं तो यह सही काम करता है।


प्रयास 2

मैं एक खोल (email.php) कि/ऐप्स/विक्रेताओं/गोले में कार्रवाई/कहेंगे बनाने की कोशिश की।

<?php 

class EmailShell extends Shell { 

    public function main() { 
     $this->out('Test'); 
    } 

} 
?> 

यह सफलतापूर्वक कंसोल

केक ईमेल मुख्य

का उपयोग करने में टेस्ट आउटपुट लेकिन फिर मैं कैसे नियंत्रक की कार्रवाई कॉल करने के लिए नहीं मिल रही है। मैंने

$ यह-> अनुरोध क्रिया ('/ नियंत्रक/क्रिया') की कोशिश की है;

मैंने खोल में मुख्य की तुलना में एक अलग फ़ंक्शन से कॉल करने का भी प्रयास किया है।

मैं $ में नियंत्रक शामिल करने के लिए कोशिश की है के रूप में मैं एक मॉडल के साथ होता है, लेकिन वह काम नहीं किया है (और यह समझ में मुझे लगता है कि नहीं है)

मैं एक बनाने नहीं लगता कि चर का उपयोग करता है कार्य समाधान है या तो मैं sendEmails फ़ंक्शन को डुप्लिकेट नहीं करना चाहता हूं इसलिए मैं नियंत्रक की कार्रवाई को केवल एक खोल या जो कुछ भी कहने के लिए कह रहा हूं!

वहाँ शायद कुछ सिद्धांत मैं याद कर रहा हूँ है, धन्यवाद


समाधान

मैं एक मॉडल के लिए नियंत्रक से कुछ तरीकों में ले जाया गया और मैं उन्हें एक खोल से फोन कर रहा था।

App::import('Component', 'Email'); 

class SendMemosShell extends Shell { 

    var $uses = array(
     'Memo', 
    ); 

    public function main() { 

    } 

    public function sendEmails() { 
     $this->Email =& new EmailComponent(null); 
     $memoList = $this->Memo->getMemos(); 
     //... 
    } 
} 

यह लिंक http://book.cakephp.org/2.0/en/console-and-shells/cron-jobs.html


मदद की संपादित करें: जानकारी के कुछ स्पष्ट किया और समाधान

उत्तर

3

यह है एक बहुत आम मुद्दा वास्तव में, यह भी में भाग गयी।

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

यह जानकर कि नियंत्रक विधि को कॉल करना समझ में नहीं आता है।

तो अपने विकल्पों पर पुनर्विचार करें, और हाँ यह एक कठिन मुश्किल है। उदाहरण के लिए आप यह तय कर सकते हैं कि ई-मेल भेजना एक व्यावसायिक तर्क चरण है, इसलिए यह मॉडल में होना चाहिए। एक और विकल्प इसे पूरी तरह से अलग करना है (यही वह है जिसे हम सबसे ज्यादा पसंद करते हैं)।

उस स्थिति में आपको एक कतार बनाना होगा जहां आप भेजने के लिए सभी ई-मेल डालते हैं। यह एक अच्छा डिजाइन है क्योंकि तब आप जानते हैं कि नियंत्रक में तर्क की मात्रा नीचे जाती है और यह अलग हो जाती है। इस तरह आपको एक ई-मेल सेवा मिलती है।

उदाहरण के लिए आप सेवा को "नया उपयोगकर्ता" मेल भेजने के लिए कह सकते हैं। फिर आप उस पर ऑब्जेक्ट ऑब्जेक्ट जोड़ते हैं और इसे स्वयं को संभालना चाहिए। इस तरह आप भी माप सकते हैं आपकी सेवा उदाहरण के लिए आउटसोर्स किया जा सकता है के बाद से, आप सेवा आदि

संपादित करें पर कई सर्वरों का विस्तार कर सकते हैं:

अच्छा सवाल है।

कदम उठाने के लिए:

  1. केंद्रीयकृत "भेजने के ई-मेल" प्रक्रिया पहले। तो इसे कहां रखना एक स्थान चुनें। आप तय कर सकते हैं: कतार में ई-मेल भेजने या सीधे सेवा को कॉल करने के लिए जोड़ें। उदाहरण के लिए आप ई-मेल भेजने के लिए खोल कार्य जोड़ सकते हैं।

  2. खोल को कॉल करें: अब आपको खोल को कॉल करने में समस्या है। आम तौर पर आप नहीं चाहते हैं। क्यों नहीं? क्योंकि एक खोल (एक कार्य) लंबे समय तक चल सकता है। इसलिए हम बीच में कतारों का उपयोग करते हैं। तो आप कतार से पूछ सकते हैं या कतार संदेश भेज सकते हैं कि कुछ किया गया है। उदाहरण के लिए एक मेल सर्वर के बारे में सोचें जो नीचे है। आपको पुनः प्रयास करना होगा। यह वेब अनुरोध में नहीं होना चाहिए क्योंकि उपयोगकर्ता प्रतिक्रिया की प्रतीक्षा कर रहा है।

  3. तीसरा चरण अपने क्रॉन से खोल को कॉल करना है, अब यह आसान है क्योंकि आप पहले ही कमांड लाइन पर हैं ताकि आप मानक कॉल का उपयोग कर सकें।

किसी भी तरह, नियंत्रक से सीधी कॉल करने के विकल्प हैं लेकिन आपको नहीं करना चाहिए। CakePHP: Run shell job from controller

संपादित करें 31/08/'13: भी कुछ उदाहरण के लिए CakePHP की घटनाओं प्रणाली देखें: http://book.cakephp.org/2.0/en/core-libraries/events.html

+0

मुझे इस क्रिया को मैन्युअल रूप से कॉल करने में सक्षम होना चाहिए (उदाहरण के लिए दृश्य में एक बटन पर क्लिक करके)। क्या आप सुझाव देते हैं कि मैं नियंत्रक कार्रवाई के बजाय एक कार्य बनाउंगा और इसके बजाय इसे कॉल करूँगा (स्वचालित रूप से क्रॉन नौकरी के साथ और मैन्युअल रूप से क्लिक पर)? क्या एक खोल है जिसे आप पूरी तरह से तर्क से अलग करते हैं या आप कतार के बारे में बात कर रहे थे? कभी-कभी मुझे एक साथ कई ईमेल भेजने की आवश्यकता होती है (जब इसे स्वचालित रूप से चेक किया जाता है) लेकिन यह अक्सर नहीं होना चाहिए, इसलिए मुझे आश्चर्य है कि कतार मेरी आवश्यकताओं के लिए थोड़ा जटिल है या नहीं! आपके उत्तर – Catherine

+0

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

+1

हाय फिर से, आपके विस्तृत उत्तर के लिए धन्यवाद। हम इस बात पर सहमत हुए कि ईमेल को मैन्युअल रूप से भेजने की कोई आवश्यकता नहीं थी इसलिए मैंने एक खोल बनाया जो ईमेल भेजता है। इसने मुझे नियंत्रक से मॉडल में और अधिक तरीकों को स्थानांतरित करने के लिए मजबूर किया जो कि अगर मैं अच्छी तरह समझ गया तो अधिक उचित है। मैंने क्रॉन नौकरी स्थापित करने के लिए इस प्रक्रिया का पालन किया: http://book.cakephp.org/2.0/en/console-and-shells/cron-jobs.html मैंने कतारों का उपयोग न करने का फैसला किया, भले ही यह दिलचस्प लग रहा था क्योंकि यह इस मामले में इसके लायक नहीं था! – Catherine

0

क्या किया जाना चाहिए पर निर्भर करता है, मैं अक्सर इन रखने के इस पोस्ट में कुछ बहुत ही दिलचस्प जानकारी प्रदान करता मेरे नियंत्रक कार्यों में विधियों। कार्रवाई के शीर्ष पर मैं केवल $ _SERVER ['REMOTE_ADDR'] == $ _SERVER ['SERVER_ADDR'] की जांच करता हूं ताकि यह सुनिश्चित किया जा सके कि वेबसाइट केवल कार्रवाई को कॉल कर सके। फिर क्रॉन में मैं इस पते को घुमा दूंगा या भूल जाऊंगा।

इसका लाभ - विकास के दौरान स्थानीय रूप से चलाने के लिए आसान है (केवल अपने ब्राउज़र में यूआरएल दर्ज करें), साथ ही php और apache संस्करण के चल रहे क्लाई संस्करण के साथ-साथ अनुरोध चर (उदाहरण के केक) के बीच कुछ अंतर हैं। क्ली के माध्यम से वेबसाइट डोमेन/पता नहीं मिल सकता है जैसे आप अपाचे मॉड्यूल के रूप में चल सकते हैं, इसलिए HTML सहायक का उपयोग कर वेबसाइट के पूर्ण लिंक काम नहीं करते हैं)।

+0

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

संबंधित मुद्दे