2012-06-09 16 views
5

से अधिक समय लेता है मेरे पास एक php पृष्ठ है जिसे कभी-कभी स्क्रिप्ट की शुरुआत में डेटाबेस में लिखने की आवश्यकता होती है।PHP: MySQL क्वेरी छोड़ें यदि यह

शेड्यूल किए गए mysqldump बैकअप के दौरान, पृष्ठ पहुंच योग्य नहीं है, क्योंकि यह लॉक की गई तालिका को लिखने का प्रयास कर रहा है।

लॉक के दौरान, MySQL उन SQL अद्यतनों को कतार देता है, और बैकअप पूरा होने के बाद, उन्हें वांछित के रूप में निष्पादित किया जाता है। फिर भी मेरा PHP पृष्ठ तब तक प्रदर्शित नहीं होगा जब तक कि बैकअप पूरा न हो जाए।

हालांकि, चूंकि अपडेट स्क्रिप्ट पर कुछ भी वापस नहीं लौटते हैं, मेरी इच्छा है कि वे लॉक के दौरान मेरी स्क्रिप्ट को लटका नहीं देंगे; मुझे आशा है कि एक तरीका है जिससे मैं phs को mysql को एसक्यूएल अपडेट भेजने के लिए कह सकता हूं और अपडेट पूरा होने की पुष्टि के बारे में चिंता न करें।

मैं php को mysql को क्वेरी भेजने के लिए चाहता हूं, और फिर अद्यतन एक दूसरे में पूरा नहीं होने पर केवल PHP की अगली पंक्ति पर जारी रहना चाहता है।

मैं विंडोज सर्वर पर PHP चला रहा हूं, इसलिए मैं समझता हूं कि कुछ प्रकार का थ्रेडिंग एक विकल्प नहीं है।

यदि उस क्वेरी (विशेष रूप से) पर टाइमआउट सेट करने का कोई तरीका है, तो यह आदर्श हो सकता है, लेकिन अगर मैं समय निकालता हूं तो मैं पूरी तरह से एसक्यूएल अपडेट को फिर से नहीं लेना चाहता हूं। लॉक खत्म होने के बाद भी मैं MySQL को संसाधित करना चाहता हूं।

आप क्या सिफारिश करेंगे (एसक्यूएल अपडेट को हटाने के लिए पूरी तरह से एक विकल्प नहीं है)?

+0

संभव नहीं है। वास्तविक क्वेरी कॉल यांत्रिकी पर PHP का कोई नियंत्रण नहीं है। PHP को थ्रेड नहीं किया गया है, भले ही यह किस ओएस पर चल रहा हो। –

+0

यदि PHP में कुछ प्रकार का टाइमआउट फ़ंक्शन है जो encapsulated फ़ंक्शन पर टाइमआउट डालने के दौरान किसी अन्य फ़ंक्शन-कॉल को एन्सेप्लेटेड कर सकता है, तो क्या वह तकनीकी रूप से बहु-थ्रेडेड होगा? –

+0

नहीं। PHP को थ्रेडिंग के लिए कोई समर्थन नहीं है, और अधिकतर संभावना पूरी भाषा के मूलभूत पुनर्लेखन के बिना कभी भी बहुप्रचारित नहीं होगी - उदा। PHP v6। अधिकांश PHP कोर पुस्तकालय थ्रेड सुरक्षित नहीं हैं। –

उत्तर

3

अन्य लोगों के लिए जो इस धागे में आ सकते हैं, मैंने आखिरकार यह फ़ंक्शन लिखा है कि तालिका लॉक है या नहीं, और केवल एसक्यूएल अद्यतन अगर यह नहीं बंद कर दिया है:

function isLocked($databaseName,$tableName) 
    { 
     $sql = "show open tables from `".$databaseName."` where `table`=`".tableName."` and In_use > 0;"; 
     $result = @mysql_query($sql); 
     if (mysql_num_rows($result) != 0) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

(नोट: इस मज़ा ction मानता है कि डेटाबेस कनेक्शन पहले से स्थापित है)

यह काम करता है, क्योंकि मैंने कोड संशोधित किया है ताकि एसक्यूएल अपडेट अंततः अगली बार पृष्ठ लॉक किए बिना लोड हो जाएंगे।

3

पीडीओ का उपयोग करके एक समाधान, टाइमआउट के साथ एक कनेक्ट शुरू करें, एक लेनदेन शुरू करें और आपके लॉक होने के मामले में, टाइमआउट कनेक्शन बंद कर देगा और रोलबैक होगा।

पीडीओ में टाइमआउट के लिए, पीडीओ :: ATTR_TIMEOUT का उपयोग करने के लिए।

1

मुझे लगता है कि ऐसा करने का एकमात्र तरीका आपको स्क्रिप्ट को टुकड़ों में विभाजित करता है और AJAX कॉल, का उपयोग करके आप बड़ा अपडेट भेज सकते हैं और बाकी स्क्रिप्ट के साथ जारी रख सकते हैं जो उस प्रक्रिया पर निर्भर नहीं है, अगर सभी स्क्रिप्ट अद्यतन के परिणाम पर निर्भर करता है, एकमात्र तरीका एक अच्छा लोडिंग कर रहा है ...

+0

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

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