Kanca önceliği için bir sınır var mı?


9

Filtre veya eylem kancasımın diğerlerini geçersiz kılmasını istediğimde, ona bir öncelik atayacağım 999. Ancak, son zamanlarda bazı insanların öncelik için aşırı değerler kullandığını 20000ve hatta99999

Bu kadar yüksek öncelikleri kullanmanın saçma olmasının yanı sıra, gerçekten işe yarayacaklar mı? Bağlama önceliği sınırı var mı? Limit aşılırsa ne olur? Aşırı öncelikleri kullanırken bir performans farkı var mı?

Güncelleme: @harke anlaşılacağı Yığın taşması sayı ile sınırlı olduğunuPHP_INT_MAX


Bu konuda konuşan @hakre tarafından bir Yanıtla bağlantı kurmadınız mı? Q'nun bir parçası olmalı ve daha fazla, verdiği
ipucunu

Hangi cevaba atıfta bulunuyorsunuz?
shea

Yanıtlar:


13

Limit yok ve performans cezası yok. Nedenini anlamak için, tüm kancaların WP ekosisteminde nasıl saklandığını anlamanız gerekir.

Her şeyden önce, tüm kancaların nerede saklandığını ve nasıl yapıldığını anlamanız gerekir. Filtreler ve eylemler için tüm kancalar, denilen genel değişkende saklanır wp_filter, evet evet eylem kancaları da bu değişkende saklanır. Bu değişken ilişkilendirilmiş dizidir; burada anahtar eylem veya filtrenin adıdır ve değer başka bir ilişkilendirilebilir dizidir. Örneğin, 'init' eylemine bir göz atalım, bu aşamada aşağıdaki yapıyı göreceğiz:

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

Bu alt dizi, diziler olarak sayısal anahtarlara ve değerlere sahiptir. Sayısal anahtarlar önceliklerimizdir. Sayısal anahtarlarla ilişkili diziler, aynı önceliğe sahip kancaların listesini içerir. Yani ararsak add_action( 'init', 'wpse8170_my_first_init', 20 ), sonra arar add_action( 'init', 'wpse8170_my_second_init', 20 )ve son olarak ararsak add_action( 'init', 'wpse8170_my_third_init', 10 ), örneğimiz şöyle görünecektir:

$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(...),
        ),
    ),
);

Şimdi initeylem tetiklendiğinde tüm kancalar ksortişlev kullanımı ile sıralanacaktır ve dizimiz şimdi görünüyor:

    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(...),
        ),
    ),

Ve tüm kancalar bu kuyrukta yürütülecek: önce 'wpse8170_my_third_init', sonra 'wpse8170_my_first_init've sonunda 'wpse8170_my_second_init'.

Yani sınırlar ve cezalar olmadığını görebilirsiniz ve PHP ortamınız tarafından ilişkili dizi için anahtar olarak kabul edilebilir herhangi bir değeri kullanabilirsiniz.


2
max( $priorities ) + 1son sayı eşitse başarısız olur PHP_INT_MAX. Bu durumda, değeri bir dizeye dönüştürmeniz ve buna bir şey eklemeniz gerekir.
fuxia

@toscho Evet, katılıyorum. Bonus snippet'i güncellendi.
Eugene Manuilov

2
"Bonus" kötü bir fikirdir $wp_filter. Doğrudan eklentiler tarafından kullanılması amaçlanmamıştır. Geçmişte değişiklikler yaptık (öncelikle performans nedenleriyle, tesadüfen).
Andrew Nacin

@NandinNacin tamam, çok fazla soruya neden olduğu için kaldırdım :)
Eugene Manuilov

6

Bu bir tamsayıdır, bu nedenle 32 bit PHP sisteminde -2147483648 ile 2147483647 ile sınırlı olacaktır ve 64 bit PHP'de -9223372036854775808 ile 9223372036854775807 ile sınırlı olacaktır.

Düzenleme: performans cezası yok, tamsayı.

Ama ciddice? :)


Bunun bir tamsayı olduğunu anlıyorum, ama asıl kanca mekanizmasından bahsediyordum. İnsanların çok büyük bir kancaya sahip olmanın kancanın tamamen bozulmasına neden olacağını ve geri arama yapılmayacağını söylediğini duydum
shea

DSÖ? Ne zaman? Bu sadece bir dizinin bir indeksi ve buradaki seyrek bir dizi, bu yüzden ihmal edilebilir bir etki var. Ama dürüst olmak gerekirse, büyük sayılar hemen hemen bir problemi anlamadığının bir göstergesidir (örn. Çılgınca işe
yarayan

2

@shea - WordPress eylemleri tam olarak varsaydığınız şekilde OPPOSİT'te çalışır. Daha yüksek öncelikli bir rakam diğerlerini geçersiz kılmaz ve PHP_INT_MAX kullanımı bu eylemi / filtreyi diğerlerinden önce çalışmaya zorlamak için yapılan bazı "aşırı" girişimler DEĞİLDİR.

İşleminizi / filtrenizi yürütme siparişinin ÜSTÜNE koymak için 0 önceliğini kullanmanız gerekir.

PHP_INT_MAX tam tersidir; diğer tüm (normal öncelikli) kancalar tamamlandıktan SONRA eyleminizin / filtrenizin çalışmasını istediğinizde kullanılır.


1
Evet, bu tam olarak fikir. Bir kanca üzerinde çalıştırılan son filtre, başka değişikliklerden endişe etmeden değişkeni değiştirebilir
shea

Negatif tamsayı değerleri de için kullanılabilir $priority, bu nedenle öncelikli çağrının geri çağrısının 0yürütme sırasının üstünde olması gerekmez.
Dave Romsey

0

Limit yok ve performans cezası yok. Kodu teftiş itibaren bile ben bunu tavsiye etmem; öncelikleri olarak dizeleri kullanabilirsiniz;)

Eyleminizin son olması gerekiyorsa $wp_actions[your hook], eyleminiz çağrıldığında küresel dizinlere bakarak atanan pririteleri inceleyebilir ve gerekirse daha yüksek öncelikle tekrar ekleyebilirsiniz, ancak bu tür bir işlem yapmanın nedenini göremiyorum şeylerin.


0

Kancalar aslında diziler olarak saklandığından ve öncelik sayısal indeks olduğundan "pratikte" bir sınır yoktur.

Ancak, gerçekte, dizi boyutu komut dosyasının yürütülmesi için ayrılan bellek miktarı ile sınırlanacaktır.

Yani, sanırım çengel işlevlerin saklandığı dizideki sayısal bir dizine çeviren gülünç derecede büyük bir öncelik numarası ayarlamak wordpress çökmemelidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.