후크 우선 순위에 제한이 있습니까?


9

필터 또는 동작 후크가 다른 모든 항목을 무시하도록하려면 우선 순위를으로 지정합니다 999. 그러나 최근에 나는보고 된 어떤 사람들은 다음과 같은 우선 순위에 대한 극단적 인 값을 사용 20000, 심지어99999

우선 순위를 사용하는 것이이 말이 엄청나다는 사실 외에도 실제로 효과가 있을까요? 후크 우선 순위에 제한이 있습니까? 한도를 초과하면 어떻게됩니까? 극도의 우선 순위를 사용할 때 성능 차이가 있습니까?

업데이트 : @harke스택 오버플 로에서 숫자가 다음과 같이 제한됨을 제안 합니다.PHP_INT_MAX


이에 대해 이야기 한 @hakre 의 답변에 링크하지 않았습니까 ? 그것은 Q의 일부가되어야하며, 더
나아가서

어떤 대답을 하시겠습니까?
shea

답변:


13

제한 및 성능 불이익이 없습니다. 이유를 이해하려면 WP 에코 시스템에 모든 후크가 저장되는 방식을 이해해야합니다.

우선 모든 후크가 저장되는 위치와 수행 방법을 이해해야합니다. 필터 및 조치에 대한 모든 후크는이라는 전역 변수에 저장됩니다 wp_filter. 예 예 조치 후크도이 변수에 저장됩니다. 이 변수는 연관된 배열입니다. 여기서 key는 조치 또는 필터의 이름이고 value는 다른 연관 배열입니다. 예를 들어 '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항상 바뀔 경우를 대비하여 나쁜 생각 입니다. 플러그인에 의해 직접 사용되는 것은 아닙니다. 우리는 과거에 (주로 성능상의 이유로 부수적으로) 수정했습니다.
Andrew

@AndrewNacin 좋아, 너무 많은 질문이 발생하기 때문에 그것을 제거했습니다 :)
Eugene Manuilov

6

정수이므로 32 비트 PHP 시스템에서는 -2147483648에서 2147483647로 제한되며 64 비트 PHP에서는 -9223372036854775808에서 9223372036854775807로 제한됩니다.

편집 : 성능 저하가 없으며 정수입니다.

하지만 ... 진심으로? :)


정수라는 것을 알지만 실제 후크 메커니즘에 대해 이야기하고있었습니다. 나는 사람들이 너무 큰의 후크를 갖는 후크가 완전히 실패 할 것이다라고 들었습니다, 콜백이 실행되지 않습니다
시어

WHO? 언제? 그것은 단지 배열에 대한 색인이고 그에 희소 배열이므로 무시할만한 영향이 있습니다. 그러나 정직하게, 큰 숫자가 문제를 이해하지의 거의 지표이다 (예를 들면 미친 듯이 힘의 일이 피 묻은 아무것도 시도!)
webaware

2

@shea-워드 프레스 작업은 사용자가 생각한 반대의 방식으로 작동합니다. 우선 순위가 높은 수치는 다른 수치보다 우선하지 않으며 PHP_INT_MAX를 사용하는 것은이 조치 / 필터를 다른 것보다 먼저 강제 실행하려는 "극단적"시도가 아닙니다.

액션 / 필터를 실행 순서의 맨 위에 놓으려면 우선 순위 0을 사용해야합니다.

PHP_INT_MAX는 단순히 반대편에 있습니다. 다른 모든 (일반 우선 순위) 후크가 완료된 후에 액션 / 필터가 실행되기를 원할 때 사용됩니다.


1
그렇습니다, 그것은 바로 아이디어입니다. 후크에서 실행되는 최종 필터는 더 이상의 변경에 대한 걱정없이 변수를 수정할 수 있습니다
시어

음의 정수 값도 사용할 수 $priority있으므로 우선 순위로 후크 된 콜백 0이 반드시 실행 순서의 최상위에있는 것은 아닙니다.
Dave Romsey 23.40에

0

제한이 없으며 성능 저하가 없습니다. 코드 검사에서 문자열을 우선 순위로 사용할 수도 있지만 권장하지는 않습니다.)

작업이 마지막이어야하는 $wp_actions[your hook]경우 작업이 호출 될 때 전역 인덱스를보고 할당 된 우선 순위를 검사하고 필요한 경우 우선 순위를 다시 추가 할 수는 있지만 실제로 이런 종류의 이유는 알 수 없습니다 사물의.


0

후크가 실제로 배열로 저장되고 우선 순위가 숫자 인덱스이므로 "실제적으로"제한이 없습니다.

그러나 실제로 배열 크기는 스크립트 실행에 할당 된 메모리 양에 의해 제한됩니다.

따라서, 엄청나게 큰 우선 순위 번호를 설정하면 후크 된 함수가 저장된 배열의 숫자 색인으로 변환됩니다. 단어를 누르지 않아야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.