【发布时间】:2014-12-02 13:21:35
【问题描述】:
我的应用程序中有一个文件上传页面。我需要在文件上传时显示“正在上传”,然后在文件正在处理时显示“正在处理”。然后在脚本完成后,我的页面被重定向到某个 url。
我尝试在脚本中使用 PHP SESSIONS。如下代码:
$_SESSION['uploaded']=0;
if (!empty($_FILES)) {
$tempFile = $_FILES['file']['tmp_name'];
$targetPath = dirname( __FILE__ ) . $ds. $storeFolder . $ds;
$_FILES['file']['name']=date('Ymdhis').$_FILES['file']['name'];
$targetFile = $targetPath. $_FILES['file']['name'];
if(move_uploaded_file($tempFile,$targetFile)){
$_SESSION['uploaded']=1;
//some processing here which takes some 4-5second to complete
}
}
文件上传完成后,我更新会话。我通过在javascript中调用以下函数每秒检查一次会话:
function countdown(seconds){
console.log(<?php echo $_SESSION['uploaded']; ?>);
if(<?php echo $_SESSION['uploaded']; ?>==0){
setTimeout(function() {
//uploading
seconds--;
countdown(seconds);
}, 1000);
}
else{
//processing
}
}
从谷歌搜索了很长时间后,我才知道在单个脚本中 SESSION 被锁定,直到脚本执行完成。然后我使用了session_write_close();,但它也不起作用。我总是得到 0 的会话值。
请帮助我以最简单的方式找出解决方案。谢谢。
更新
也无法使其与 Ajax 请求一起使用。所以进一步尝试使用MySQL表。
调用上传脚本时我所做的是create table。然后使用以下代码在其中插入status=0 的值:
$session=session_id();
$stmt=$conn->prepare("DROP TABLE IF EXISTS $session");
$stmt->execute();
$stmt=$conn->prepare("CREATE TABLE $session (id INT(11), status INT(11))");
$stmt->execute();
$stmt=$conn->prepare("INSERT INTO $session VALUES(1,0)");
$stmt->execute();
然后在上传完成后,我将状态更新为 1 并对文件进行处理。
然后在成功完成脚本后,我使用session_id() 重定向到结果页面并删除表。
但我的 Ajax 脚本每秒检查一次状态,直到 upload.php 脚本结束才响应。我尝试在每次查询后关闭连接,但徒劳无功。 getstatus.php 上的代码
<?php
session_start();
$session=session_id();
require_once('connect.php');
$stmt=$conn->prepare("SELECT * FROM $session WHERE id=1");
$stmt->execute();
$res=$stmt->fetch(PDO::FETCH_ASSOC);
echo $res['status'];
?>
目前无法找到解决方案。非常感谢您的帮助。谢谢。
【问题讨论】:
-
@CBroe 尝试您的建议。很快就会更新。
-
@all 感谢您的意见。我已经用另一种方法解决了。
标签: javascript php jquery session