क्या हुक प्राथमिकता के लिए एक सीमा है?


9

जब मैं अपने फिल्टर या एक्शन हुक को अन्य सभी को ओवरराइड करना चाहता हूं, तो मैं इसे प्राथमिकता दूंगा 999। हालांकि, हाल ही में मैं देख रहा हूं कि कुछ लोग प्राथमिकता के लिए चरम मूल्यों का उपयोग करते हैं, जैसे कि 20000, और यहां तक ​​कि99999

इस तथ्य के अलावा कि प्राथमिकताओं का उपयोग करना बहुत हास्यास्पद है, क्या वे वास्तव में काम करेंगे? क्या हुक प्राथमिकता के लिए एक सीमा है? यदि सीमा पार हो गई तो क्या होगा? चरम प्राथमिकताओं का उपयोग करते समय क्या कोई प्रदर्शन अंतर है?

अद्यतन: @ स्टैक ओवरफ्लो पर सुझाव देता है कि संख्या सीमित हैPHP_INT_MAX


क्या आपने @hakre द्वारा एक उत्तर से लिंक नहीं किया है जो इस बारे में बात करता है? यह क्यू का हिस्सा होना चाहिए, और अधिक, उस लीड का पालन करें जो उसने दिया था, मुझे संदेह है कि वह गंभीरता से एक या दो चीजों को जानता है ...
ब्रासोफिलो

आप किस उत्तर का हवाला दे रहे हैं?
शिया

जवाबों:


13

कोई सीमा नहीं है और कोई प्रदर्शन दंड नहीं है। यह समझने के लिए कि, आपको यह समझने की आवश्यकता है कि WP पारिस्थितिकी तंत्र में सभी हुक कैसे संग्रहीत हैं।

सबसे पहले आपको यह समझने की आवश्यकता है कि सभी हुक कहाँ संग्रहीत हैं और वे इसे कैसे करते हैं। फ़िल्टर और कार्यों के लिए सभी हुक को वैश्विक चर में संग्रहीत किया जाता है 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'

तो आप देख सकते हैं कि कोई सीमा और दंड नहीं है और आप किसी भी मूल्य का उपयोग कर सकते हैं जो आपके PHP वातावरण द्वारा संबद्ध सरणी के लिए एक कुंजी के रूप में स्वीकार्य है।


2
max( $priorities ) + 1अंतिम संख्या के बराबर होने पर विफल हो जाएगा PHP_INT_MAX। उस स्थिति में आपको मान को एक स्ट्रिंग में बदलना होगा और इसमें कुछ जोड़ना होगा।
FUXIA

@toscho हाँ, सहमत हूँ। बोनस स्निपेट अपडेट किया गया।
यूजीन मनुविलोव

2
"बोनस" एक बुरा विचार है, $wp_filterकभी भी बदलाव की परिभाषा के मामले में । यह सीधे प्लगइन्स द्वारा उपयोग करने के लिए नहीं है। हमने अतीत में (मुख्य रूप से प्रदर्शन कारणों से, संयोगवश) संशोधन किए हैं।
एंड्रू नेशिन

@AndrewNacin ठीक है, मैंने इसे हटा दिया है, क्योंकि यह बहुत सारे सवालों का कारण बनता है :)
यूजीन मनुइलोव

6

यह पूर्णांक है, इसलिए 32-बिट PHP सिस्टम पर यह -2147483648 से 2147483647 तक सीमित रहेगा, और 64-बिट PHP पर यह -22223372036854775808 से 9223372036854775807 तक सीमित रहेगा।

संपादित करें: कोई प्रदर्शन जुर्माना नहीं, यह पूर्णांक है।

परन्तु गंभीरता से? :)


मुझे लगता है कि यह एक पूर्णांक है, लेकिन मैं वास्तविक हुक तंत्र के बारे में बात कर रहा था। मैंने लोगों को यह कहते सुना है कि एक हुक बहुत बड़ा होने के कारण हुक पूरी तरह से विफल हो जाएगा, और कॉलबैक निष्पादित नहीं किया जाएगा
shea

Who? कब? यह एक सरणी में सिर्फ एक सूचकांक है, और उस पर एक विरल सरणी है, इसलिए इसमें नगण्य प्रभाव है। लेकिन ईमानदारी से, बड़ी संख्या एक समस्या को समझने के लिए बहुत ज्यादा एक संकेतक है (उदाहरण के लिए, जो कुछ भी काम कर सकता है खूनी कोशिश कर रहा है!)
10

2

@ शशि - वर्डप्रेस क्रियाएं ठीक उसी तरह से काम करती हैं जिस तरह से आपने ग्रहण किया था। एक उच्च प्राथमिकता का आंकड़ा दूसरों को ओवरराइड नहीं करेगा, और PHP_INT_MAX का उपयोग इस कार्रवाई / फ़िल्टर को किसी अन्य के सामने चलाने के लिए मजबूर करने के लिए कुछ "चरम" प्रयास नहीं है।

निष्पादन आदेश के शीर्ष पर अपनी कार्रवाई / फ़िल्टर करने के लिए, आपको 0 की प्राथमिकता का उपयोग करना होगा।

PHP_INT_MAX बस विपरीत छोर पर है; इसका उपयोग तब किया जाता है जब आप अपने एक्शन / फिल्टर को अन्य सभी (सामान्य प्राथमिकता) हुक को चलाने के लिए पूरा करना चाहते हैं।


1
हाँ, यह बिल्कुल विचार है। अंतिम फ़िल्टर जो एक हुक पर चलाया जाता है, किसी भी अन्य परिवर्तन के बारे में चिंता किए बिना चर को संशोधित करने में सक्षम होगा
shea

नकारात्मक पूर्णांक मानों के लिए भी उपयोग किया जा सकता है $priority, इसलिए प्राथमिकता के साथ हुक किए गए कॉलबैक 0निष्पादन के आदेश के शीर्ष पर नहीं होंगे।
डेव रोमसे

0

कोई सीमा नहीं है और कोई प्रदर्शन दंड नहीं है। कोड का निरीक्षण करने से आप प्राथमिकताओं के रूप में भी तार का उपयोग कर सकते हैं, हालांकि मैं ऐसा करने की सलाह नहीं दूंगा;)

यदि आपकी कार्रवाई अंतिम होनी है तो आप अपनी कार्रवाई के बुलाए जाने पर वैश्विक अनुक्रमितों को देखते हुए नियत की गई प्रायरिटीज़ का निरीक्षण कर सकते हैं $wp_actions[your hook], और ज़रूरत पड़ने पर इसे फिर से उच्च प्राथमिकता के साथ जोड़ सकते हैं, लेकिन मैं वास्तव में इस तरह का काम करने का एक कारण देखने में विफल रहता हूं। की चीज़ों का।


0

"व्यावहारिक रूप से" कोई सीमा नहीं है क्योंकि हुक को वास्तव में सरणियों के रूप में संग्रहीत किया जाता है और प्राथमिकता संख्यात्मक सूचकांक है।

लेकिन, वास्तव में, सरणी का आकार स्क्रिप्ट के निष्पादन के लिए आवंटित स्मृति की मात्रा से सीमित होगा।

तो, मुझे लगता है कि हास्यास्पद रूप से बड़ी प्राथमिकता संख्या निर्धारित करना - जो सिर्फ उस सरणी में एक संख्यात्मक सूचकांक में अनुवाद करता है जहां हुक किए गए कार्य संग्रहीत होते हैं - वर्डप्रेस को क्रैश नहीं करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.