セッション変数に問題があります。jquery ajaxメソッドでこの値を取得し、プロセスに関する情報をユーザーに表示するには、セッション変数に大きなファイルを読み取るプロセスに関する情報(サイズ、サイズ読み取りなど)を保存する必要があります。
PHPページには、次のコードがあります。
ファイルを 1 行ずつ読み取り、行のサイズをセッション変数に格納 (合計) します。
ファイル 1 - readfile.php
$start = (float) array_sum(explode(' ',microtime()));
$filesize = filesize($file);
$handle = fopen($file, 'r');
$readsize = 0;
$linecount = 0;
createSessionValue('filesize', $filesize);
set_time_limit(0);
if ($handle) {
while (!feof($handle)) {
$line = fgets($handle);
if ($line) {
$readsize += mb_strlen($line);
createSessionValue('readlines', $readsize);
$linecount++;
}
}
};
$end = (float) array_sum(explode(' ',microtime()));
そして、この機能:
function createSessionValue($sessionField, $sessionValue) {
session_start();
$_SESSION[$sessionField] = $sessionValue;
session_write_close();
}
HTML ページで、この php ファイルを ajax で呼び出します:
ファイル 2 - getSessions.php
session_start();
if (isset($_SESSION)) {
var_dump($_SESSION);
if(isset($_SESSION['readlines']) && isset($_SESSION['filesize'])){
$completepercent = round(($_SESSION['readlines'] * 100) / $_SESSION['filesize'],2);
}
echo $completepercent . ' % Complete.';
}
else {
echo 'no sessions values found';
}
echo '</br>Execution time:' . ini_get('max_execution_time');
このファイルは、次の jquery コードを使用して html ページから呼び出されます。
$(document).ready(function(){
window.setInterval(getSessionsValues, 1);
function getSessionsValues(){
$.get("getSessions.php", function(data){
// alert("Data Loaded: " + data);
$('div').html(data);
},'html');
}
});
進行状況は問題なく動作しますが、セッション変数を使用するとパフォーマンスが非常に悪くなります。
結果は次のとおりです。
Filesize: 732295
Read bytes: 732295
セッション変数を使用:
処理時間: 18.0620 秒
セッション変数なし (関数 createSessionValue を呼び出す行にコメントを付けます):
処理時間: 0.6535 秒
なんで?プロセスの実行時間を制御する最良の方法は何ですか?
新しいテスト: プロセスを開始し、getProcessStatus.php を開きます。このプロセスには時間がかかります。
処理時間: 197.5220 秒
私は最終的に@Li-chih Wuによって提案されたソリューションを使用しています。私の問題は、Chrome でエラー 101 (net::ERR_CONNECTION_RESET) が発生することです。
500 MB を超えるファイルを読み込もうとしています。