2016-11-04 3 views
3

나는 $ .post 또는 ajax를 사용하여 jquery에서 호출 할 수있는 정말 큰 PHP 스크립트를 가지고 있습니다. 이제는이 스크립트가 여러 부분으로 나뉘어 조용 해졌으므로 스크립트의 특정 부분이 완료되면 플래그를 반향시키고 jquery에서 해당 플래그 값을 읽고 그에 따라 주석을 표시해야합니다. 그래서 기본적으로 실시간으로 응답하는 로더가 필요합니다.실시간 응답 받기 PHP에서

예를 들어 PHP에서 세 개의 세그먼트가 있다고 가정 해 봅시다. 유효성 검사를 수행하는 세그먼트와 데이터베이스에 데이터를 저장하는 세그먼트, 마지막으로 파일을 만들고 로그인을 유지하는 세그먼트를 말합니다. 이제이 세그먼트들 모두가 차례로 실행되어야한다는 것을 기억하거나 아무 것도 일어나지 않아서 단일 호출입니다. 그래서 내가 만들고자하는 것은 각 세그먼트가 완료 될 때 사용자에게 알리는 로더입니다. 다음

<?php 

/* code for segment one 

...... 

*/ 

echo 1; 

/* code for segment two 

...... 

*/ 

echo 2; 

/* code for segment three 

...... 

*/ 

echo 3; 

?> 

같은 뭔가 이제 대부분이 스크립트는 궁극적으로 '123'와 같은 문자열로 출력을 생성 할 것을 생각해야합니다하지만 각각의 출력이 다른 후 하나를 전송합니다. 이게 가능한가? 그렇다면 예제를 공유하십시오.

+1

는'output_buffering'을 제거 시도하고 확인? –

+0

그리고 여기에는 [** 스트리밍 대 출력 버퍼링 **] (https://www.sitepoint.com/php-streaming-output-buffering-explained/)에 대한 내용이 있습니다. –

+0

output_buffering이 작동하지 않았지만 그 링크가 정말 도움이되었습니다. – hraw

답변

1

이론적으로 PHP 스크립트는 실행 중에 클라이언트에 출력을 반환 할 수 있지만 내 경험상 웹 서버가 캐시 할 수 있기 때문에 신뢰할 수 없습니다.

나는 큰 PHP 스크립트를 작은 부분으로 분해하여 각각 별도로 호출하려고합니다. 더 작은 각각의 PHP 스크립트는 클라이언트에게 진행 상황을 알리는 메시지를 반환 할 수 있습니다. 컨텍스트는 session 기능을 사용하여 더 작은 PHP 스크립트간에 공유 할 수 있습니다.

+0

세션 기능의 문제점은 사용자가 언제 사라지는 지 전혀 알 수 없다는 것입니다.예를 들어 스크립트가 진행되는 동안 일부 세그먼트에서 문제가 발생하면 이미 입력 한 레코드를 삭제하고 작업을 실행 취소 할 수 있지만 세션을 사용하면 세그먼트가 무엇인지 또는 무엇이 잘못되었는지를 확인할 수 없습니다. 어쨌든 Praveen Kumar의 의견은 ob_flush()를 사용하는 데 도움이되었습니다. 플러시(); 내 문제를 해결하고 피드백을 제공합니다. – hraw

+0

솔직히 말해, 왜 세션 사용이 효과가 없을 것이라고 생각하는지 완전히 이해하지 못합니다. 세션을 사용하고 클라이언트에서 실행을 제어하면 하나의 스크립트에서 모든 것을 수행하는 것과 똑같은 능력을 얻을 수 있습니다. –

1

PHP는 동기식이므로 코드를 한 줄씩 실행하며 긴 동작은 차단됩니다.

스크립트 응답을 기다리지 않으려면 다른 PHP 파일을 사용하고 다른 Ajax 호출을 사용하여 비동기 실행을 시뮬레이트 할 수 있습니다.

$.ajax({ 
    url: 'yourfile1.php', 
    method: 'post', 
    data: { 

    } 
}).done(function(response){ 
    $.ajax({ 
     url: 'yourScript2.php', 
     method: 'post', 
     data: { 
      toPost: response 
     } 
    }).done(function(response2){ 
     // Ajax finished 
    }); 
}); 

실제 서버 비동기 실행을 원하면 서버 측에서 nodejs를 사용할 수 있습니다. 마녀가이를 위해 만들어졌습니다.

는 "Node.js를은 가볍고 효율적 이벤트 기반, 비 블록 I/O 모델을 사용합니다."

https://nodejs.org/en/

+0

다른 스크립트로 내 세그먼트를 만들어서 배포해야하므로 그리 좋아하지는 않습니다. – hraw