2016-08-18 18 views
0

私はPHPファイルに単純なAJAXリクエストを持っています。 PHPスクリプトがある時点に達すると、私は応答が完了してクライアントに返信したいと思います。その後も、最大15秒かかる機能を実行するにはPHPスクリプトが必要です。現在、ブラウザは応答を処理する前にPHPスクリプト全体が終了するのを待ちます。 flush();またはob_flush();を使用しようとしましたが、応答を送信する前にPHPスクリプトの実行が完了するのを待っていました。スクリプトが終了する前にphpからajaxへの応答を返す

はJQueryコード:

jQuery.ajax({ 
      url: "../phpFile.php", 
      data: formdata, 
      cache: false, 
      contentType: false, 
      processData: false, 
      type: 'POST', 
      success: function (data) { 
       data = $.parseJSON(data); 
       if(data.success){ 
        window.location = "../public/dashboard.php"; 
       } 
      } 
}); 

PHPコード:

if ($script_reached_this_point) { 

    // ob_start(); 
    echo json_encode(['success' => 'Ticket added']); 
    //flush(); 
    // ob_end_flush(); 

    run_15_second_function(); 

} 
+1

での作業を続けています。あなたは2つのスクリプトを呼び出すことができます。最初のスクリプトから応答を得た後に起動される15秒のスクリプトですか? – Nick

+0

ありがとう、はい私は、ajax関数を実行するためにPHPスクリプトに別の要求をすることができます。私はちょうどそれが別の要求であるので非効率だと思った。私は基本的な解決策がないと思った。 – StoneLight

+0

私はあなたがバックグラウンドで実行できる別のプロセスを開始できると確信しています(そして、メインプロセスが終わっても終了しないように設定されています)。問題は、その機能が15秒間実行される理由です。非常に長いです... – Jakumi

答えて

0

I 2つのPHPスクリプトを有することにより、同様の問題を解決しました。 receiver.phpworker.phpとしましょう。次のようにプロセスは:

  1. AJAXは、二次接続でreceiver.php
  2. receiver.phpコールworker.phpを呼び出し、それをジョブ命令を渡し、応答の最初の行を待ちます。
  3. とすぐに応答の最初の行はworker.phpから到着すると、receiver.phpは、接続
  4. receiver.phpがすぐにAJAXへの応答を返して終了しますことを閉じます。
  5. worker.phpは、私はそれが可能だかわからない背景

receiver.php

//data to be forwarded to worker.php 
$postData = json_encode($_POST); 

// headers for the connection to worker.php 
$headers = "POST /path/to/worker.php HTTP/1.1".PHP_EOL; 
$headers .= "Host: localhost".PHP_EOL; 
$headers .= "Content-Length: ".strlen($postData).PHP_EOL; 
$headers .= "Content-Encoding: none".PHP_EOL; 
$headers .= "Content-Type: application/json".PHP_EOL; 

// create socket to the local webserver for calling background script 
$socketToWorker = fsockopen("localhost", 80, $errno, $err_msg); 
if(!$socketToWorker) die("fsockopen error #$errno: $err_msg"); 

// Make the request and send the POST data 
fwrite($socketToWorker, $headers.PHP_EOL.$postData);  

//read until the 1st packet is returned, then stop. 8192 is arbitrary 
//but needs to be greater than the expected response from worker.php 
$data = fread($socketToWorker,8192); 
fclose($socketToWorker); 

//send response to browser (work still ongoing in background) 
if($data==='OK') echo "Success"; 
else echo "Background work failed. Error: $data"; 

worker.php

//parse input from receiver.php 
$postData = json_decode(file_get_contents('php://input'),true); 

//TODO: validate $postData. 

// If data is valid, set below to 'OK' to accept the job 
$acceptJob = 'OK'; //replace with an error message to reject the job 
ob_start(); //start the buffer 
echo $acceptJob; //this is what receiver.php will see 

//set headers for the response to receiver.php 
header("Content-Encoding: none"); 
header('Connection: close'); 
header('Content-Length: '.ob_get_length()); 

// flush buffer. Will cause receiver.php to receive data and disconnect 
ob_end_flush(); ob_flush(); flush(); 

if($acceptJob!=='OK') exit; 

##################### START THE JOB HERE ##################### 
set_time_limit(60); //only needed if you expect job to last more than 30 secs 
run_15_second_function(); 
関連する問題