অগ্রাধিকার হুক সীমা আছে?


9

যখন আমি আমার ফিল্টার বা ক্রিয়াকলাপটি অন্য সকলকে ওভাররাইড করার জন্য ইচ্ছা করি তখন আমি এটিকে একটি অগ্রাধিকার হিসাবে নির্ধারণ করব 999। যাইহোক, ইদানীং আমি দেখছি কিছু লোক অগ্রাধিকারের জন্য চূড়ান্ত মানগুলি ব্যবহার করে, যেমন 20000এবং এমনকি99999

এই উচ্চতর অগ্রাধিকারগুলি হাস্যকর বিষয়গুলি ব্যবহার করা ছাড়াও তারা কি বাস্তবে কাজ করবে? অগ্রাধিকার হুক সীমা আছে? সীমা ছাড়িয়ে গেলে কী হবে? চরম অগ্রাধিকার ব্যবহার করার সময় কি পারফরম্যান্সের পার্থক্য রয়েছে?

আপডেট: @ হার স্ট্যাক ওভারফ্লোতে পরামর্শ দেয় যে সংখ্যাটি সীমাবদ্ধPHP_INT_MAX


আপনি @hakre এর দ্বারা উত্তরটির সাথে লিঙ্ক করেননি যা এই সম্পর্কে কথা বলেছেন? এটি কিউ এর অংশ হওয়া উচিত এবং আরও অনেক কিছু, তিনি যে
নেতৃত্বটি

কোন উত্তর আপনি উল্লেখ করছেন?
শেয়া

উত্তর:


13

কোনও সীমাবদ্ধতা নেই এবং কার্য সম্পাদনের কোনও জরিমানা নেই। কেন তা বোঝার জন্য, আপনাকে বুঝতে হবে যে ডাব্লুপি বাস্তুতন্ত্রের সমস্ত হুক কীভাবে সংরক্ষণ করা হয়।

সবার আগে আপনাকে বুঝতে হবে যে সমস্ত হুকগুলি কোথায় সংরক্ষণ করা হয় এবং তারা কীভাবে তা করে। ফিল্টার এবং ক্রিয়াকলাপের সমস্ত হুক বিশ্বব্যাপী ভেরিয়েবল নামে সঞ্চিত থাকে wp_filter, হ্যাঁ হ্যাঁ অ্যাকশন হুকগুলিও এই চলকটিতে সংরক্ষণ করা হয়। এই ভেরিয়েবলটি অ্যারে সম্পর্কিত, যেখানে কীটি ক্রিয়া বা ফিল্টারের নাম এবং মান হ'ল আর একটি মিশুক অ্যারে। উদাহরণস্বরূপ আসুন আমরা 'init' ক্রিয়াটি একবার দেখি, এই পর্যায়ে আমরা নীচের কাঠামোটি দেখতে পাব:

$wp_filter = array(
    'init' => array(...),
);

এই সাব অ্যারেতে অ্যারে হিসাবে সংখ্যা কী এবং মান রয়েছে। সংখ্যার কীগুলি আমাদের অগ্রাধিকার। সংখ্যাসূচক কীগুলির সাথে যুক্ত অ্যারেগুলিতে একই অগ্রাধিকার সহ হুকের তালিকা থাকে। সুতরাং আমরা যদি কল করি add_action( 'init', 'wpse8170_my_first_init', 20 ), তবে কল করুন add_action( 'init', 'wpse8170_my_second_init', 20 )এবং শেষ পর্যন্ত কল করুন add_action( 'init', 'wpse8170_my_third_init', 10 ), আমাদের উদাহরণটি দেখতে পাবেন:

$wp_filter = array(
    'init' => array(
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
    ),
);

এখন যখন initক্রিয়াটি ট্রিগার করা হবে তখন সমস্ত হুকগুলি ksortফাংশনটির ব্যবহারের সাথে বাছাই করা হবে এবং আমাদের অ্যারে এখন দেখবে :

    array(
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
    ),

এবং সমস্ত হুক এই কাতারে কার্যকর করা হবে: প্রথমে 'wpse8170_my_third_init', তারপরে 'wpse8170_my_first_init'এবং শেষ পর্যন্ত 'wpse8170_my_second_init'

সুতরাং আপনি দেখতে পাচ্ছেন যে কোনও সীমাবদ্ধতা এবং জরিমানা নেই এবং আপনি এমন কোনও মান ব্যবহার করতে পারেন যা আপনার পিএইচপি এনভায়রনমেন্ট দ্বারা সম্পর্কিত অ্যারের জন্য কী হিসাবে গ্রহণযোগ্য।


2
max( $priorities ) + 1শেষ সংখ্যাটি সমান হলে ব্যর্থ হবে PHP_INT_MAX। সেক্ষেত্রে আপনাকে মানটি স্ট্রিংয়ে রূপান্তর করতে হবে এবং এতে কিছু যুক্ত করতে হবে।
ফুসিয়া

@ টসচো হ্যাঁ, একমত বোনাস স্নিপেট আপডেট হয়েছে।
ইউজিন মানুয়িলভ

2
"বোনাস" একটি খারাপ ধারণা, যদি সর্বাধিক সংজ্ঞা $wp_filterপরিবর্তিত হয়। এটি প্লাগইনগুলি দ্বারা সরাসরি ব্যবহার করার উদ্দেশ্যে নয়। আমরা অতীতে সংশোধন করেছি (প্রাথমিকভাবে পারফরম্যান্সের কারণে, ঘটনাক্রমে)।
অ্যান্ড্রু নাকিন

