কোনটি আরও পারফরম্যান্ট: সত্তা_মেডাটাটা_আপনার বা ফিল্ড_সেট_াইটেমস?


10

সত্তা থেকে মান পেতে, দুটি উপায় আছে:

  • field_get_itemsএকটি ক্ষেত্রের মান ব্যবহার করুন এবং পান
  • entity_metadata_wrapperএকটি ক্ষেত্রের মান ব্যবহার করুন এবং পান

entity_metadata_wrapperভাষার বিভেদগুলি বিমূর্ত করার পরেও এর এপিআই মাঝে মাঝে বিশ্রী হয়ে থাকে, বিশেষত পিএইচপি 5.3 ব্যবহার করার সময়। উদাহরণস্বরূপ, দীর্ঘ পাঠ্য ক্ষেত্রের মান পাওয়া সাধারণত এই পথে যায়:

$field = $wrapper->field->value();
print $field['safe_value'];

সৌভাগ্যবশত, পিএইচপি 5.4 এই সিনট্যাক্স সমর্থন করে: print $wrapper->field->value()['safe_value'];

তবে আমার প্রশ্ন পারফরম্যান্স নিয়ে বেশি উদ্বিগ্ন। তারা দু'জন কীভাবে কাজ করবেন? তারা যখনই কোনও মূল্যের জন্য অনুরোধ করে তখনই তারা কি ডাটাবেসটিকে জিজ্ঞাসা করে? entity_metadata_wrapperএকবারে কি সব অনুরোধ করে? ( field_get_itemএকক মান-পুনরুদ্ধার আরও উপযুক্ত করা।)

আমি ড্রপাল উত্সের গভীরে ডুব দেওয়ার মতো সাহসী নই।


1
field_view_field()ক্ষেত্র রেন্ডারিংয়ের জন্য। কোনও ক্ষেত্রের মান পেতে ফাংশনটি ফিল্ড_জেট_টাইমস ()
কিমলালুনো

এবং field_get_items()শূন্য ডাটাবেসকে ওভারহেড অন্তর্ভুক্ত করে তাই আমি মনে করি এটি একটি দুর্দান্ত খোলা এবং শাট কেস :)
ক্লাইভ

@ ক্লাইভ কীভাবে আসে field_get_items()শূন্য ডাটাবেস ওভারহেডে? এটি কোথাও এর তথ্য পেতে হবে, ডান?
ফ্লোরিয়ান মার্জাইন

এছাড়াও, আমি কীভাবে entity_metadata_wrapperকাজ করে, পারফরম্যান্স-ভিত্তিক তা জানতে আগ্রহী wise
ফ্লোরিয়ান মার্জাইন

2
আপনি একটি সম্পূর্ণ লোডযুক্ত সত্তা অবজেক্টটিতে পাস করুন field_get_items()যাতে ওভারহেড ইতিমধ্যে ব্যয় করা হয়েছে ... সত্যি বলতে সত্যই এটি ডি 7 এর শ্বাসরোধী পথের কিছুটা
ক্লাইভ

উত্তর:


12

সংক্ষিপ্ত উত্তর: ফিল্ড_গেট_াইটেমস () সত্তা_মেটাডেটা_রাপর () এর চেয়ে বেশি পারফর্মেন্ট।

এই ফাংশনগুলির জন্য কোডটি দেখুন:

উভয়েরই প্রয়োজন যে আপনি সত্তাটি পেরিয়ে যান, এটি ইতিমধ্যে ডাটাবেস থেকে লোড করা হয়েছে । উদাহরণ স্বরূপ:

$node = node_load(123);
$items = field_get_items('node', $node, 'field_my_field_name');
print $items[0]['value'];

বা, যেমন আপনি ইতিমধ্যে পরামর্শ দিয়েছেন:

$wrapper = entity_metadata_wrapper('node', $node);
$field = $wrapper->field_my_field_name->value();
print $field['safe_value'];

ইতিমধ্যে আপনার কাছে উপলব্ধ একটি মূল্য পাওয়ার চেষ্টা করার নিরীহ যুক্তিযুক্ত কারণে এই দু'টি উদাহরণই আমাকে বিরক্ত করে, তবে তারা অবশ্যই প্রচুর ক্ষেত্রে কার্যকর।

আপনি কেবল এটি করতে print $node->field_my_field_name[LANGUAGE_NONE][0]['value'];পারেন তবে ক্ষেত্রটির কোনও মূল্য না থাকলে পিএইচপি বিজ্ঞপ্তি ত্রুটি ছুঁড়ে ফেলবে, যেহেতু আপনি যে অ্যারেগুলি অস্তিত্ব রাখতে পারবেন না (যেমন [LANGUAGE_NONE][0]['value']) অ্যাক্সেস করার চেষ্টা করছেন । আমি নিজেকে বেশিরভাগ সময় ইদানীং এটি করতে দেখি:

