2011-09-29 5 views
8

मैंने एक php/mysql स्क्रैपर बनाया है, जो ठीक चल रहा है, और यह नहीं पता कि क्रॉन नौकरी के रूप में इसे सबसे कुशलतापूर्वक कैसे चलाया जाए। 200 पृष्ठों स्क्रैप जा रहा है -एक PHP क्रॉन नौकरी कितनी देर तक चल सकती है/क्या मैं इसे सही कर रहा हूं?

300 साइटों, 20 के बीच के साथ प्रत्येक रहे हैं। सभी साइटों को स्क्रैप करने में 4 से 7 घंटे लगते हैं (नेटवर्क विलंबता और अन्य कारकों के आधार पर)। स्क्रैपर को रोजाना एक बार पूरा रन करने की ज़रूरत होती है।

मैं जो पूरे 4 के लिए चलाता है 1 क्रॉन जॉब के रूप में इस चलाने चाहिए - 7 घंटे, या यह हर घंटे 7 बार चलाते हैं, या पूरा जब तक यह हर 10 मिनट चला सकता हूँ?

while($starttime+600 > time()){ 
    do_scrape(); 
} 

कौन सा do_scrape() फ़ंक्शन, जो एक समय में 10 यूआरएल scrapes, जब तक (इस मामले में) चलेंगे 600 सेकंड है:

स्क्रिप्ट इस तरह क्रॉन से चलाने के लिए सेट किया गया है बीतने के। Do_scrape को चलाने के लिए 5 से 60 सेकंड के बीच लग सकता है।

मैं यहां पूछ रहा हूं क्योंकि मुझे इसे चलाने के तरीके के बारे में वेब पर कोई जानकारी नहीं मिल रही है, और यह रोज़ाना चलने के बारे में सावधान रहती है, क्योंकि php वास्तव में 7 घंटे के लिए एक स्क्रिप्ट के रूप में चलाने के लिए डिज़ाइन नहीं किया गया है।

मैं वेनिला PHP/mysql में लिखा था, और यह केवल lighttpd/mysql/PHP5 स्थापित साथ डेबियन वीपीएस कटौती पर चल रहा है। मैंने बिना किसी समस्या के 6000 सेकेंड (100 मिनट) के टाइमआउट के साथ इसे चलाया है (सर्वर खत्म नहीं हुआ)।

इस कार्य के बारे में जाने के बारे में कोई सलाह की सराहना की जाती है। मुझे आदि के लिए क्या देखना चाहिए ..? या मैं यह सब गलत करने के बारे में जा रहा हूँ?

धन्यवाद!

उत्तर

8

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

जिसके अनुसार, अपने वास्तुकला सुंदर बुनियादी है, और संभावना नहीं पैमाने बहुत अच्छी तरह से है।

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

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

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

फिर आप अपने fetcher-script-manager को एक घंटे में चलाने के लिए क्रॉन करते हैं, यह कुछ कार्यकर्ता प्रक्रियाओं को प्रबंधित करता है जो डेटा प्राप्त करते हैं (पेरेलेल में, इसलिए विलंबता आपको मार नहीं देती), और कतार पर काम को चिपकाती है।फिर कतार-cruncher कतार पर काम देखता है और इसे crunches।

कतार को कार्यान्वित करने के तरीके के आधार पर, यह बहुत अच्छी तरह से स्केल कर सकता है। आपके पास रिमोट डेटा लाने वाले कई बॉक्स हो सकते हैं, और इसे कुछ केंद्रीय कतार बॉक्स पर चिपका सकते हैं (MySQL, या memcache, या जो भी हो) में लागू कतार के साथ। आप कतार से काम करने और काम करने के लिए भी कई बक्से ले सकते हैं।

बेशक, शैतान विवरण में है, लेकिन यह डिज़ाइन आम तौर पर अधिक स्केलेबल होता है और आमतौर पर एकल-थ्रेडेड fetch-process-repeat स्क्रिप्ट से अधिक मजबूत होता है।

+0

उत्तर के लिए चीयर्स। पोस्ट-प्रोसेसिंग की मात्रा न्यूनतम है (~ 150ms प्रति ~ 2-5 सेकंड पेज अनुरोध) हमने कर्लिंग स्क्रिप्ट और प्रोसेसिंग स्क्रिप्ट के बजाय एक मोनोलिथिक संरचना के साथ चिपकने का फैसला किया है। हम एक बार में 10 यूआरएल प्राप्त करने के लिए बहु-कर्ल का उपयोग कर रहे हैं, इसलिए यह अर्ध-बहुप्रचारित है, हालांकि आदर्श नहीं है। पायथन आदर्श होगा, लेकिन नौकरी पाने के लिए हम जो जानते हैं (एफपी) के साथ जाने का मामला था। धन्यवाद! – Rob

2

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

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

  • कोई संबंधित समस्या नहीं^_^