2011-08-10 10 views
9

मेरे पास index.php स्क्रिप्ट है जिसे मैं Google Code साइट पर पोस्ट-प्रतिबद्ध URL के रूप में उपयोग करता हूं। यह स्क्रिप्ट एक निर्देशिका क्लोन करती है और एक ऐसी परियोजना बनाती है जो कुछ काम ले सकती है। मैं इस स्क्रिप्ट को समानांतर में एक से अधिक बार चलने से बचना चाहता हूं।मैं कैसे सुनिश्चित कर सकता हूं कि मेरे पास अपाचे के माध्यम से चल रही PHP स्क्रिप्ट का केवल एक उदाहरण है?

क्या कोई ऐसी तंत्र है जिसका उपयोग मैं उस स्क्रिप्ट को निष्पादित करने से बचने के लिए कर सकता हूं यदि कोई दूसरा सत्र में पहले से ही है?

उत्तर

21

आप LOCK_EX साथ flock का उपयोग एक फ़ाइल पर एक विशेष ताला हासिल करने के लिए कर सकते हैं।

उदा .:

<?php 
$fp = fopen('/tmp/php-commit.lock', 'r+'); 
if (!flock($fp, LOCK_EX | LOCK_NB)) { 
    exit; 
} 

// ... do stuff 

fclose($fp); 
?> 

पीएचपी संस्करणों 5.3.2 के बाद आप मैन्युअल रूप से झुंड ($ fp, LOCK_UN) का उपयोग कर ताला जारी करने के लिए की जरूरत है;

+0

कभी भी झुंड() का उपयोग नहीं किया, उत्तर के लिए धन्यवाद! – powtac

+0

@LongEars उल्लेख करें कि यह कोड वास्तव में विंडोज पर एक और उदाहरण चलाता है, क्योंकि 'LOCK_NB' 'फ्लॉक' पर PHP मैन्युअल के अनुसार काम नहीं करता है। यह पिछले उदाहरण खत्म होने तक 'झुंड' पर इंतजार करेगा, और फिर पूरा कोड चलाएगा। –

+0

इसके अलावा, यह सुनिश्चित करने के लिए कि आप फॉपेन मोड को बदल सकते हैं: '$ fp = fopen ('/ tmp/php-commit.lock', 'c'); ' 'r +' का उपयोग करके PHP त्रुटि फेंक देगी यदि commit.लॉक फ़ाइल पहले से मौजूद नहीं है। – DoctorFox

1

केवल तभी जब आप चल रहे स्क्रिप्ट की स्थिति को सहेजते हैं और जांच करते हैं कि स्क्रिप्ट तब शुरू होती है जब कोई अन्य स्क्रिप्ट वर्तमान में सक्रिय हो।

उदाहरण है अगर एक स्क्रिप्ट आप कुछ इस तरह कर सकता है चल रहा है को बचाने के लिए के लिए:

$state = file_get_contents('state.txt'); 

if (!$state) { 
    file_put_contents('state.txt', 'RUNNING, started at '.time()); 

    // Do your stuff here... 

    // When your stuff is finished, empty file 
    file_put_contents('state.txt', ''); 
} 
1

इसे चलाने में कितना समय लगता है।

मेम्कैश

<?php 
$m = new Memcache(); // check the constructor call 

if($m->get('job_running')) exit; 

else $m->set('job_running', true); 



//index code here 

//at the end of the script 

$m->delete('job_running'); 

?> 

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

+1

कार्य विफलता पर मैन्युअल समाशोधन से बचने के लिए, आप बस चलने वाले समय की कुछ शीर्ष सीमा के अनुसार सेट के लिए समय-सीमा का उपयोग कर सकते हैं। – Noam

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

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