【发布时间】: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