2009-11-24 3 views
3

매분 cronjob에 의해 실행되는 PHP 파일이 있습니다.루프 내에서 PHP sleep()이 DB를 업데이트하지 않습니다

$start = microtime(true); 
set_time_limit(10); 

for($i=0;$i<5;$i++) 
{ 
    updateDB(); 
    time_sleep_until($start + $i + 1); 
} 

이 코드 조각이 실행되면 내가 어떤 변화가 일어나고 볼 수 없습니다 : 그것은이 같은 프로그램되어 등

PHP 파일, 그것은 데이터베이스를 업데이트 해고 자고있다

, 데이터베이스에. 내가 알아 차리는 또 다른 점은 루프가 한 조각으로 끝났을 때 나는 무엇인가를 울리는 때입니다.

[편집] 난 씻고 ob_flush를 사용하여 시도,하지만 여전히 라인 [/ 편집]의 인쇄 라인하지 않았다

내가 이러한 오류를 방지하기 위해 할 수있는 일. 데이터베이스를 업데이트해야합니다.

내가 궁금해했던 또 다른 문제는 이런 종류의 것을 기록하는 것입니다. 결과를 로그 파일에 기록 할 수 있습니까?

+1

에코가 버퍼링 될 수 있습니다. 각 에코가 끝난 후 flush를 호출하면 해당 내용이 즉시 인쇄됩니다. –

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 나는 플러시를 사용했지만 아무런 차이가 없었다. –

+0

죄송합니다. 다른 문제가 있었지만 플러시가 작동합니다. 모든 것이 정상입니다. 고맙습니다. –

답변

4

루프 자체가 잘 보입니다. 데이터베이스를 업데이트하지 않는 경우 오류는 updateDB() 함수에 있어야합니다.

에코 것. 스크립트 출력은 종종 버퍼링됩니다. PHP가 즉시 인쇄하도록하려면 출력을 플러시 할 때마다 flush()으로 전화하거나 아니면 스크립트 상단에서 ob_implicit_flush()으로 전화하면 무언가를 인쇄 할 때마다 자동으로 플러시됩니다.

또한 브라우저를 통해 스크립트를 호출하는 경우 브라우저 자체에서 응답을 버퍼링하여 표시 할 수 있습니다.

로깅의 경우 가장 간단한 방법은 어딘가에 파일을 선택하고 file_put_contents()을 사용하여 기록하려는 내용을 인쇄하는 것입니다. 세 번째 매개 변수는 FILE_APPEND 플래그입니다.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 이상한 점은 updateDB() 함수가 올바르게 작동한다는 것입니다. 내가 루프를 제거하고 1 초의 HTML 메타 새로 고침 페이지를 만들면 모든 것이 정상적으로 작동합니다. 루프를 제외하고. 그리고 파일의 끝에는 에코의 내용 만 출력됩니다. 에러는 없습니다. 수면을 사용할 때 호출 할 다른 방법이 있습니까? –

+0

이상합니다. 나는 그 기능이 다른 방식으로 작동하는 이유를 볼 수 없다. 물론 실제로 기능을 보지 않고서도 확실하게 말하기는 어렵습니다. 함수를 다섯 번 연속해서 호출하면 매번 * sleep (1) *이오고 그 다음에 아무 것도 바뀌지 않습니까? ... P.S. 버퍼링에 대한 세부 정보가 추가되었습니다. – Atli

+0

안녕하세요. 이제 모든 것이 올바르게 작동합니다. 내 updateDB() 클래스에 오류가 있었지만 오류는 아니지만 프로그래밍이 잘못되었습니다. 데이터베이스 업데이트는 현재 시간 (초)과 비교하여 검사해야했습니다. 시간은 루프 이전에 한 번 정의되었으므로 업데이트되지 않으며 오류도 발생하지 않습니다.
이제 모든 것이 잘 작동하고 플러시도 가능합니다. 고맙습니다 –

0

명령 줄에서 실행중인 것처럼 보입니다.이 경우에는 버퍼링이 발생하지 않도록 stderr에 쓸 수 있습니다. $ stderr = fopen ('php : // stderr', 'w');

로깅의 경우 파일을 열고 쓰기 만하면됩니다. (fopen, fwrite, fclose);

관련 문제