我遇到会话变量的问题。 我需要存储一些关于在会话变量中读取大文件的过程的信息(大小,大小读取......),以便使用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的文件。
答案 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行写一次。