@ অ্যান্ড্রুনাচিন ঠিক আছে, আমি এটিকে সরিয়ে দিয়েছি, কারণ এটি অনেক বেশি প্রশ্ন সৃষ্টি করে :)
ইউজিন মানুয়িলভ

6

এটি একটি পূর্ণসংখ্যা, সুতরাং 32-বিট পিএইচপি সিস্টেমে এটি -2147483648 থেকে 2147483647 এর মধ্যে সীমাবদ্ধ থাকবে এবং 64-বিট পিএইচপি এ এটি -9223372036854775808 থেকে 9223372036854775807 এ সীমাবদ্ধ থাকবে।

সম্পাদনা করুন: কোনও পারফরম্যান্স পেনাল্টি নয়, এটি একটি পূর্ণসংখ্যা।

কিন্তু গুরুতরভাবে? :)


আমি পেয়েছি যে এটি একটি পূর্ণসংখ্যা, তবে আমি প্রকৃত হুক প্রক্রিয়া সম্পর্কে বলছিলাম। আমি লোকদের বলতে শুনেছি যে খুব বড় আকারের একটি হুক থাকলে হুক পুরোপুরি ব্যর্থ হয়ে যায়, এবং কলব্যাক কার্যকর হবে না
shea

WHO? কখন? এটি একটি অ্যারেতে কেবল একটি সূচক, এবং এটিতে একটি স্পারস অ্যারে, সুতরাং নগন্য প্রভাব রয়েছে। তবে সত্যই, বড় সংখ্যা কোনও সমস্যা না বোঝার একটি সূচক (উদাহরণস্বরূপ
নির্দ্বিধায়

2

@ সিঁয়া - ওয়ার্ডপ্রেস ক্রিয়াগুলি আপনি ধরে নিয়েছেন ঠিক সেইভাবে অপপোজিট করুন। একটি উচ্চ অগ্রাধিকারের চিত্র অন্যদেরকে ওভাররাইড করবে না এবং এই কর্ম / ফিল্টারকে অন্যের আগে চালাতে বাধ্য করার জন্য পিএইচপিএনপিএএমএএমএক্সের কিছু "চরম" প্রচেষ্টা নয়।

মৃত্যুদন্ড আদেশের শীর্ষে আপনার ক্রিয়া / ফিল্টার স্থাপন করতে, আপনাকে 0 এর একটি অগ্রাধিকার ব্যবহার করতে হবে।

পিএইচপিএনপিএএমএএমএক্স কেবল বিপরীত প্রান্তে; আপনি যখন নিজের অ্যাকশন / ফিল্টারটি চালানোর জন্য এটি ব্যবহার করেন তখন সমস্ত অন্যান্য (স্বাভাবিক অগ্রাধিকার) হুক সম্পূর্ণ হয়ে যায়।


1
হ্যাঁ, এটি ঠিক ধারণা। একটি চিত্রে চালিত চূড়ান্ত ফিল্টারটি আরও কোনও পরিবর্তন সম্পর্কে চিন্তা না করে ভেরিয়েবলটি সংশোধন করতে সক্ষম হবে
shea

Gণাত্মক পূর্ণসংখ্যার মানগুলির জন্যও ব্যবহার করা যেতে পারে $priority, তাই অগ্রাধিকারের সাথে আবদ্ধ কলব্যাকগুলি কার্যকরভাবে 0কার্যকর করার আদেশের শীর্ষে থাকবে না।
ডেভ রোমি

0

সীমা নেই এবং কার্য সম্পাদনের কোনও জরিমানা নেই। কোডটি পরিদর্শন করা থেকে আপনি এমনকি স্ট্রিংটিকে অগ্রাধিকার হিসাবে ব্যবহার করতে পারেন যদিও আমি এটি করার প্রস্তাব দিই না;)

যদি আপনার ক্রিয়াটি শেষ পর্যন্ত থাকতে হয় তবে $wp_actions[your hook]আপনার ক্রিয়াকলাপটি যখন ডাকা হবে তখন আপনি বিশ্বব্যাপী সূচীগুলি দেখে নির্ধারিত প্রিরিটিগুলি পরীক্ষা করতে পারেন এবং প্রয়োজনে এটিকে আবারও উচ্চ অগ্রাধিকার সহ যুক্ত করতে পারেন, তবে আমি আসলে এই ধরণের কাজ করার কারণ দেখতে ব্যর্থ হয়েছি কিছু.


0

হুক আসলে অ্যারে হিসাবে সংরক্ষণ করা হয় এবং অগ্রাধিকারটি হ'ল সংখ্যাসূচক সূচি হওয়ায় "ব্যবহারিকভাবে" কোনও সীমা থাকে না।

তবে, বাস্তবে অ্যারের আকারটি স্ক্রিপ্টের প্রয়োগের জন্য বরাদ্দকৃত মেমরির পরিমাণ দ্বারা সীমাবদ্ধ থাকবে।

সুতরাং, আমি একটি হাস্যকরভাবে বড় অগ্রাধিকার নম্বর সেট করার অনুমান করি - যা কেবল অ্যারেতে একটি সংখ্যাসূচক সূচীতে অনুবাদ করে যেখানে হুকড ফাংশনগুলি সঞ্চিত রয়েছে - ওয়ার্ডপ্রেস ক্রাশ হওয়া উচিত নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.