0

我对会话变量有疑问。我需要在会话变量中存储一些关于读取大文件的过程的信息(大小、大小读取、...),以便使用 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 的文件。

4

2 回答 2

0

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

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

解决方案:不要写每行的行数,而是说每100行。

于 2012-11-28T11:01:32.037 回答
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 回答