복붙노트

[JQUERY] 어떻게 초기에 가까운 연결을합니까?

JQUERY

어떻게 초기에 가까운 연결을합니까?

해결법


  1. 1.다음 PHP 매뉴얼 페이지 (. 포함 사용자 노트)는 PHP 스크립트를 종료하지 않고 브라우저에 TCP 연결을 종료하는 방법에 대한 여러 지침을 제안한다 :

    다음 PHP 매뉴얼 페이지 (. 포함 사용자 노트)는 PHP 스크립트를 종료하지 않고 브라우저에 TCP 연결을 종료하는 방법에 대한 여러 지침을 제안한다 :

    아마 그것은 좀 더 가까운 헤더를 보내는 것보다이 필요합니다.

    OP 후 확인한다 : 그래,이 속임수를 썼는지 : 여기에 복사 사용자 노트 # 71172 (2006 11월)를 가리키는 :

    이후에 관련 대답 2010 년 7 월 북극 화재는 있었다-후속 위의 1-2 더 사용자가 메모를 링크 :


  2. 2.이들 2 헤더를 보낼 필요가있다 :

    이들 2 헤더를 보낼 필요가있다 :

    Connection: close
    Content-Length: n (n = size of output in bytes )
    

    당신이 당신의 출력의 크기를 알 필요가 있기 때문에, 당신은, 당신의 출력 버퍼 브라우저로 세척해야합니다 :

    // buffer all upcoming output
    ob_start();
    echo "We'll email you as soon as this is done.";
    
    // get the size of the output
    $size = ob_get_length();
    
    // send headers to tell the browser to close the connection
    header("Content-Length: $size");
    header('Connection: close');
    
    // flush all output
    ob_end_flush();
    ob_flush();
    flush();
    
    // if you're using sessions, this prevents subsequent requests
    // from hanging while the background process executes
    if (session_id()) session_write_close();
    
    /******** background process starts here ********/
    

    웹 서버가 출력 (mod_deflate를 가진 예. 아파치)에 자동 gzip 압축을 사용하는 경우 또한,이 작업 출력의 실제 크기가 변경되지 않을 것이기 때문에, 그리고 콘텐츠 길이는 더 이상 정확합니다. 안 gzip 압축 특정 스크립트.

    자세한 내용은 방문 http://www.zulius.com/how-to/close-browser-connection-continue-execution


  3. 3.당신은 fastcgi_end_request () 함수를 사용하여 PHP-FPM과 패스트 CGI를 사용할 수 있습니다. 이러한 방법으로, 당신은 응답이 이미 클라이언트로 전송하고있는 동안 어떤 처리를 할 계속할 수 있습니다.

    당신은 fastcgi_end_request () 함수를 사용하여 PHP-FPM과 패스트 CGI를 사용할 수 있습니다. 이러한 방법으로, 당신은 응답이 이미 클라이언트로 전송하고있는 동안 어떤 처리를 할 계속할 수 있습니다.

    당신은 여기 PHP 매뉴얼이 찾기 : FastCGI 프로세스 관리자 (FPM); 그러나이 기능은 특히 더 매뉴얼에 문서화되어 있지 않습니다. 여기에 PHP-FPM에서 발췌 : PHP FastCGI 프로세스 관리자 위키 :

    범위 : PHP 함수

    카테고리 : 최적화

    이 기능을 사용하면 일부 PHP 쿼리의 구현을 가속화 할 수 있습니다. 서버 응답에 영향을주지 않는 스크립트 실행 과정에서 행동이있을 때 가속이 가능합니다. 페이지가 형성되고 웹 서버로 전달 된 후 예를 들어, memcached를에 세션을 저장하면 발생할 수 있습니다. () fastcgi_finish_request 응답 출력을 정지시키는 PHP 기능이다. 웹 서버가 즉시 클라이언트에 "천천히 그리고 슬프게"응답을 전송하기 시작하고, 동시에 PHP는 모든 종류의 처리, 등 다운로드 한 비디오를 변환, 세션을 저장하는 등의 쿼리의 맥락에서 유용한 것들을 많이 할 수 있습니다 통계 등

    fastcgi_finish_request () 셧다운 기능을 실행하는 호출 할 수있다.

    참고 : fastcgi_finish_request는 () 플러시, 인쇄 또는 에코에 대한 호출이 초기 스크립트를 종료합니다 특질이있다.

    이 문제를 방지하려면, 당신은 바로 전이나 fastcgi_finish_request 호출 후에에서 ignore_user_abort (true)를 호출 할 수 있습니다 :

    ignore_user_abort(true);
    fastcgi_finish_request();
    

  4. 4.전체 버전 :

    전체 버전 :

    ignore_user_abort(true);//avoid apache to kill the php running
    ob_start();//start buffer output
    
    echo "show something to user";
    session_write_close();//close session file on server side to avoid blocking other requests
    
    header("Content-Encoding: none");//send header to avoid the browser side to take content as gzip format
    header("Content-Length: ".ob_get_length());//send length header
    header("Connection: close");//or redirect to some url: header('Location: http://www.google.com');
    ob_end_flush();flush();//really send content, can't change the order:1.ob buffer to normal buffer, 2.normal buffer to output
    
    //continue do something on server side
    ob_start();
    sleep(5);//the user won't wait for the 5 seconds
    echo 'for diyism';//user can't see this
    file_put_contents('/tmp/process.log', ob_get_contents());
    ob_end_clean();
    

  5. 5.더 나은 솔루션은 백그라운드 프로세스를 포크하는 것입니다. 그것은 유닉스 / 리눅스에 똑 바른 앞으로 상당히입니다 :

    더 나은 솔루션은 백그라운드 프로세스를 포크하는 것입니다. 그것은 유닉스 / 리눅스에 똑 바른 앞으로 상당히입니다 :

    <?php
    echo "We'll email you as soon as this is done.";
    system("php somestuff.php dude@thatplace.com >/dev/null &");
    ?>
    

    당신은 더 나은 예는이 질문에 보일 것입니다 :

    PHP는 백그라운드 프로세스를 실행


  6. 6.당신이 리눅스 서버 및 루트 액세스 권한이 가정이 시도. 내가 발견 한 가장 간단한 솔루션입니다.

    당신이 리눅스 서버 및 루트 액세스 권한이 가정이 시도. 내가 발견 한 가장 간단한 솔루션입니다.

    다음 파일에 대한 새로운 디렉토리를 만들고에게 모든 권한을 제공합니다. (우리는 더 이상 확보 할 수 있습니다.)

    mkdir test
    chmod -R 777 test
    cd test
    

    bgping라는 파일이 넣습니다.

    echo starting bgping
    ping -c 15 www.google.com > dump.txt &
    echo ending bgping
    

    &합니다. ping 명령은 백그라운드에서 실행하는 동안 에코 명령에 현재의 프로세스 이동합니다. 그것은 15 초 정도 소요됩니다 www.google.com 15 번, 핑됩니다.

    그것을 실행합니다.

    chmod 777 bgping
    

    bgtest.php라는 파일이 넣습니다.

    <?php
    
    echo "start bgtest.php\n";
    exec('./bgping', $output, $result)."\n";
    echo "output:".print_r($output,true)."\n";
    echo "result:".print_r($result,true)."\n";
    echo "end bgtest.php\n";
    
    ?>
    

    브라우저에서 bgtest.php 요청하는 경우, 당신은에 대해 기다리지 않고 신속하게 다음과 같은 응답을 받아야합니다 ping 명령 15 초 완료합니다.

    start bgtest.php
    output:Array
    (
        [0] => starting bgping
        [1] => ending bgping
    )
    
    result:0
    end bgtest.php
    

    ping 명령은 현재 서버에서 실행해야합니다. 대신 ping 명령, 당신은 PHP 스크립트를 실행할 수 있습니다 :

    php -n -f largejob.php > dump.txt &
    

    도움이 되었기를 바랍니다!


  7. 7.다음은 gzip으로 압축 작동 팀보의 코드에 대한 수정이다.

    다음은 gzip으로 압축 작동 팀보의 코드에 대한 수정이다.

    // buffer all upcoming output
    if(!ob_start("ob_gzhandler")){
        define('NO_GZ_BUFFER', true);
        ob_start();
    }
    echo "We'll email you as soon as this is done.";
    
    //Flush here before getting content length if ob_gzhandler was used.
    if(!defined('NO_GZ_BUFFER')){
        ob_end_flush();
    }
    
    // get the size of the output
    $size = ob_get_length();
    
    // send headers to tell the browser to close the connection
    header("Content-Length: $size");
    header('Connection: close');
    
    // flush all output
    ob_end_flush();
    ob_flush();
    flush();
    
    // if you're using sessions, this prevents subsequent requests
    // from hanging while the background process executes
    if (session_id()) session_write_close();
    
    /******** background process starts here ********/
    

  8. 8.내가 공유 호스트에있어 및 fastcgi_finish_request 종료 스크립트에 대한 설정이 완전히이다. 나는 연결 싫어 닫기 솔루션 중 하나. 를 사용하여 추가 서버 자원을 비용 후속 요청에 대한 별도의 연결을 강제로. 본인은 전송 - 인코딩 : 위키 백과 기사 cunked 0 \ 연구 \ 없음 \ 연구 \ n은 반응을 종료 것을 배웠다. 나는 철저 브라우저 버전과 장치를 통해이 테스트를하지 않은,하지만 내 현재 브라우저의 4에서 작동합니다.

    내가 공유 호스트에있어 및 fastcgi_finish_request 종료 스크립트에 대한 설정이 완전히이다. 나는 연결 싫어 닫기 솔루션 중 하나. 를 사용하여 추가 서버 자원을 비용 후속 요청에 대한 별도의 연결을 강제로. 본인은 전송 - 인코딩 : 위키 백과 기사 cunked 0 \ 연구 \ 없음 \ 연구 \ n은 반응을 종료 것을 배웠다. 나는 철저 브라우저 버전과 장치를 통해이 테스트를하지 않은,하지만 내 현재 브라우저의 4에서 작동합니다.

    // Disable automatic compression
    // @ini_set('zlib.output_compression', 'Off');
    // @ini_set('output_buffering', 'Off');
    // @ini_set('output_handler', '');
    // @apache_setenv('no-gzip', 1);
    
    // Chunked Transfer-Encoding & Gzip Content-Encoding
    function ob_chunked_gzhandler($buffer, $phase) {
        if (!headers_sent()) header('Transfer-Encoding: chunked');
        $buffer = ob_gzhandler($buffer, $phase);
        return dechex(strlen($buffer))."\r\n$buffer\r\n";
    }
    
    ob_start('ob_chunked_gzhandler');
    
    // First Chunk
    echo "Hello World";
    ob_flush();
    
    // Second Chunk
    echo ", Grand World";
    ob_flush();
    
    ob_end_clean();
    
    // Terminating Chunk
    echo "\x30\r\n\r\n";
    ob_flush();
    flush();
    
    // Post Processing should not be displayed
    for($i=0; $i<10; $i++) {
        print("Post-Processing");
        sleep(1);
    }
    

  9. 9.당신은 멀티 스레딩 할 시도 할 수 있습니다.

    당신은 멀티 스레딩 할 시도 할 수 있습니다.

    당신은 매개 변수로 작업을 수행하는 스크립트와 PHP 바이너리를 호출하는 시스템 호출 (사용 shell_exec)를 만드는 스크립트를 채찍질 할 수있다. 그러나 나는 그것이 가장 안전한 방법이라고 생각하지 않습니다. 어쩌면 당신은 PHP 프로세스 및 기타 물건을 chroot를하여 물건을 thighten 수 있습니다

    또한, http://www.phpclasses.org/browse/package/3953.html 그렇게 phpclasses에서 클래스가있다. 하지만 구현의 세부 사항을 모르는


  10. 10.TL; DR 응답 :

    TL; DR 응답 :

    ignore_user_abort(true); //Safety measure so that the user doesn't stop the script too early.
    
    $content = 'Hello World!'; //The content that will be sent to the browser.
    
    header('Content-Length: ' . strlen($content)); //The browser will close the connection when the size of the content reaches "Content-Length", in this case, immediately.
    
    ob_start(); //Content past this point...
    
    echo $content;
    
    //...will be sent to the browser (the output buffer gets flushed) when this code executes.
    ob_end_flush();
    ob_flush();
    flush();
    
    if(session_id())
    {
        session_write_close(); //Closes writing to the output buffer.
    }
    
    //Anything past this point will be ran without involving the browser.
    

    기능 답변 :

    ignore_user_abort(true);
    
    function sendAndAbort($content)
    {
        header('Content-Length: ' . strlen($content));
    
        ob_start();
    
        echo $content;
    
        ob_end_flush();
        ob_flush();
        flush();
    }
    
    sendAndAbort('Hello World!');
    
    //Anything past this point will be ran without involving the browser.
    

  11. 11.귀하의 문제는 PHP에서 일부 병렬 프로그래밍을 수행하여 해결할 수 있습니다. 나는 몇 주 전에 여기에 대해 질문을 하나는 PHP 애플리케이션에서 멀티 스레딩을 사용하는 방법

    귀하의 문제는 PHP에서 일부 병렬 프로그래밍을 수행하여 해결할 수 있습니다. 나는 몇 주 전에 여기에 대해 질문을 하나는 PHP 애플리케이션에서 멀티 스레딩을 사용하는 방법

    그리고 큰 응답을 얻었다. 나는 매우 특히 하나를 좋아했다. (; johnlim에 의한 년 9 월 2008) 튜토리얼 나는 며칠 전 등장 유사한 문제를 해결하기 위해 이미 그것을 사용하는 것처럼 실제로 아주 잘 문제를 해결할 수있는 작가는 PHP의 쉬운 병렬 처리에 대한 참조를했다.


  12. 12.Joeri Sebrechts '대답은 가까운, 그러나 당신이 연결을 끊을 전에 버퍼링 할 수있는 기존 내용을 파괴합니다. 이 스크립트가 조기에 종료 할 수 있도록 제대로에서 ignore_user_abort 호출하지 않습니다. diyism의 대답은 잘하지만 일반적으로 적용 할 수 없습니다. 예를 들면 단순히없는 상황에서 작업과 그 이유를 알 수 없습니다 수 있도록 사람은 그 대답은 처리하지 않는 크거나 적은 출력 버퍼가있을 수 있습니다.

    Joeri Sebrechts '대답은 가까운, 그러나 당신이 연결을 끊을 전에 버퍼링 할 수있는 기존 내용을 파괴합니다. 이 스크립트가 조기에 종료 할 수 있도록 제대로에서 ignore_user_abort 호출하지 않습니다. diyism의 대답은 잘하지만 일반적으로 적용 할 수 없습니다. 예를 들면 단순히없는 상황에서 작업과 그 이유를 알 수 없습니다 수 있도록 사람은 그 대답은 처리하지 않는 크거나 적은 출력 버퍼가있을 수 있습니다.

    이 기능을 사용하면 (한 헤더가 아직 전송되지 않은 것처럼) 그리고 당신이 지금까지 생성 한 내용을 유지 언제든지 해제 할 수 있습니다. 여분의 처리 시간은 기본적으로 제한이 없습니다.

    function disconnect_continue_processing($time_limit = null) {
        ignore_user_abort(true);
        session_write_close();
        set_time_limit((int) $time_limit);//defaults to no limit
        while (ob_get_level() > 1) {//only keep the last buffer if nested
            ob_end_flush();
        }
        $last_buffer = ob_get_level();
        $length = $last_buffer ? ob_get_length() : 0;
        header("Content-Length: $length");
        header('Connection: close');
        if ($last_buffer) {
            ob_end_flush();
        }
        flush();
    }
    

    당신이 여분의 메모리를 필요로하는 경우도,이 함수를 호출하기 전에 할당합니다.


  13. 13.mod_fcgid 사용자를위한 주 (당신의 자신의 위험에 사용하십시오).

    mod_fcgid 사용자를위한 주 (당신의 자신의 위험에 사용하십시오).

    Joeri Sebrechts의 허용 대답은 참으로 작동합니다. 당신이 mod_fcgid 사용하는 경우, 당신은이 솔루션이 자신의 작업을하지 않는 것을 알 수 있습니다. 즉, 세척 기능이 폐쇄되지 않는 클라이언트에 대한 연결 호출 될 때.

    mod_fcgid FcgidOutputBufferSize의 구성 파라미터는 책임이있을 수있다. 나는이 팁을 발견했다 :

    위의 내용을 읽고 나면, 당신은 빠른 해결책이 줄을 추가 (마지막에있는 "예 가상 호스트"참조)하는 것이라는 결론에 도달 할 수있다 :

    FcgidOutputBufferSize 0
    

    중 아파치 설정 파일 (예를 들어, 값을 httpd.conf), 당신의 FCGI 구성 파일 (예를 들어, fcgid.conf) 또는 가상 호스트 파일 (예를 들어, 아파치 - vhosts.conf)이다.

    상기 용액의 비활성화 버퍼링 전체 서버 또는 특정 가상 호스트 중 mod_fcgid 의해 수행. 이 웹 사이트의 성능 저하로 이어질 수 있습니다. 다른 한편으로,이 잘 PHP의 수행 자체에 버퍼링 이후의 경우되지 않을 수 있습니다.

    경우에 당신은 당신이 플러시이 버퍼를 강제로 ... 다른 해결책이있다 비활성화 mod_fcgid의 버퍼링을하지 않으.

    아래 코드는 단지 않는 Joeri Sebrechts에 의해 제안 된 솔루션을 구축하여 :

    <?php
        ob_end_clean();
        header("Connection: close");
        ignore_user_abort(true); // just to be safe
        ob_start();
        echo('Text the user will see');
    
        echo(str_repeat(' ', 65537)); // [+] Line added: Fill up mod_fcgi's buffer.
    
        $size = ob_get_length();
        header("Content-Length: $size");
        ob_end_flush(); // Strange behaviour, will not work
        flush(); // Unless both are called !
        // Do processing here 
        sleep(30);
        echo('Text user will never see');
    ?>
    

    어떤 코드의 추가 라인을 기본적으로하는 일은 이렇게 높이에 강제 mod_fcgi의 버퍼를 채우는 것입니다. FcgidOutputBufferSize 변수의 기본값은 "65536"이기 때문에 해당 지침의 아파치 웹 페이지에 언급 된 숫자 "65537"은, 선택되었다. 다른 값이 사용자 환경에 설정되어있는 경우 따라서, 그에 따라이 값을 조정해야 할 수도 있습니다.

    <VirtualHost *:80>
        DocumentRoot "d:/wamp/www/example"
        ServerName example.local
    
        FcgidOutputBufferSize 0
    
        <Directory "d:/wamp/www/example">
            Require all granted
        </Directory>
    </VirtualHost>
    

  14. 14.이 날 위해 일했습니다

    이 날 위해 일했습니다

    //avoid apache to kill the php running
    ignore_user_abort(true);
    //start buffer output
    ob_start();
    
    echo "show something to user1";
    //close session file on server side to avoid blocking other requests
    session_write_close();
    
    //send length header
    header("Content-Length: ".ob_get_length());
    header("Connection: close");
    //really send content, can't change the order:
    //1.ob buffer to normal buffer,
    //2.normal buffer to output
    ob_end_flush();
    flush();
    //continue do something on server side
    ob_start();
    //replace it with the background task
    sleep(20);
    

  15. 15.좋아, 그래서 기본적으로 방법으로 jQuery를 심지어 ob_flush 방법은 각을 onreadystatechange에 함수를 실행 할 수 없습니다하지 작동 때문에 XHR 요청을한다. jQuery를이 상태는, 다음 (전체 에러 성공, 타임 아웃)를 취할 수있는 적절한 조치를 선택하는 체크한다. 내가 참조를 찾을 수 없습니다 있지만, 나는이 모든 XHR 구현 작동하지 않는 것을 듣고 기억합니다. 내가 당신을 위해 일한다고 생각하는 방법은 ob_flush 영원히 프레임 폴링 사이 십자가이다.

    좋아, 그래서 기본적으로 방법으로 jQuery를 심지어 ob_flush 방법은 각을 onreadystatechange에 함수를 실행 할 수 없습니다하지 작동 때문에 XHR 요청을한다. jQuery를이 상태는, 다음 (전체 에러 성공, 타임 아웃)를 취할 수있는 적절한 조치를 선택하는 체크한다. 내가 참조를 찾을 수 없습니다 있지만, 나는이 모든 XHR 구현 작동하지 않는 것을 듣고 기억합니다. 내가 당신을 위해 일한다고 생각하는 방법은 ob_flush 영원히 프레임 폴링 사이 십자가이다.

    <?php
     function wrap($str)
     {
      return "<script>{$str}</script>";
     };
    
     ob_start(); // begin buffering output
     echo wrap("console.log('test1');");
     ob_flush(); // push current buffer
     flush(); // this flush actually pushed to the browser
     $t = time();
     while($t > (time() - 3)) {} // wait 3 seconds
     echo wrap("console.log('test2');");
    ?>
    
    <html>
     <body>
      <iframe src="ob.php"></iframe>
     </body>
    </html>
    

    스크립트가 인라인 실행되기 때문에 버퍼가 플러시로 그리고, 당신은 실행을 얻을. 이 유용한하려면 데이터를 수신하고 그것을 행동하는 주요 스크립트 설정 사에 정의 된 콜백 메서드에 CONSOLE.LOG을 변경합니다. 도움이 되었기를 바랍니다. 건배, 모건.


  16. 16.대체 솔루션 큐에 작업을 추가하고 새로운 일자리와 실행을위한 크론 스크립트 어떤 검사를하는 것입니다.

    대체 솔루션 큐에 작업을 추가하고 새로운 일자리와 실행을위한 크론 스크립트 어떤 검사를하는 것입니다.

    내가 공유 호스트에 의해 부과 우회하기 한계에 최근에 그런 식으로해야 할 일을했을 - 간부를 () 등은 웹 서버에서 PHP 실행을 위해 사용할했지만 쉘 스크립트에서 실행할 수 있습니다.


  17. 17.플러시 () 기능이 작동하지 않습니다. 당신은 php.ini의 같은에서 다음 옵션을 설정해야합니다 :

    플러시 () 기능이 작동하지 않습니다. 당신은 php.ini의 같은에서 다음 옵션을 설정해야합니다 :

    output_buffering = Off  
    zlib.output_compression = Off  
    

  18. 18.최신 워킹 솔루션

    최신 워킹 솔루션

        // client can see outputs if any
        ignore_user_abort(true);
        ob_start();
        echo "success";
        $buffer_size = ob_get_length();
        session_write_close();
        header("Content-Encoding: none");
        header("Content-Length: $buffer_size");
        header("Connection: close");
        ob_end_flush();
        ob_flush();
        flush();
    
        sleep(2);
        ob_start();
        // client cannot see the result of code below
    

  19. 19.(그들 중 누구도 나를 위해 일한 후)이 스레드에서 다양한 솔루션을 시도 후, 나는 공식 PHP.net 페이지에 해결책을 발견했습니다 :

    (그들 중 누구도 나를 위해 일한 후)이 스레드에서 다양한 솔루션을 시도 후, 나는 공식 PHP.net 페이지에 해결책을 발견했습니다 :

    function sendResponse($response) {
        ob_end_clean();
        header("Connection: close\r\n");
        header("Content-Encoding: none\r\n");
        ignore_user_abort(true);
        ob_start();
    
        echo $response; // Actual response that will be sent to the user
    
        $size = ob_get_length();
        header("Content-Length: $size");
        ob_end_flush();
        flush();
        if (ob_get_contents()) {
            ob_end_clean();
        }
    }
    
  20. from https://stackoverflow.com/questions/138374/how-do-i-close-a-connection-early by cc-by-sa and MIT license