मेरे पास एक मॉड्यूल है जो दुर्व्यवहार कर रहा है। एक EFQ अप्रत्याशित परिणाम प्राप्त कर रहा है, लेकिन मैं यह नहीं देख सकता कि सिर्फ कोड को देखकर क्यों । क्या EFQ के लिए एक dpq () बराबर है? उन्हें डिबग करने के अन्य तरीके?
मेरे पास एक मॉड्यूल है जो दुर्व्यवहार कर रहा है। एक EFQ अप्रत्याशित परिणाम प्राप्त कर रहा है, लेकिन मैं यह नहीं देख सकता कि सिर्फ कोड को देखकर क्यों । क्या EFQ के लिए एक dpq () बराबर है? उन्हें डिबग करने के अन्य तरीके?
जवाबों:
यह एक हैक का एक छोटा सा है, लेकिन आप EntityFieldQuery
क्वेरी के लिए मुद्रण करने में रुचि रखने वाले किसी भी व्यक्ति के लिए एक टैग जोड़ सकते हैं , फिर hook_query_alter()
इसे तब लागू करने के लिए इसे रोक सकते हैं जब यह एक मानक हो SelectQuery
, फिर इसे डीबगिंग के लिए स्ट्रिंग में डाल दें:
function MYMODULE_query_alter($query) {
if ($query->hasTag('efq_debug')) {
dpm((string)$query);
}
}
$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node')
->addTag('efq_debug')
->execute();
यह थोड़ा हैक है लेकिन ट्रिक करता है। उपरोक्त के लिए आउटपुट है:
SELECT node.nid AS entity_id, node.vid AS revision_id, node.type AS bundle, :entity_type
AS entity_type
FROM {node} node
संभवत: यह केवल MySQL को फील्ड स्टोरेज सिस्टम के रूप में उपयोग करने पर भी काम करेगा।
hook_query_alter()
क्वेरी के लिए हो जाता है तब तक EntityFieldQuery
कोई अधिक नहीं होता है, इसे एक मानक के रूप में परिवर्तित किया जाता है db_select()
, इसलिए __tostring()
महान काम करता है :) क्योंकि इसे बाहर काम करने के बाद मैं इसे काफी उपयोग कर रहा हूं और यह बहुत अच्छी तरह से काम करता है
hook_query_alter()
।
@Clive उत्तर को जोड़ना, जो आम तौर पर प्लेसहोल्डर के साथ क्वेरी को प्रिंट करता है और मूल्य के साथ नहीं। क्वेरी के साथ मान को प्रिंट करने के लिए हुक_क्वेरी_ल्टर के तहत निम्न कोड का उपयोग करें।
function hook_query_alter($query) {
if ($query->hasTag('debug')) {
$sql = (string)$query;
$connection = Database::getConnection();
foreach ((array) $query->arguments() as $key => $val) {
$quoted[$key] = $connection->quote($val);
}
$sql = strtr($sql, $quoted);
dpm($sql);
}
}
$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node');
->addTag('debug');
->execute();
कोड की कुछ पंक्तियों के लिए मॉड्यूल स्थापित करना अच्छा अभ्यास नहीं है। यही कारण है कि मैंने उपरोक्त समाधान का विकल्प चुना।
यदि आप नाइस DPQ (या कुछ भी => 1.1) के देव संस्करण को डाउनलोड करते हैं , तो आप बस यह कर सकते हैं:
$user_query = new EntityFieldQuery();
$user_query->entityCondition('entity_type','user');
$user_query->addTag('nicedpq');
$user_result = $user_query->execute();
और आपको क्वेरी dpm'ed अच्छी तरह से मिल जाएगी :)। ऊपर दिए गए कोड में महत्वपूर्ण हिस्सा addTag ('nicedpq') है - जो ट्रिगर करता है dpm()
।
आप इसे XDebug के माध्यम से डीबग करने का प्रयास कर सकते हैं । एक बार स्थापित xdebug_start_trace()
होने के xdebug_stop_trace()
बाद , कोड से पहले करें, और उसके बाद, फिर आपके पास स्पष्ट ट्रेस लॉग होगा जिसे निष्पादित किया गया था और जहां।
इसके अलावा आप MySQL कॉन्फ़िगरेशन में क्वेरी लकड़हारा सक्षम कर सकते हैं।
दूसरी विधि डिबगर्स की तरह स्ट्रेस / ट्रस / डट्रस का उपयोग करना है।
Dtruss का उपयोग करके उदाहरण:
सभी प्रश्न
sudo dtruss -t read -n mysqld
विशिष्ट प्रश्न
sudo dtruss -t read -n mysqld 2>&1 | grep SPECIFIC_TEXT
ध्यान दें कि dtruss
सिर्फ एक स्क्रिप्ट है जो DTrace का उपयोग करती है, इसलिए आप अपनी स्क्रिप्ट लिखकर PHP DTrace static probes या DTracing MySQL के प्रत्यक्ष कार्यान्वयन पर विचार कर सकते हैं ।
और पढ़ें: कमांड लाइन (स्ट्रेस और tcpdump) का उपयोग करके ड्रुपल कोर का उन्नत डिबगिंग
इस फ़ंक्शन को अपने मॉड्यूल में जोड़ें। फिर, टैग debug
को किसी भी EFQ में जोड़ें । क्वेरी मुद्रित करने के लिए डेवेल मॉड्यूल को सक्षम करने की आवश्यकता होती है।
/**
* Implements hook_query_TAG_alter().
*
* Add the tag 'debug' to any EFQ and this will print the query to the messages.
*
* @param \QueryAlterableInterface $query
*/
function MYMODULE_query_debug_alter(QueryAlterableInterface $query) {
if (function_exists('dpq') && !$query->hasTag('debug-semaphore')) {
$query->addTag('debug-semaphore');
dpq($query);
}
}