আমার একটি মডিউল রয়েছে যা খারাপ ব্যবহার করছে। একটি ইএফকিউ অপ্রত্যাশিত ফলাফলগুলি পুনরুদ্ধার করছে, তবে কেবল কোডটি দেখে কেন আমি দেখতে পাচ্ছি না । সেখানে একটি হল dpq () EFQs জন্য সমতুল্য? এগুলি ডিবাগ করার অন্যান্য উপায়?
আমার একটি মডিউল রয়েছে যা খারাপ ব্যবহার করছে। একটি ইএফকিউ অপ্রত্যাশিত ফলাফলগুলি পুনরুদ্ধার করছে, তবে কেবল কোডটি দেখে কেন আমি দেখতে পাচ্ছি না । সেখানে একটি হল dpq () EFQs জন্য সমতুল্য? এগুলি ডিবাগ করার অন্যান্য উপায়?
উত্তর:
এটি একটি হ্যাকের একটি সামান্য বিট, তবে আপনি 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
সম্ভবত এটি কেবলমাত্র ফিল্ড স্টোরেজ সিস্টেম হিসাবে মাইএসকিউএল ব্যবহার করার সময় কাজ করবে।
hook_query_alter()
প্রশ্নটি পাওয়ার সময়টি আর EntityFieldQuery
কোনও নয় , এটি একটি স্ট্যান্ডার্ডে রূপান্তরিত হয়েছে db_select()
, তাই __tostring()
দুর্দান্ত কাজ করে :) যেহেতু এটি কাজ করার পরে আমি এটি বেশ ব্যবহার করছি এবং এটি বেশ ভালভাবে কাজ করে
hook_query_alter()
।
বরং আপনার নিজের hook_query_alter ঘূর্ণায়মান চেয়ে () আপনার দেওয়া যাবে devel মডিউল যোগ করে আপনার জন্য ভারী উত্তোলন করতে হবে debug
ট্যাগ:
$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node');
->addTag('debug')
->execute();
এটি ক্যোরিটি স্ক্রিনে মুদ্রণ করবে ঠিক dpq()
তেমন।
@ ক্লাইভ উত্তরে যুক্ত করা, যা সাধারণত স্থানধারকটির সাথে মানের সাথে না দিয়ে প্রশ্নটি মুদ্রণ করে। প্রশ্নের সাথে মানটি মুদ্রণ করতে hook_query_alter এর নীচে নিম্নলিখিত কোডটি ব্যবহার করুন।
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();
কোডের কয়েকটি লাইনের জন্য একটি মডিউল ইনস্টল করা ভাল অনুশীলন নয়। সে কারণেই আমি পূর্বোক্ত সমাধানটির পক্ষে বেছে নিয়েছি।
আপনি যদি নাইস ডিপিকিউ (বা যে কোনও কিছু => 1.1) এর সংস্করণটি ডাউনলোড করেন তবে আপনি কেবল তা করতে পারেন:
$user_query = new EntityFieldQuery();
$user_query->entityCondition('entity_type','user');
$user_query->addTag('nicedpq');
$user_result = $user_query->execute();
এবং আপনি ক্যোয়ারীটি দুর্দান্তভাবে dpm'ed পাবেন :)। উপরের কোডটির গুরুত্বপূর্ণ অংশটি হ'ল অ্যাডট্যাগ ('নিসেডপিকিউ') - যা ট্রিগার করে dpm()
।
আপনি এটি XDebug এর মাধ্যমে ডিবাগ করার চেষ্টা করতে পারেন । একবার ইনস্টল হয়ে গেলে xdebug_start_trace()
কোডের আগে করুন এবং তার xdebug_stop_trace()
পরে, তারপরে আপনার স্পষ্ট ট্রেস লগ হবে যা কার্যকর করা হয়েছিল এবং কোথায়।
এছাড়াও আপনি মাইএসকিউএল কনফিগারেশনে কোয়েরি লগার সক্ষম করতে পারেন।
অন্য পদ্ধতিটি হ'ল স্ট্রেস / ট্রাস / ডিট্রুসকে ডিবাগারের মতো ব্যবহার করা।
Dtruss ব্যবহার করে উদাহরণ:
সমস্ত প্রশ্ন
sudo dtruss -t read -n mysqld
নির্দিষ্ট প্রশ্ন
sudo dtruss -t read -n mysqld 2>&1 | grep SPECIFIC_TEXT
দ্রষ্টব্য এটি dtruss
কেবলমাত্র একটি স্ক্রিপ্ট যা ডিট্রেস ব্যবহার করে, সুতরাং আপনি নিজের স্ক্রিপ্ট লিখে পিএইচপি ডিগ্রাস স্ট্যাটিক প্রোব বা মাইএসকিউএলকে ডিট্রেসিংয়ের সরাসরি বাস্তবায়ন বিবেচনা করতে পারেন ।
আরও পড়ুন: কমান্ড লাইন (স্ট্রেস এবং টিসিপিডম্প) ব্যবহার করে ড্রুপাল কোরের উন্নত ডিবাগিং
আপনার মডিউলটিতে এই ফাংশনটি যুক্ত করুন। তারপরে, debug
কোনও ইএফকিউতে ট্যাগ যুক্ত করুন । কোয়েরিটি মুদ্রণের জন্য ডিভেল মডিউলটিকে সক্ষম করতে হবে।
/**
* 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);
}
}