0

セッション変数に問題があります。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 を超えるファイルを読み込もうとしています。

4

2 に答える 2

0

マルチセッション要件がない場合...

function createSessionValue($sessionField, $sessionValue) {
    file_put_contents("/tmp/$sessionField", $sessionValue);
}
// -------------------
$readlines = file("/tmp/readlines");
$filesize = file("/tmp/filesize");

または、これを試すことができます...

function createSessionValue($sessionField, $sessionValue) {
    file_put_contents("/tmp/".session_id()."_".$sessionField", $sessionValue);
}
// -------------------
$readlines = file("/tmp/"session_id()."readlines");
$filesize = file("/tmp/"session_id()."filesize");
于 2012-11-28T11:00:17.453 に答える
0

2 つのプロセスが同時に実行されており、両方が同じセッション ファイルにアクセスしています。

ほとんどの場合、セッション ファイルは一方のプロセスによってロックされており、もう一方のプロセスはそのロックの解放を待っています。長時間のプロセスでセッション ファイルが短時間だけ開いたままになると、これは奇妙に思えるかもしれませんが、これは 1 秒間に何度も行われます。

解決策: 行数を 1 行ごとに書くのではなく、100 行ごとに書きます。

于 2012-11-28T11:01:32.037 に答える