使用会话变量导致性能不佳

时间:2012-11-28 10:51:50

标签: php jquery ajax session readfile

我遇到会话变量的问题。 我需要存储一些关于在会话变量中读取大文件的过程的信息(大小,大小读取......),以便使用jquery ajax方法获取此值,并向用户显示有关该过程的信息。

在php页面中我有这段代码:

逐行读取文件并在会话变量中存储(总和)行的大小 文件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页面中,我用ajax调用这个php文件:
文件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的文件。

2 个答案:

答案 0 :(得分: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");

答案 1 :(得分:0)

您有两个进程同时运行,并且都访问同一个会话文件。

很可能会话文件被一个进程锁定,另一个进程正在等待该锁的释放。当长期过程使会话文件仅在短时间内保持打开时,这可能看起来很奇怪,但它会在一秒钟内多次执行。

解决方案:不要每行记录行数,而是每100行写一次。