2009-07-13 7 views
8

आज मैं एक दिलचस्प मुद्दे पर भाग गया। हमारे पास एक ऐसा एप्लिकेशन है जो ज़ेंड फ्रेमवर्क कैशिंग कार्यक्षमता का उपयोग करता है। इस आवेदन करने के लिए एक अनुरोध आम तौर पर निम्न पंक्तिcall_user_func_array बनाम call_user_func

$result = call_user_func_array(array("myclass", "factory"), array($id)); 

विचार है कि हम बाद में उपयोग कर सकते हैं कारखाना विधि से एक ऑब्जेक्ट प्रदान करने के लिए है का उपयोग करते हुए एक कारखाने प्रणाली को बुलाती है। जब हमने एक कैशिंग सुविधा लागू की, तो यह कॉल बस ठीक है, मर जाता है। कोई त्रुटि नहीं, सिर्फ एक सफेद स्क्रीन। त्रुटि लॉग में कुछ भी नहीं। हम ठीक से पहले लाइन को लॉग इन करने में त्रुटि कर सकते हैं, लेकिन फैक्टरी विधि के अंदर error_log करने का प्रयास कुछ भी नहीं करता है।

दिलचस्प बात यह करने के लिए लाइन को बदलने:

$result = call_user_func(array("myclass", "factory"), $id); 

फिक्स मुद्दा।

हमने बग रिपोर्ट के लिए कुछ घंटे बिताए हैं और इस व्यवहार को समझाने के लिए बहुत कुछ नहीं आया है। किसी को विचार?

+0

मैंने हाल ही में इस मुद्दे को देखा है जबकि मेरे सभी कोड नामस्थानों का उपयोग करने के लिए परिवर्तित कर रहा है। कक्षा ठीक है और मैं इसके उदाहरणों को तत्काल कर सकता हूं। लेकिन जब मैं एक उदाहरण लेता हूं और _array या नहीं तो इसका उपयोग करने पर एक विधि को कॉल करने का प्रयास करता हूं, कुछ भी नहीं होता है। कोड जारी है, लेकिन विधि कभी नहीं कहा जाता है। –

उत्तर

2

मैं मुद्दों पड़ा है बहुत काम thats इस तरह जो __autoload पर नीचे आ गया था ठीक से फायरिंग नहीं जब एक PHP-कमांड के माध्यम से एक अभी तक लोड की गई कक्षा का आह्वान नहीं किया गया था। जहां तक ​​मुझे पता है, गूंगा परीक्षण और इसके लिए त्रुटि की तुलना में कोई अन्य रणनीति नहीं है, तो PHP कमांड को आपके लिए हल करने से पहले एक पंक्ति स्पष्ट रूप से कक्षा को आविष्कार करने का प्रयास करें।

$dummy = new MyClassName; 
call_user_func_array(array('MyClassName', 'method'), array($id)); 
unset($dummy); 
+0

मेरा सिद्धांत यह है कि कॉल करने का प्रयास करते समय call_user_func_array थोड़ी अधिक लापरवाही (बेहतर अवधि की कमी के लिए) हो रहा है। तुलना करने के लिए दोनों कार्यों के स्रोत को देखना दिलचस्प होगा। मैं इस मुद्दे के लिए PHP को एक बग रिपोर्ट सबमिट करने जा रहा हूं और देख सकता हूं कि वे क्या कहते हैं। – goose77

+0

सीधे '__autoload' को कॉल करना, या कम से कम' class_exists' (दूसरे पैरा सत्य के साथ, जो डिफ़ॉल्ट है) ऑटोलोडर को ट्रिगर करने का एक सस्ता तरीका होगा। इस तरह आप कक्षा के एक उदाहरण को तत्काल स्मृति याद नहीं करते हैं। – jason

0

PHP का कौन सा संस्करण आप उपयोग कर रहे हैं? एक बिंदु पर ReflectionClass के साथ call_user_func_array के संयोजन में एक समस्या थी। मुझे यकीन नहीं है कि यह अभी तक तय है या नहीं।

+0

हम 5.2.8 – goose77

+0

का उपयोग कर रहे हैं मुझे पूरा यकीन है कि जिस मुद्दे के बारे में मैं बात कर रहा हूं वह उससे पुराना है। – troelskn

0

क्या यह segfaulting है? अपने 'रूट' अपाचे लॉग (किसी भी वर्चुअलहोस्ट के बाहर) की जांच करें और देखें कि क्या हो रहा है। यदि वह धागा segfaulting है तो आप PHP मेलिंग सूचियों और/या बग ट्रैकर पर यह मानना ​​चाहेंगे।

वैकल्पिक रूप से आप php के एक डिबग-संकलन के साथ, एकल उपयोगकर्ता मोड में http चल रहा है, GDB में की कोशिश कर सकते और यदि आप इसे कैप्चर कर सकते हैं देखते हैं, लेकिन :-)

+0

मैंने अपने सभी लॉग खराब कर दिए हैं, और कोई संकेत नहीं है कि अपाचे segfaulting है। मेरी इच्छा है कि मेरे पास एकल उपयोगकर्ता मोड में अपाचे को डीबग करने का समय हो। – goose77

+1

रुको ... जांचें ... यह segfault किया था। PHP के लिए मैं जाता हूँ। – goose77

+0

मेरी कक्षाओं के लिए ऑटोलोडिंग का उपयोग करते समय मैंने PHP में segfaults डीबग करने के लिए कुछ कठिन परिश्रम किया है। असल में, कुछ फ़ंक्शन ऑटोलोडर को ट्रिगर नहीं करते हैं यदि कोई वर्ग मौजूद नहीं है, तो घातक त्रुटि भी न डालें, और बेकार छोड़ने के साथ आगे बढ़ें। एक अच्छा उदाहरण method_exists() का उपयोग कर एक स्ट्रिंग के साथ एक वर्ग नाम का प्रतिनिधित्व कर रहा है जिसे अभी तक शामिल नहीं किया गया है == segfault। – jason

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