2015-10-02 5 views
9

PHPRedis और Apache PHP-FPM का उपयोग करके मैं कनेक्शन का पुन: उपयोग करने के लिए pconnect() कॉल का उपयोग कर रहा हूं - यह अतीत में सहायक रहा है ताकि कनेक्शन की संख्या बहुत ऊंची हो। हालांकि, जहां हमारे प्राथमिक रेडिस नोड नीचे चला जाता है - हम स्वचालित रूप से गुलाम को मास्टर को बढ़ावा देते हैं और पुराना मास्टर केवल पढ़ने के लिए ही जाता है। हालांकि pconnect() हालांकि पुराने मिस्ट के साथ कनेक्शन रख रहा है - इसलिए सेट() कमांड विफल होने लगते हैं।PHPRedis और PHP-FPM का उपयोग करते समय एक pconnect() कनेक्शन को बंद या रीसेट कैसे करें?

हमें आवश्यकता है कि प्रक्रिया को मारने के बिना उन लगातार कनेक्शन को फाड़ने का एक तरीका है। कोई विचार?

उत्तर

10

लगातार धाराओं पीएचपी internals द्वारा प्रदान की जाती है, यह अलिखित है कानून जो लगातार धारा बनाने के लिए एक रास्ता खोलता है, उसे भी नष्ट करने का एक तरीका प्रदान करना चाहिए।

PHP रेडिस उस कानून को तोड़ता है, उपयोगकर्तालैंड से लगातार स्ट्रीम को नष्ट करने का कोई तरीका नहीं है।

कार्रवाई के पाठ्यक्रम पीआर को आवश्यक विधि के कार्यान्वयन के लिए होना चाहिए।

यहाँ PHP7 शाखा है जो Redis :: pclose लागू करता है के खिलाफ एक पैच है: https://gist.github.com/krakjoe/326eadc61bea38fdd6e6

ध्यान दें कि, pdisconnect के लिए कोड मौजूदा डिस्कनेक्ट पर ही आधारित होता, इन कार्यों के दोनों मेरे लिए अजीब लग रही है और नहीं कर रहे हैं उनके वापसी मूल्य के बारे में ईमानदार। मुझे लगता है कि उस अजीबता पर भरोसा कुछ परीक्षण या कोड हैं इसलिए इसे ठीक करने का प्रयास नहीं किया है।

किसी भी पीआर का उल्लेख करना चाहिए कि ये कार्य अजीब लगते हैं, और PHP7 सामान तोड़ने का सही समय है।

2

क्या आप टाइमआउट के साथ पिनकनेक्ट को कॉल कर रहे हैं? प्रत्येक बार टाइमआउट पार होने पर कनेक्शन को बंद करना बंद हो जाता है, फिर आप एक अलग पते के साथ फिर से कनेक्ट करने से पहले मास्टर को फिर से हल कर सकते हैं।

आप एक Redis क्लस्टर चला रहे हैं, PHPRedis कि 'चले गए' प्रतिक्रिया के लिए समर्थन के साथ इस स्थापना के लिए विशिष्ट है टाइमआउट व्यवहार के साथ एक क्लस्टर मोड है: https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#timeout

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