Có giới hạn để ưu tiên móc?


9

Khi tôi muốn bộ lọc hoặc móc hành động của mình ghi đè lên tất cả các bộ lọc khác, tôi sẽ gán cho nó mức độ ưu tiên 999. Tuy nhiên, gần đây tôi đã thấy một số người sử dụng các giá trị cực đoan cho ưu tiên, chẳng hạn như 20000, và thậm chí99999

Bên cạnh thực tế là việc sử dụng các ưu tiên cao này là vô lý, liệu chúng có thực sự hiệu quả? Có giới hạn để ưu tiên móc? Điều gì sẽ xảy ra nếu vượt quá giới hạn? Có sự khác biệt hiệu suất khi sử dụng ưu tiên cực đoan?

Cập nhật: @harke gợi ý trên Stack Overflow rằng số lượng bị giới hạn bởiPHP_INT_MAX


Bạn đã không liên kết đến một câu trả lời của @hakre đã nói về điều này? Nó phải là một phần của Q, và hơn thế nữa, đi theo sự dẫn dắt mà anh ấy đưa ra, tôi nghi ngờ anh ấy nghiêm túc biết một hoặc hai điều ...
brasofilo

Bạn đang đề cập đến câu trả lời nào?
shea

Câu trả lời:


13

Không có giới hạn và không có hình phạt hiệu suất. Để hiểu lý do tại sao, bạn cần hiểu làm thế nào tất cả các hook được lưu trữ trong hệ sinh thái WP.

Trước hết bạn cần hiểu nơi tất cả các hook được lưu trữ và cách chúng thực hiện. Tất cả các hook cho bộ lọc và hành động được lưu trữ trong biến toàn cục được gọi wp_filter, yes yes hook hook cũng được lưu trong biến này. Biến này là mảng liên kết, trong đó khóa là tên của hành động hoặc bộ lọc và giá trị là một mảng kết hợp khác. Ví dụ: hãy xem hành động 'init', ở giai đoạn này chúng ta sẽ thấy cấu trúc sau:

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

Mảng phụ này có các khóa số và giá trị dưới dạng mảng. Phím số là ưu tiên của chúng tôi. Mảng, được liên kết với các phím số, chứa một danh sách các móc có cùng mức độ ưu tiên. Vì vậy, nếu chúng ta gọi add_action( 'init', 'wpse8170_my_first_init', 20 ), sau đó gọi add_action( 'init', 'wpse8170_my_second_init', 20 )và cuối cùng gọi add_action( 'init', 'wpse8170_my_third_init', 10 ), ví dụ của chúng ta sẽ như sau:

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

Bây giờ khi inithành động được kích hoạt, tất cả các hook sẽ được sắp xếp với việc sử dụng ksorthàm và mảng của chúng ta hiện tại:

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

Và tất cả các hook sẽ được thực hiện trong hàng đợi này: đầu tiên 'wpse8170_my_third_init', sau đó 'wpse8170_my_first_init'và cuối cùng 'wpse8170_my_second_init'.

Vì vậy, bạn có thể thấy rằng không có giới hạn và hình phạt nào và bạn có thể sử dụng bất kỳ giá trị nào được chấp nhận làm khóa cho mảng liên quan bởi môi trường PHP của bạn.


2
max( $priorities ) + 1sẽ thất bại nếu số cuối cùng bằng PHP_INT_MAX. Trong trường hợp đó, bạn phải chuyển đổi giá trị thành một chuỗi và thêm một cái gì đó vào nó.
fuxia

@toscho Vâng, đồng ý. Cập nhật đoạn trích thưởng.
Eugene Manuilov

2
"Phần thưởng" là một ý tưởng tồi, trong trường hợp định nghĩa cho $wp_filtertừng thay đổi. Nó không có nghĩa là được sử dụng trực tiếp bởi các plugin. Chúng tôi đã thực hiện các sửa đổi trong quá khứ (chủ yếu là vì lý do hiệu suất, tình cờ).
Andrew Nacin

@AndrewNacin ok, tôi đã gỡ bỏ nó, vì nó gây ra quá nhiều câu hỏi :)
Eugene Manuilov

6

Đó là một số nguyên, vì vậy trên hệ thống PHP 32 bit, nó sẽ bị giới hạn ở -2147483648 đến 2147483647 và trên PHP 64 bit, nó sẽ bị giới hạn ở -9223372036854775808 đến 9223372036854775807.

Chỉnh sửa: không có hiệu suất phạt, đó là một số nguyên.

Nhưng ... nghiêm túc chứ? :)


Tôi hiểu rằng đó là một số nguyên, nhưng tôi đã nói về cơ chế hook thực tế. Tôi đã nghe mọi người nói rằng có một cái móc quá lớn sẽ khiến cho cái móc bị hỏng hoàn toàn và cuộc gọi lại sẽ không được thực hiện
shea

WHO? Khi nào? Nó chỉ là một chỉ mục thành một mảng và một mảng thưa thớt ở đó, do đó có tác động không đáng kể. Nhưng thành thật mà nói, những con số lớn gần như là một chỉ báo về việc không hiểu vấn đề (ví dụ như điên cuồng thử bất cứ thứ gì có thể hoạt động!)
web biết

1

@shea - Các hành động của WordPress hoạt động chính xác theo cách OPPOSITE mà bạn đã giả định. Con số ưu tiên cao hơn sẽ KHÔNG ghi đè lên người khác và việc sử dụng PHP_INT_MAX KHÔNG phải là một số nỗ lực "cực đoan" để buộc hành động / bộ lọc này chạy trước bất kỳ ai khác.

Để đặt hành động / bộ lọc của bạn lên TOP của lệnh thực thi, bạn cần sử dụng mức độ ưu tiên là 0.

PHP_INT_MAX chỉ đơn giản là ở đầu đối diện; nó được sử dụng khi bạn muốn hành động / bộ lọc của mình chạy SAU tất cả các hook (ưu tiên bình thường) khác đã hoàn thành.


1
Đúng, đó chính xác là ý tưởng. Bộ lọc cuối cùng chạy trên hook sẽ có thể sửa đổi biến mà không phải lo lắng về bất kỳ thay đổi nào nữa
shea

Các giá trị nguyên âm cũng có thể được sử dụng cho $priority, vì vậy các cuộc gọi lại được ưu tiên 0sẽ không nhất thiết phải ở đầu của lệnh thực hiện.
Dave Romsey

0

Không có giới hạn và không có hình phạt hiệu suất. Từ việc kiểm tra mã, bạn thậm chí có thể sử dụng các chuỗi làm ưu tiên mặc dù tôi không khuyên bạn nên làm điều đó;)

Nếu hành động của bạn phải kéo dài thì bạn có thể kiểm tra các mức độ được chỉ định bằng cách xem các chỉ số của toàn cầu $wp_actions[your hook]khi hành động của bạn được gọi và thêm lại với mức độ ưu tiên cao hơn nếu cần, nhưng tôi không thấy lý do thực sự làm loại này của sự vật.


0

"Thực tế" không có giới hạn vì các hook thực sự được lưu trữ dưới dạng các mảng và ưu tiên là chỉ số bằng số.

Nhưng, trong thực tế, kích thước mảng sẽ bị giới hạn bởi số lượng bộ nhớ được phân bổ cho việc thực thi tập lệnh.

Vì vậy, tôi đoán việc thiết lập một số ưu tiên lớn một cách lố bịch - chỉ chuyển thành một chỉ số bằng số trong mảng nơi các hàm hooked được lưu trữ - không nên đánh sập wordpress.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.