if ($field = field_get_items('node', $node, 'field_my_field_name')) {
  print $field[0]['value'];
}

যা করা থেকে অনেক বেশি পরিষ্কার:

if (isset($node->field_my_field_name[LANGUAGE_NONE]) && isset($node->field_my_field_name[LANGUAGE_NONE][0])) {
  print $node->field_my_field_name[LANGUAGE_NONE][0]['value'];
}

আপনি যদি কোডটির দিকে তাকান তবে আপনি field_get_items())দেখতে পাচ্ছেন যে এটি আরও কিছু করছে না তা নিশ্চিত করে ক্ষেত্রের অ্যারেতে নিরাময়কারী ভাষায় ডেটা রয়েছে এবং তারপরে এটি ফিরিয়ে দেয়। সুতরাং, এই জাতীয় ক্ষুদ্র ক্রিয়াকলাপটি চালনার ওভারহেড নগদ নয়, তবে আপনি যদি সত্যিকার অর্থে পারফরম্যান্সের সাথে সম্পর্কিত হন তবে ডেটা উপস্থিত রয়েছে কিনা তা আপনি নিজের পরীক্ষা করে নিতে পারেন এবং তারপরে এটি মুদ্রণ করতে পারেন।

সম্পাদনা: যেহেতু field_get_items()রানে field_language()সেখানে আসলে শুধু ভাষা চেক, তাই চেয়ে বড় কর্মক্ষমতা হিট হতে যদি আপনি ইতিমধ্যে জানি যে $ entity-> ভাষা বিদ্যমান, আপনি শুধু আপনার নিজের সুপার-performant ফাংশন লিখতে পারে হবে:

function my_super_performant_field_value_getter($entity, $field_name) {
  return isset($entity->{$field_name}[{$entity->language}]) ? $entity->{$field_name}[{$entity->language}] : FALSE;
}

ঠিক আছে, তাহলে এই চেকগুলি বাদ দিয়ে সত্তাটি একবারে লোড হয়ে যায়, আমি তাদের কতবার ব্যবহার করি না কেন? এমনকি যদি আমি সত্তা রেফারেন্স ব্যবহার করি?
ফ্লোরিয়ান মার্জাইন

হ্যাঁ, এটি আসলে ডি 7-তে সত্তা API এর একটি দুর্দান্ত শীতল বৈশিষ্ট্য। একবার আপনি কোনও সত্তা লোড করলে, এটি অনুরোধের সময়কালের জন্য ক্যাশে করা হয়। সুতরাং, আপনি $node = node_load(123);যদি 1 স্ক্রিপ্টে করেন এবং এটি আবার অন্য কোথাও করেন, আপনি সম্পূর্ণ বস্তুর লোড এবং বিল্ডের কার্যকারিতা ওভারহেডের জন্য ব্যয় করবেন না - ড্রুপাল কেবল সেই পরিবর্তনশীলটিকে বিদ্যমান সত্তার একটি অনুলিপি বরাদ্দ করে। আপনি যদি কোনও নতুন অনুলিপি লোড করতে চান তবে আপনাকে $reset = TRUEসত্তা লোড ফাংশনটিতে যেতে হবে। এছাড়াও, একটি সুপার অভিনেতা প্রাপ্ত সম্পর্কে আমার সম্পাদনাগুলি দেখুন।
চার্লি শ্লিয়েসার

1
if (isset($node->field_my_field_name[LANGUAGE_NONE]) && isset($node->field_my_field_name[LANGUAGE_NONE][0])) {প্রয়োজনীয় নয়, isset($node->field_my_field_name[LANGUAGE_NONE][0]যথেষ্ট।

@ সিএইচএক্স আমি সম্মত, তবে তা কি হবে না isset($node->field_my_field_name[LANGUAGE_NONE]), যেহেতু ভাষাটি খালি মাঠে স্থাপন করা হবে না? আমি মনে করি এটি ব-দ্বীপ / [0]এটি অপ্রয়োজনীয়।
চার্লি শ্লিয়েসার

1
@ গাইলসবি, আরও ডাটাবেস প্রশ্নগুলি প্রায়শই যোগদানের চেয়ে ভাল হয় না। ইজিার লোডিং একটি অপ্টিমাইজেশন কৌশল। তবে এমনকি এটি বলেও আমি মনে করি যে আপনার অনুমানটি মিথ্যা এবং এন্টিমেটাডেটা র্যাপার সম্ভবত ধীর, তবে এটি ব্যবহার করা এতটা সুন্দর। এটিও মাইক্রো অপ্টিমাইজেশান, দ্রুপালের সাথে কাজ করার সময় ওপিকে ভাবতে হবে না।
নিকোলাস রুনু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.