ডিবাগ সত্তাফিল্ডকিউরি?


27

আমার একটি মডিউল রয়েছে যা খারাপ ব্যবহার করছে। একটি ইএফকিউ অপ্রত্যাশিত ফলাফলগুলি পুনরুদ্ধার করছে, তবে কেবল কোডটি দেখে কেন আমি দেখতে পাচ্ছি না । সেখানে একটি হল dpq () EFQs জন্য সমতুল্য? এগুলি ডিবাগ করার অন্যান্য উপায়?


অনুরূপ প্রশ্ন: drupal.stackexchange.com/questions/33473/… । এসকিউএল কোনও ক্লু দেয় কিনা তা পরীক্ষা করে দেখার জন্য আপনি কি ক্যোয়ারী অবজেক্টটিকে স্ট্রিংয়ে কাস্ট করতে পারেন?
ক্লাইভ

1
দুর্দান্ত পরামর্শ, তবে: পুনরুদ্ধারযোগ্য মারাত্মক ত্রুটি: শ্রেণি সত্তাফিল্ডকিউরির বস্তুকে স্ট্রিংয়ে রূপান্তর করা যায়নি :(
লেথারিয়ন

উত্তর:


36

এটি একটি হ্যাকের একটি সামান্য বিট, তবে আপনি 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

সম্ভবত এটি কেবলমাত্র ফিল্ড স্টোরেজ সিস্টেম হিসাবে মাইএসকিউএল ব্যবহার করার সময় কাজ করবে।


তাত্ত্বিকভাবে দুর্দান্ত লাগছে, তবে প্রশ্নটির মন্তব্যগুলির কী হবে? EFQ __toString () প্রয়োগ করে না?
লেথারিয়ান

4
hook_query_alter()প্রশ্নটি পাওয়ার সময়টি আর EntityFieldQueryকোনও নয় , এটি একটি স্ট্যান্ডার্ডে রূপান্তরিত হয়েছে db_select(), তাই __tostring()দুর্দান্ত কাজ করে :) যেহেতু এটি কাজ করার পরে আমি এটি বেশ ব্যবহার করছি এবং এটি বেশ ভালভাবে কাজ করে
ক্লাইভ

নিশ্চিত হয়ে গেছে যে একবার ক্যোয়ারী আসার পরে স্ট্রিংয়ে কাস্টিং কাজ করে hook_query_alter()
jedstrom

উপরোক্ত উদাহরণে ক্যোয়ারী আর্গুমেন্টগুলি (": সত্তা_প্রকার") দেখতে আপনি ডিপিএম ($ ক্যোয়ারী-> আর্গুমেন্ট ()) ব্যবহার করতে পারেন;
সানজান্ট

13

বরং আপনার নিজের hook_query_alter ঘূর্ণায়মান চেয়ে () আপনার দেওয়া যাবে devel মডিউল যোগ করে আপনার জন্য ভারী উত্তোলন করতে হবে debugট্যাগ:

$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node');
  ->addTag('debug')
  ->execute();

এটি ক্যোরিটি স্ক্রিনে মুদ্রণ করবে ঠিক dpq()তেমন।


4

@ ক্লাইভ উত্তরে যুক্ত করা, যা সাধারণত স্থানধারকটির সাথে মানের সাথে না দিয়ে প্রশ্নটি মুদ্রণ করে। প্রশ্নের সাথে মানটি মুদ্রণ করতে 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();

কোডের কয়েকটি লাইনের জন্য একটি মডিউল ইনস্টল করা ভাল অনুশীলন নয়। সে কারণেই আমি পূর্বোক্ত সমাধানটির পক্ষে বেছে নিয়েছি।


2

আপনি যদি নাইস ডিপিকিউ (বা যে কোনও কিছু => 1.1) এর সংস্করণটি ডাউনলোড করেন তবে আপনি কেবল তা করতে পারেন:

$user_query = new EntityFieldQuery();
$user_query->entityCondition('entity_type','user');
$user_query->addTag('nicedpq');
$user_result = $user_query->execute();

এবং আপনি ক্যোয়ারীটি দুর্দান্তভাবে dpm'ed পাবেন :)। উপরের কোডটির গুরুত্বপূর্ণ অংশটি হ'ল অ্যাডট্যাগ ('নিসেডপিকিউ') - যা ট্রিগার করে dpm()


বিকশিত করতে ভাল বিকল্প workaround। সরাসরি ডিও-র মাধ্যমে এই মডিউলটি খুঁজে পাওয়া যায়নি কারণ তারা সম্পর্কিত মডিউল ব্লকটি সরিয়েছিল যা সেখানে শ্রুতিমধুর ছিল।
13:48

1

আপনি এটি 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কেবলমাত্র একটি স্ক্রিপ্ট যা ডিট্রেস ব্যবহার করে, সুতরাং আপনি নিজের স্ক্রিপ্ট লিখে পিএইচপি ডিগ্রাস স্ট্যাটিক প্রোব বা মাইএসকিউএলকে ডিট্রেসিংয়ের সরাসরি বাস্তবায়ন বিবেচনা করতে পারেন ।

আরও পড়ুন: কমান্ড লাইন (স্ট্রেস এবং টিসিপিডম্প) ব্যবহার করে ড্রুপাল কোরের উন্নত ডিবাগিং


0

আপনার মডিউলটিতে এই ফাংশনটি যুক্ত করুন। তারপরে, 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);
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.