2012-05-08 15 views
7

मुझे आश्चर्य है कि किसी को apc_exists() के साथ कोई अजीब व्यवहार मिला है, तो व्यवहार जो पूरे WAMP सर्वर को apc_add() या apc_store() के साथ उपयोग करते समय लटकने का कारण बनता है? "डीबगिंग" के लंबे सत्र के बाद और समस्या को कम करने के बाद मैं निम्नलिखित कोड के साथ समाप्त हुआ जो मेरे WAMP को क्रैश करने का कारण बनता है।apc_exists और apc_add के साथ डेडलॉक? (एपीसी और पीएचपी)

जहां तक ​​मैं कह सकता हूं कि इसे 1 apc_exists() और 2 apc_add() अलग-अलग कुंजी तक पहुंचने की आवश्यकता है। [इस प्रकार यह एक डेडलॉक-इश्यू की तरह लगता है] मैं इस स्क्रिप्ट को क्रोम में चलाता हूं और तब तक F5-key को तब तक धक्का देता है जब तक कि मुझे दो बार होने वाली रैंड-चीज नहीं मिल जाती। उस समय या पहली बार यह आमतौर पर लटकता है।

<?php 
$result = "asdfioasdjfoasdjf"; 
if(apc_exists("asdf")) { 
    echo("#1<br/>"); 
    apc_add("launcher", $result, 1); 
} else { 
    echo("#2<br/>"); 
    $result = "asdfasdfasdf"; 
    apc_add("launcher", $result, 10); 
} 
if(rand(0,100) < 4) { 
    echo("#stored data!<br/>"); 
    apc_add("asdf", "2130130", 1); 
} 
?> 

मेरे प्रणाली/स्थापना:
विंडोज 7 64 बिट
WAMP 2.2d 32 बिट
पीएचपी संस्करण 5.3.10
एपीसी संस्करण 3.1.9 | $ संशोधन: 325040 $

क्या मैं कोड में कुछ गलत कर रहा हूं? क्या यह विंडोज़/वैंप से संबंधित है या यह अन्य वातावरण और php/apc-version में मौजूद है? उपरोक्त मामले में, यदि मैं apc_exists() को apc_fetch() के साथ प्रतिस्थापित करता हूं, तो सिस्टम क्रैश नहीं होता है, क्या किसी को पता है क्यों?

+1

यहाँ एक ही:

एक जांच apc_fetch का उपयोग कर की तरह लग सकता है मौजूद है। ऐसा लगता है कि कुछ यादृच्छिक मामलों में apc_exists + 1 सेकंड टाइमआउट कुंजी = डेडलॉक। मुझे लगता है कि यह एक बग है? – Mahn

+0

ठीक है, मेरे पास वास्तव में 300 की चाबी थी, इसलिए यह –

+0

हाँ से संबंधित नहीं है, यह एक प्रारंभिक धारणा थी, लेकिन मुझे लगता है कि नीचे दिया गया उत्तर अभी भी लागू होता है; जब तक कुंजी एक समय समाप्ति तिथि के रूप में है और यह समाप्त हो गई है फिर भी, आंतरिक डुप्लिकेट – Mahn

उत्तर

5

मुझे विश्वास है कि मुझे कारण मिला है। यह सब कुछ अच्छी तरह से नीचे आता है answer SO:

सबसे पहले, यह जानना महत्वपूर्ण है कि अगर कोई एक विशिष्ट टीटीएल के साथ पहले से मौजूद एक कुंजी स्टोर करने का प्रयास करता है, और ttl अभी तक पास नहीं हुआ है, तो एक नया प्रवेश बनाया जाएगा; इससे कोई फर्क नहीं पड़ता कि कुंजी समान है, आंतरिक रूप से वहां एक ही कुंजी की दो प्रविष्टियां होंगी।

दूसरा, एपीसी असफल हो सकता है (मिस)। यहां तक ​​कि जब इसके लिए कोई स्पष्ट कारण नहीं है। क्यूं कर? एपीसी स्पष्ट रूप से स्थिरता पर गति का पक्ष बना रहा था, जिसका अर्थ यह है कि जब एपीसी चालक कुछ क्लीनआउट करने में व्यस्त रहता है, तो यह तब तक इंतजार करने के बजाय न्यूल वापस लौटाएगा, भले ही डेटा मौजूद हो। इसका लंबा संस्करण यहां है: http://phpadvent.org/2010/share-and-enjoy-by-gopal-vijayaraghavan

तो प्रश्न में उल्लिखित विशिष्ट मामले में क्या चल रहा है? प्रत्येक अनुरोध के बीच का समय 1 सेकंड से कम है, कुंजी के निर्दिष्ट टीटीएल, इसलिए अगर आप कुंजी को स्टोर करने का प्रयास करते हैं तो डुप्लिकेट हो सकता है। "लेकिन, यह apc_add का उपयोग कर रहा है, क्या यह गारंटी नहीं देनी चाहिए कि कुंजी केवल तभी संग्रहीत की जाती है जब यह पहले से मौजूद न हो?" जाहिर है नहीं :) यह डेडलॉक यादृच्छिक होने का कारण बनता है: कभी-कभी apc_add काम करेगा जैसा कि आप उम्मीद करेंगे, कुछ अन्य इसे "याद करते हैं", यानी, apc_add यह समझने में विफल रहता है कि वहां मौजूद एक और मौजूदा कुंजी भी है। यह शायद कोई समस्या नहीं है यदि TTL = 0, क्योंकि इस तरह की स्थिति में कुंजी को अधिलेखित किया जाता है, लेकिन प्रश्न के विशिष्ट मामले में, यह कुंजी खोजने में गलती से असफल होने के परिणामस्वरूप डुप्लिकेट संग्रहीत करेगा और एक टीटीएल होने की कुंजी जो अभी तक पारित नहीं हुई है।

चूंकि अब एपीसी_एक्सिस्ट्स का उपयोग होने पर आंतरिक रूप से एक ही कुंजी के साथ दो प्रविष्टियां होती हैं, तो यह भ्रमित हो जाती है और लटकती है।

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

+1

कि अच्छी सलाह और सब है हो सकता है नहीं है, लेकिन मुझे यकीन है कि यह हाथ में सवाल का जवाब नहीं कर रहा हूँ - ऊपर नमूना कोड सभी सरल-रेखा है ; वहां कुछ भी नहीं है जो लटकना चाहिए। – duskwuff

+1

सही, बिंदु यह है कि ओपी के कोड में कुछ भी गलत नहीं है, वह क्या अनुभव कर रहा है बस एपीसी कैसे काम करता है। – Mahn

+2

दुभाषिया को तोड़ना "बस एपीसी कैसे काम करता है" है? मुझे नहीं लगता। मुझे यकीन है कि यह एपीसी में एक बग है, और तदनुसार रिपोर्ट किया जाना चाहिए। – duskwuff

1

मेरा मानना ​​है कि यह स्पष्ट रूप से उल्लेख नहीं किया है, लेकिन गतिरोध apc_exists समारोह के साथ केवल होते हैं।apc_fetch किसी भी deadlocks पीड़ित प्रतीत नहीं होता है। मैंने पाया है कि apc_add के लिए बदलना deadlocks पर कोई प्रभाव नहीं पड़ता है, वे दोनों कार्यों के लिए होते हैं।

public function has($key) { 
    apc_fetch($key, $exists); 
    return $exists; 
} 
संबंधित मुद्दे