2011-01-12 21 views
8

मैंने एक ईमेल-कतार डेटाबेस तालिका बनाई है। मैं इस ईमेल में अपने PHP एप्लिकेशन को भेजने के लिए आवश्यक सभी ईमेल डाल दूंगा।प्रति मिनट एक बार से अधिक बार क्रोनबॉज कैसे चलाएं?

एक और PHP स्क्रिप्ट तब सभी अनुत्तरित ईमेल की तलाश करेगी और उन्हें भेजती है।

मैं cronjobs का उपयोग करके इस स्क्रिप्ट को चलाता हूं। दुर्भाग्य से cronjobs केवल एक बार प्रति मिनट अधिकतम चला सकते हैं। तो सबसे बुरे मामले में उपयोगकर्ता को एक मिनट का इंतजार करना पड़ता है जब तक कि उसका ईमेल वास्तव में भेजा जा रहा हो।

वर्कअराउंड के लिए मेरा वर्तमान विचार स्क्रिप्ट को एक अतिरिक्त नींद पैरामीटर के साथ बुला रहा है और cronjobs को डुप्लिकेट कर रहा है।

उदाहरण:

* * * * * curl emails.php?sleep=0 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=10 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=20 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=30 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=40 >/dev/null 2>&1 
* * * * * curl emails.php?sleep=50 >/dev/null 2>&1 

ऊपर के उदाहरण स्क्रिप्ट हर 10 सेकंड चल पाएंगे में। emails.php स्क्रिप्ट की पहली पंक्ति होगा:

sleep($_REQUEST['sleep']); 
+1

superuser.stackexchange.com पर अधिक जानकार लोग हो सकते हैं। – EboMike

+1

आप एक php daemon चाहते हैं, क्रॉन स्क्रिप्ट नहीं। –

उत्तर

9

शुरुआत के लिए, मैं नहीं बल्कि कर्ल का उपयोग कर एक स्क्रिप्ट कॉल करने के लिए की तुलना में PHP के कमांड लाइन संस्करण का उपयोग की सलाह देते हैं। फिर आप एक समझदार जीवनकाल के साथ एक PHP स्क्रिप्ट बना सकते हैं जो किसी दिए गए समयावधि के भीतर प्रतिक्रिया आउटपुट से बाधित नहीं है।

इस तरह, आप क्रॉन का उपयोग करने की बजाय PHP स्क्रिप्ट के भीतर ईमेल/ट्रांसमिट/नींद इत्यादि के लिए बस सो/चेक कर सकते हैं।

इसके अतिरिक्त, मैं यह सुनिश्चित करने के लिए सावधानी बरतता हूं कि एक ही समय में एकाधिक PHP स्क्रिप्ट डेटाबेस तालिका पर ऑपरेट नहीं कर रहे हैं, या तो एक पिड फ़ाइल या डेटाबेस सेटिंग दृष्टिकोण (यदि कोई दी गई फ़ाइल/सेटिंग मौजूद है/है सेट, अपर प्रोसेसिंग) या क्रॉन जॉब को समझदारी से समय और स्क्रिप्ट के अधिकतम प्रोसेसिंग समय को सीमित करके जांच कर यह जांच कर कि चक्र के "ईमेल की जांच करें" भाग शुरू करने से पहले कितना समय चल रहा है।

8

यह स्क्रिप्ट स्तर पर किया जाना है।

// cron.php running every 10 seconds 
// you need to setup this cron run every minute using `crontab` of cPanel etc 
<?php 

$expireTime = time() + 60; 
while (time() < $expireTime) { 
    // my php logic here 

    sleep(10); 
    // sleep for 10 seconds 
    // you may change the sleep time to change frequency 
} 
1

यदि आप यह हर 10 सेकंड करते हैं, तो क्रॉन नौकरी के लिए सही उपकरण नहीं है। आपको जो चाहिए वह एक ऐसी स्क्रिप्ट है जो ईश द्वारा दिखाए गए अनुसार लगातार चलती है।

आप स्क्रिप्ट/स्टॉप स्क्रिप्ट को /etc/init.d में सेट करके और इसे सक्षम करके स्क्रिप्ट को एक सेवा के रूप में पंजीकृत कर सकते हैं।

या यदि आपके पास केवल उपयोगकर्ता खाता है, तो आप इसे स्क्रीन सत्र में चला सकते हैं। फिर आप त्रुटि निदान के लिए आउटपुट भी देख सकते हैं।

14

यहां एक साधारण बैश स्क्रिप्ट है जिसे मैंने लिखा है जिसका उपयोग 1 मिनट से अधिक बार चलाने के लिए क्रोंटैब के साथ किया जा सकता है।

आप इसे सहेज सकते हैं के रूप में ~/bin/runEvery.sh और उसके बाद इस तरह crontab कुछ लिखने हर 5 सेकंड otherScript.sh को चलाने के लिए:

*/1 * * * * ~/bin/runEvery.sh 5 otherScript.sh

यह स्क्रिप्ट है:

#!/bin/bash 

inputPeriod=$1 
runCommand=$2 
RUN_TIME=60 
error="no" 

if [ 'x'"$runCommand" != 'x' ] 
then 
    if [ 'x'$inputPeriod != 'x' ] 
    then 
     loops=$(($RUN_TIME/$inputPeriod)) 
     if [ $loops -eq 0 ] 
     then 
      loops=1 
     fi 

     for i in $(eval echo {1..$loops}) 
     do 
      $runCommand 
      sleep $inputPeriod 
     done 

    else 
     error="yes" 
    fi 
else 
    error="yes" 
fi 

if [ $error = "yes" ] 
then 
    echo "runEvery - runs a command every X seconds for a minute" 
    echo "Usage: runEvery.sh <# in seconds < 60> <command to run>" 
fi 
संबंधित मुद्दे