2010-04-20 6 views
0

WordPress에서 내 클라이언트가 빌드하도록 요청한 콘텐츠 리퍼 사용자 지정 플러그인을 만들고 있습니다. 그는 페이지 뷰 이벤트를 잡기를 원하고 그것이 마지막 시간 (24 시간 지난 게시물)이라면 자원 파일을 가져 와서 다른 게시물을 출력하기를 원한다고 말합니다. 그는 플래그를 올리고 다른 세션이 동일한 코드 스 니펫을 실행하지 못하도록해야했습니다. 따라서, "나는 그 글을 게시하고 다른 프로세스를 떠나고있다"는 플래그를 올리면 그 글이 생성되어 다시 플래그가 해제됩니다.WordPress 쓰기 캐시 문제가 여러 번 발생했습니다.

그러나 부하가 걸려 여러 세션이 페이지 뷰로 사이트에 연결되면 가장 이상한 일이 발생합니다. 그것은 하나의 게시물 대신에 발사됩니다. 1, 2 또는 3 개의 추가 게시물을 무작위로 처리합니다. 각 게시물은 마지막 게시물 시간보다 24 시간 늦었 기 때문에 게시 할 적절한 시간이라고 생각합니다. 다소 무작위 적이기 때문에 문제는 몇 초 동안 제기 된 플래그를 아직 보지 못한 다른 유형의 쓰기 캐싱이라고 추측합니다.

플러그인이 WordPress의 update_option() API를 사용하여 wp_options 테이블에 간단히 작성하여 "플래그"를 높이고있었습니다. 다른 사용자 세션은 get_option()을 사용하여 해당 값을 읽고 플래그를보고, 주어진 세션이 이미이를 수행했기 때문에 게시물을 생성하는 코드 조각을 실행하지 않아야했습니다. 그런 다음 완료되면 플래그를 낮추고 다른 세션은 정상적으로 계속됩니다.

그러나이 작업을하려면.

에 그 다른 세션을시키는 무엇은하고있어, 내가 ADD_ACTION를 사용했다 ('loop_start을', 'checkToAddContent'). 그 함수에 대한 이상한 점은 페이지에서 한 번 이상 호출된다는 것입니다. 실제로 일부 플러그인은이를 호출 할 수 있습니다. 나는 더 좋은 사건이 있는지 모르겠다. 심지어 여전히 페이지 뷰에서 한 번만 실행되는 후크 할 이벤트가 발견 되더라도 여러 세션 (동시에 다른 페이지를 볼 수있는 여러 사용자)이 있고 특정 세션이 하나만 트리거되기를 원합니다. 게시물이 예정대로 만기 될 때 내용 게시.

워드 프레스 플러그인이 있다면 거기에 래치 할 다른 이벤트 후크를 제안하고 모든 세션에서 볼 수있는 플래그를 올리는 다른 방법을 찾아 낼 수 있는지 궁금합니다. 내 말은, PHP에서 공유 메모리 API를 사용할 수 있지만, 많은 호스팅 계획에서 장애가 발생했습니다. 그게 하나의 단일 세션이기 때문에 쿠키 또는 세션 var을 사용할 수 없습니다. 대신 호스팅 계획에서 작동 할 수있는 유일한 방법은 파일을 플래그로 놓는 것입니다. 파일이 있으면 하나의 세션에 플래그가 있습니다. 파일이 없으면 다른 세션에서 플래그를 가져올 수 있습니다. 물론, 나는 파일 경로를 사용할 수 있지만 내 의견으로는 미성숙하고 WordPress에 내가 할 수있는 것이 있는지 궁금해하고 있었다.

+0

이의 트위터와 같은 버전의 화면 반전 테이블 FROM 세션 id SELECT : 워드 프레스의 깃발을 올릴 수있는 방법이 무엇을 모든 세션에서 볼 수 있습니까? update_option()에 대기 시간이 있습니다. 다른 세션은 제 시간에 그것을보고 있지 않습니다. – Volomike

+0

