Apakah ada batasan untuk mengaitkan prioritas?


9

Ketika saya ingin filter atau tindakan saya mengungguli semua yang lain, saya akan menetapkan prioritas 999. Namun, belakangan ini saya telah melihat beberapa orang menggunakan nilai ekstrim untuk prioritas, seperti 20000, dan bahkan99999

Selain fakta bahwa menggunakan prioritas setinggi ini konyol, apakah mereka benar-benar berfungsi? Apakah ada batasan untuk mengaitkan prioritas? Apa yang akan terjadi jika batas terlampaui? Apakah ada perbedaan kinerja saat menggunakan prioritas ekstrem?

Pembaruan: @harke menyarankan pada Stack Overflow bahwa jumlahnya dibatasi olehPHP_INT_MAX


Tidakkah Anda menautkan ke Jawaban oleh @hakre yang membicarakan hal ini? Itu harus menjadi bagian dari Q, dan lebih banyak lagi, ikuti petunjuk yang dia berikan, saya curiga dia benar-benar tahu satu atau dua hal ...
brasofilo

Apa jawaban yang Anda maksud?
shea

Jawaban:


13

Tidak ada batasan dan tidak ada penalti kinerja. Untuk memahami alasannya, Anda perlu memahami bagaimana semua kait disimpan dalam ekosistem WP.

Pertama-tama Anda perlu memahami di mana semua kait disimpan dan bagaimana mereka melakukannya. Semua kait untuk filter dan tindakan disimpan dalam variabel global yang disebut wp_filter, ya ya kait tindakan disimpan dalam variabel ini juga. Variabel ini adalah array terkait, di mana kunci adalah nama tindakan atau filter dan nilai adalah array asosiatif lain. Sebagai contoh, mari kita lihat aksi 'init', pada tahap ini kita akan melihat struktur berikut:

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

Sub array ini memiliki kunci dan nilai numerik sebagai array. Kunci numerik adalah prioritas kami. Array, terkait dengan kunci numerik, berisi daftar kait dengan prioritas yang sama. Jadi jika kita menelepon add_action( 'init', 'wpse8170_my_first_init', 20 ), lalu menelepon add_action( 'init', 'wpse8170_my_second_init', 20 )dan akhirnya menelepon add_action( 'init', 'wpse8170_my_third_init', 10 ), contoh kita akan terlihat seperti:

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

Sekarang ketika initaksi dipicu, semua kait akan diurutkan dengan penggunaan ksortfungsi dan array kami terlihat sekarang:

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

Dan semua kait akan dieksekusi dalam antrian ini: pertama 'wpse8170_my_third_init', lalu 'wpse8170_my_first_init'dan akhirnya 'wpse8170_my_second_init'.

Jadi Anda dapat melihat bahwa tidak ada batasan dan penalti dan Anda dapat menggunakan nilai apa pun yang dapat diterima sebagai kunci untuk array terkait oleh lingkungan PHP Anda.


2
max( $priorities ) + 1akan gagal jika angka terakhir sama dengan PHP_INT_MAX. Dalam hal ini, Anda harus mengubah nilai menjadi string dan menambahkan sesuatu ke dalamnya.
fuxia

@toscho Ya, setuju. Diperbarui potongan bonus.
Eugene Manuilov

2
"Bonus" adalah ide yang buruk, jika definisi untuk $wp_filterselamanya berubah. Ini tidak dimaksudkan untuk digunakan secara langsung oleh plugin. Kami telah melakukan modifikasi di masa lalu (terutama karena alasan kinerja, kebetulan).
Andrew Nacin

@AndrewNacin ok, saya telah menghapusnya, karena terlalu banyak pertanyaan :)
Eugene Manuilov

6

Ini adalah bilangan bulat, jadi pada sistem PHP 32-bit akan terbatas pada -2147483648 hingga 2147483647, dan pada 64-bit PHP akan terbatas pada -9223372036854775808 hingga 9223372036854775807.

Sunting: tidak ada penalti kinerja, ini bilangan bulat.

Tapi ... serius? :)


Saya mengerti bahwa itu adalah bilangan bulat, tetapi saya berbicara tentang mekanisme pengait yang sebenarnya. Saya pernah mendengar orang mengatakan bahwa memiliki kail yang terlalu besar akan menyebabkan kail gagal sepenuhnya, dan panggilan balik tidak akan dieksekusi
shea

WHO? Kapan? Ini hanya indeks ke dalam array, dan array jarang pada itu, jadi ada dampak yang dapat diabaikan. Tapi jujur, angka besar cukup banyak indikator tidak memahami masalah (misalnya panik mencoba apa pun yang mungkin berhasil!)
webaware

1

@shea - Tindakan WordPress bekerja persis seperti yang Anda perkirakan. Angka prioritas yang lebih tinggi TIDAK akan menggantikan yang lain, dan penggunaan PHP_INT_MAX BUKAN beberapa upaya "ekstrem" untuk memaksa tindakan / filter ini berjalan sebelum yang lain.

Untuk menempatkan tindakan / filter Anda di TOP dari urutan eksekusi, Anda harus menggunakan prioritas 0.

PHP_INT_MAX hanya di ujung yang berlawanan; itu digunakan ketika Anda ingin tindakan / filter Anda berjalan SETELAH semua kait (prioritas normal) lainnya telah selesai.


1
Ya, itulah gagasannya. Filter terakhir yang dijalankan pada sebuah kait akan dapat memodifikasi variabel tanpa khawatir tentang perubahan lebih lanjut
shea

Nilai integer negatif juga dapat digunakan untuk $priority, jadi panggilan balik yang dikaitkan dengan prioritas 0tidak harus berada di urutan teratas dari urutan eksekusi.
Dave Romsey

0

Tidak ada batasan dan tidak ada penalti kinerja. Dari memeriksa kode Anda bahkan dapat menggunakan string sebagai prioritas walaupun saya tidak akan merekomendasikan melakukan hal itu;)

Jika tindakan Anda harus menjadi yang terakhir maka Anda dapat memeriksa prioritas yang ditetapkan dengan melihat indeks global $wp_actions[your hook]ketika tindakan Anda dipanggil, dan menambahkannya lagi dengan prioritas yang lebih tinggi jika diperlukan, tetapi saya gagal melihat alasan untuk benar-benar melakukan hal semacam ini. hal.


0

"Secara praktis" tidak ada batas karena kait sebenarnya disimpan sebagai array dan prioritasnya adalah indeks numerik.

Namun, pada kenyataannya, ukuran array akan dibatasi oleh jumlah memori yang dialokasikan untuk pelaksanaan skrip.

Jadi, saya kira menetapkan angka prioritas yang sangat besar - yang hanya diterjemahkan ke indeks numerik dalam array tempat fungsi yang dikaitkan disimpan - tidak boleh crash wordpress.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.