【问题标题】:use session variables causes poor performance使用会话变量会导致性能不佳
【发布时间】:2012-11-28 10:51:49
【问题描述】:

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

【问题讨论】:

  • 您需要多次启动会话吗?当然一次就足够了。
  • 顺便说一句,您不必每次在会话字段中存储内容时都调用session_start() - 每次请求只需调用一次,然后再执行其他任何操作。
  • 如果我没有将 session_start() 放在两个文件中。 ajax 请求等到进程结束。

标签: php jquery ajax session readfile


【解决方案1】:

如果您没有多会话要求...

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");

【讨论】:

  • 如果我没有使用会话变量获得有效的解决方案,我想使用类似的解决方案。谢谢
  • 最后,我将您的解决方案与 Matijs 的解决方案混合使用,但没有 session(),仅将状态保存在临时文件中并使用 ajax 读取此文件。无论如何,如果运行 ajax 页面以获得结果,则该过程需要更多时间。如果一个没有ajax调用的进程运行处理时间:1.3481秒,ajax调用超过20秒。 ¿正常吗?
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢。我犯了一个错误......我认为这个函数中的时间参数是秒......但是它的毫秒...... setInterval(code,millisec,lang)......会话文件每1毫秒被锁定...... 1秒性能更好。
猜你喜欢
  • 1970-01-01
  • 2021-05-14
  • 2020-07-26
  • 1970-01-01
  • 2012-07-31
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
相关资源
最近更新 更多