조금 더 따라 갔다. 누군가 'loop_start'를 피하고 'wp'이벤트를 사용하라고 제안했습니다. 그런 다음 해당 이벤트 내에서 is_single() || is_page() || is_home() || is_archive() || is_category() || is_tag()) {// 여기에 코드를 추가하십시오. 여전히 플래그 문제는 해결되지 않지만 페이지 뷰 당 한 번만 실행되므로 더 나은 이벤트입니다. – Volomike

답변

0

같은 세션 (동일한 방문자)에서도 페이지 요청이 발생하지만 문제가 별도의 방문자가 보낸 페이지 요청에서도 발생할 수 있습니다. 그것은 다음과 같이 작동

  • 콘텐츠 떨어지는을 수행하는 경우는, 다음 페이지 요청하면 ADD_ACTION으로 차단 무엇 아마 ('WP', 'myPageRequest'). 거기에서 예정된 게시물이 만기가되면 새로운 게시물을 만듭니다.

  • 게시물에 약간의 시간이 소요됩니다. 그 시간에 get_posts()에 대한 쿼리는 아직 새 레코드를 보지 못할 수도 있습니다. 코드 배치가 실제로 이미 배치되었을 때 새로운 게시물을 작성하도록 실제로 코드 조각을 트리거 할 수 있습니다.

수정이 쓰기 캐시를 플러시하는 워드 프레스를 강제하는 것입니다이 나타납니다 : 우리가 할

try { 
    $asPosts = array(); 
    $asPosts = @ wp_get_recent_posts(1); 
    foreach($asPosts as $asPost) {break;} 
    @ delete_post_meta($asPost['ID'], '_thwart'); 
    @ add_post_meta($asPost['ID'], '_thwart', '' . date('Y-m-d H:i:s')); 
} catch (Exception $e) {} 
$asPosts = array(); 
$asPosts = @ wp_get_recent_posts(1); 
foreach($asPosts as $asPost) {break;} 
$sLastPostDate = ''; 
@ $sLastPostDate = $asPost['post_date']; 
$sLastPostDate = substr($sLastPostDate, 0, strpos($sLastPostDate, ' ')); 
$sNow = date('Y-m-d H:i:s'); 
$sNow = substr($sNow, 0, strpos($sNow, ' ')); 
if ($sLastPostDate != $sNow) { 
    // No post today, so go ahead and post your new blog post. 
    // Place that code here. 
} 

우선 가장 최근의 게시물을 얻을 수있다. 그러나 가장 최근 게시물이 아닌지 여부는 신경 쓰지 않습니다. 우리가 그것을 얻고있는 모든 단일 포스트 ID를 얻는 것입니다, 그리고 우리라는 숨겨진 사용자 정의 필드 (IT로 시작하여 밑줄)를 추가

_thwart

...와 같이 너무 CPU가 무겁지 않은 데이터베이스에 일부 데이터를 게시하여 쓰기 캐시를 방해합니다.

그 자리에 일단 wp_get_recent_posts (1)를 사용하면 가장 최근 게시물이 오늘 날짜가 아닌지 확인할 수 있습니다. 그렇지 않다면 우리는 내용물을 똑똑 떨어 뜨리는 것이 확실합니다. (또는 72 시간마다 똑같이 드립하고 싶다면 여기를 약간 변경할 수 있습니다.)

1

키가 생성 될 수 있습니다. "드립"이벤트에 대한 데이터베이스의 세마포어 레코드.

경고 - 다음 의사 코드를 고려하십시오. - 함수를 찾지 않습니다. 게시물이 쿼리

, 그래서 하나의 레코드 만 삽입 할 수있는이 원자 할 것

$ts = get_time_now(); // or whatever the function is 
$sid = session_id(); 

INSERT INTO table (postcategory, timestamp, sessionid) 
VALUES ("$category", $ts, "$sid") 
WHERE NOT EXISTS (SELECT 1 FROM table WHERE postcategory = "$category" 
    AND timestamp < $ts - 24 hours) 

데이터베이스 무결성과 같은 SQL 문을 사용합니다. 및 삽입은 시간 경과가 초과 된 경우에만 발생합니다.

그런 다음 즉시 현재 session_id() 및 타임 스탬프가 현재 상태인지 확인하십시오. 그들이 있다면, 물방울.

postcategory = "$의 postcategory" 와 타임 스탬프 = $이 및 세션 id = "$의 SID"

관련 문제