2016-11-25 5 views
0

実行時間の長いPHPスクリプトのAjaX呼び出しを実行する必要があります。私の目標は、この実行の進捗状況を表示することです。AjaX呼び出し中の処理で初期値と最終値のみが表示されます

アイデアは、サーバに実行のステータスを定期的に問い合わせるためのAjaX呼び出しを作成することです。進捗状況は$_SESSION['progress']に格納され、最初に0に設定され、実行中にスクリプトから変更されます。

私のコードはクライアント側とサーバー側です。

クライアント側

// invoke the script (ie. with button) 
$('#start').click(function() 
{ 
    $.ajax 
    ({ 
     url: "long-script.php" 
    }); 
}); 

// check progress periodically 
setInterval(progress, 100); 
function progress() 
{ 
    $.ajax 
    ({ 
     dataType: "json", 
     url: "progress.php", 

     success: function(data) 
     { 
      console.log(data); 
     } 
    }); 
} 

長script.php

// just an example to emulate execution 
sleep(1); 
$_SESSION['progress']=30; 
sleep(1); 
$_SESSION['progress']=70; 
sleep(1); 
$_SESSION['progress']=100; 

progress.php

header('Content-Type: application/json'); 
echo json_encode($_SESSION['progress']); 

PROB実行中にconsole.log()が実行され、スクリプトの実行前に0が出力され、実行中にデータの出力が停止され、最後にスクリプトが終了すると100が出力されます。私は何が欠けていますか?

答えて

0

問題は、セッションが書き込まれていないか、スクリプトが終了するかセッションが終了するまでです。

セッションは、デフォルトでphpでシステムにファイルとして保存され、実行時にロックされることを覚えておく必要があります。

あなたができることは、long-script.phpファイルを少し変更することです。

session_start(); 

sleep(1); 
$_SESSION['progress']=30; 
session_write_close(); 

sleep(1); 
session_start(); 
$_SESSION['progress']=70; 
session_write_close(); 

sleep(1); 
session_start(); 
$_SESSION['progress']=100; 
session_write_close(); 

考えられるのは、すべての進捗状況が変更された後にセッションに書き込むことです。

その後、セッションをもう一度開始する必要があります。

これはこれを行うには間違った方法かもしれませんが、PHPではセッション関数を常に参照できます。これを見てsession_write_cloe

+1

これはセッションに書かれていない問題を直接扱いますが、このように$ _SESSIONを使用せずにOPが望んでいることを達成するためのより良い方法があるとは言いません。 –

+0

@cale_bは論争していません。彼の方法を回避してOPを表示したかっただけです。 –

+0

@cale_b: "恐らくもっと良い方法を達成するには..."より良い提案があれば、私はそれらについて聞いてうれしいです。 – Giorgio

関連する問題