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