PHP : 대기중인 스크립트에 정보를 반환하고 처리를 계속하는 방법


6

두 개의 스크립트 Requester.php와 Provider.php가 있다고 가정하고 리퀘 스터가 Provider로부터의 처리를 요구하고 http 요청을하면 (Provider.php? data = " 데이터"). 이 경우 공급자는 신속하게 대답을 찾지 만 시스템을 유지 관리하려면 데이터베이스 전체에서 다양한 업데이트를 수행해야합니다. 요청자에게 즉시 값을 반환하고 공급자에서 계속 처리 할 수있는 방법이 있습니까?

사이비 코드

Provider.php 
{ 
    $answer = getAnswer($_GET['data']); 
    echo $answer; 
    //SIGNAL TO REQUESTER THAT WE ARE FINISHED 
    processDBUpdates(); 
    return; 
} 
1

기본적으로 1 프로세스의 종료를 알리고 (원래 Requester.php으로 돌아 가기) 새 프로세스를 생성합니다 (완료 Provider.php). 이 문제를 해결하는 좀 더 우아한 방법이있을 수 있지만이 방법을 몇 가지 방법으로 관리했습니다. 이들 모두는 기본적으로 두 번째 프로세스를 중단하기위한 명령을 실행합니다. 명령의 끝에 다음 > /dev/null 2>&1 &를 추가

는 다음과 같은 뭔가가 당신을 위해 작동 할 수는 현재 스크립트의 실제 실행을 억제하지 않고 백그라운드에서 실행 할 수 있습니다 :

exec("wget -O - \"$url\" > /dev/null 2>&1 &"); 

- 명령 줄 PHP 프로세스로도 할 수 있지만.

또한 처리해야 할 정보를 저장하고 exec 없이도 같은 종류의 기능을 다시 만드는 cron 작업에 나머지 처리를 처리 할 수 ​​있습니다.


2

당신은 플러시() 명령 출력 버퍼를 플러시 할 수 있습니다.
두에 대한 추가 정보를 원하시면


0

분할 공급자를 PHP manual의 주석을 읽어 ProviderCoreProviderInterface을. ProviderInterface에서 "빠르고 쉬운"부분을 수행하고 최근 요청이 아직 처리되지 않은 데이터베이스의 플래그도 저장하십시오. 해당 플래그를 검색하고 처리를 완료하는 cron 작업으로 ProviderCore을 실행하십시오. 할일이 없다면 ProviderCore가 종료되고 2 분 후에 다시 시도하십시오.


1

필자는 공급자에게 데이터를 보내야합니다 (플러시해야 함). 그런 다음 요청자에게 fopen/fread를 사용하여 예상되는 데이터 양을 읽으므로 연결을 공급자와 계속하십시오. 기대하는 데이터 양을 지정하지 않으면 리퀘 스터가 공급자가 연결을 종료하기를 기다리는 동안 리퀘 스터가 앉아 있다고 생각할 것입니다. 연결이 종료 될 때까지는 발생하지 않을 것입니다 (즉, 모든 2 차 작업이 집중적으로 수행됩니다. 작업이 완료되었습니다). 몇 가지 POC를 시험해 볼 필요가 있습니다.

행운을 빈다.


2

저는 백그라운드에서 프로세스를 실행하기 위해 this code을 사용합니다 (Linux에서 작동).

프로세스가 실행되어 출력이 파일로 리디렉션됩니다.

그런 식으로 프로세스의 상태를 표시해야하는 경우 출력 파일의 내용을 읽고 표시하기위한 적은 양의 코드를 작성하는 것입니다.

브라우저를 완전히 닫고 상태를 확인하기 위해 나중에 쉽게 돌아올 수 있기 때문에이 방법이 마음에 듭니다.


0

저는 여기서 사지 않을 것이지만, 아마도 cURL을 시도하거나 소켓을 사용하여 요청자를 업데이트해야합니까?


0

당신은 pcntl_fork()

Provider.php 
{ 
    // Fork process 
    $pid = pcntl_fork(); 

    // You are now running both a daemon process and the parent process 
    // through the rest of the code below 

    if ($pid > 0) { 
     // PARENT Process 
     $answer = getAnswer($_GET['data']); 
     echo $answer;  
     //SIGNAL TO REQUESTER THAT WE ARE FINISHED 
     return; 
    } 

    if ($pid == 0) { 
     // DAEMON Process 
     processDBUpdates(); 
     return; 
    } 

    // If you get here the daemon process failed to start 
    handleDaemonErrorCondition(); 
    return; 

} 
를 사용 Provider.php 다른 PHP 프로세스를 시작할 수