PHP 스크립트가 브라우저가 HTTP 요청이 끝났다고 생각하도록 속일 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1436575

문제

먼저 HTTP 요청이 끝난 후에도 스크립트를 실행하도록 구성합니다.

 ignore_user_abort(true);

그런 다음 텍스트를 플러시합니다.

 echo "Thats all folks!";
 flush();

이제 브라우저가 HTTP 요청이 끝났다고 생각하도록 어떻게 할 수 있습니까? 따라서 브라우저에 "페이지로드"를 보여주지 않고도 내 작업을 계속할 수 있습니다.

 header(??) // something like this?
도움이 되었습니까?

해결책

다음은 방법이 있습니다. 브라우저는 출력의 첫 번째 N 문자에서 읽는 다음 연결을 닫고 스크립트가 완료 될 때까지 계속 실행됩니다.

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Will not work
flush();            // Unless both are called !

// At this point, the browser has closed connection to the web server

// Do processing here
echo('Text user will never see');
?>

다른 팁

헤더는 작동하지 않습니다 (헤더가 있으므로 첫 번째)

스크립트를 종료하지 않고 HTTP 연결을 닫을 수있는 방법은 모르겠지만 모호한 방법이 있다고 생각합니다.

요청이 완료된 후 무엇을하고 싶은지 말하면 더 나은 제안을하는 데 도움이됩니다.

그러나 일반적으로 다음 중 하나에 대해 생각하고 있습니다.

1) 간단한 명령 줄 스크립트 (exec () 사용)를 실행하십시오.

#!/bin/sh
php myscript.php <arg1> <arg2> .. <argN> &

그런 다음 http-bound 스크립트에서 다음과 같이 시작하십시오.

<?PHP
exec('/path/to/my/script.sh');
?>

또는:

2) 다른 프로그램 (아마도 지속적으로 실행되는 데몬, 또는 자주 자주 크로 닝되는 스크립트)을 작성하고, 요청 내 코드가 어떻게 지시 사항을 통과 할 수 있는지 알아냅니다. 대기열이 작동하는 데이터베이스 테이블을 가질 수 있거나 일종의 평평한 파일로 작동하도록 시도 할 수 있습니다. 또한 웹 기반 스크립트가 요청 외 스크립트가 일부 작업을 대기하도록하는 명령 줄 명령을 호출하도록 할 수도 있습니다.

하루가 끝나면 당신은 그렇지 않습니다 원하다 HTTP 요청 후에도 계속 실행되는 스크립트. mod_php를 사용하고 있다고 가정하면 스크립트가 종료 될 때까지 Apache 프로세스를 묶는 것을 의미합니다.

아마도 php.net 설명서 페이지에 대한이 특정 의견이 도움이 될 것입니다. http://www.php.net/manual/en/features.connection-henling.php#71172

이론적으로 HTTP 1.1 Keep-Alive가 활성화되고 클라이언트가 서버에서 기대하는 문자의 양을 수신하면 응답의 끝으로 취급하고 계속해서 페이지를 렌더링해야합니다 (연결을 계속 열어 두면서). 이 헤더를 보내십시오 (다른 방법으로 활성화 할 수없는 경우) :

Connection: keep-alive
Content-Length: n

어디에 n 응답 본문에서 보낸 캐릭터의 양입니다 (출력 버퍼링은이를 세는 데 도움이 될 수 있습니다.) 이것을 직접 테스트 할 시간이 없어서 죄송합니다. 나는 그것이 작동 할 경우를 대비하여 제안을 던지고 있습니다.

이를 달성하는 가장 좋은 방법은 출력 버퍼링을 사용하는 것입니다. PHP는 양호하고 준비된 경우 헤더를 보냅니다. 그러나 OB_*로 출력을 브라우저로 랩핑하면 모든 단계에서 헤더를 제어 할 수 있습니다.

원하는 경우 버퍼에 렌더링 된 페이지를 잡고 중국에서 태양이 올 때까지 헤더를 보낼 수 있습니다. 이 연습은 당신이 많은 오픈을 볼 수있는 이유입니다 <?php 태그이지만 요즘에는 닫는 태그가 없습니다. 일부는 고려해야 할 일부가 포함될 수 있으므로 스크립트가 조기에 조기에 보내지 않도록합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top