我的应用程序中有一个文件上传页面。我需要显示"正在上传"当文件上传然后显示"处理"文件正在处理中。然后在完成脚本后,我的页面被重定向到某个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();
但它也不起作用。我总是得到SESSION的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()
重定向到结果页面和删除表。
但是每秒检查状态的My 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'];
?>
到目前为止还无法找到解决方案。非常感谢帮助。感谢。
答案 0 :(得分:1)
您可以使用静态文件来检查上传状态,而不是每秒在服务器端调用PHP进程。
为客户生成上传表单时:
用户提交表单后在服务器端:
在用户提交表单后的客户端,通过对状态文件执行ajax请求来检查上载状态。
<强>说明强>
使用.htaccess禁用状态文件的缓存。如果这不是选项,则可以使用php状态脚本实现相同的行为,并将上载状态保存到会话变量而不是状态文件。
要确保删除所有生成的文件,请注册删除会话中生成的文件的销毁处理程序:http://php.net/manual/en/function.session-set-save-handler.php
答案 1 :(得分:0)
<?php echo $_SESSION['uploaded']; ?>
预处理由PHP 仅 。也就是说,客户端上的javascript看起来像:
function countdown(seconds){
console.log(0);
if(0==0){
setTimeout(function() {
//uploading
seconds--;
countdown(seconds);
}, 1000);
}
else{
//processing
}
}
您应该找到其他方式(ajax?)来更新客户端的信息。
答案 2 :(得分:0)
这对评论来说太长了。
我不确定您是如何使用PHP回复进度信息的。我试了一次然后失败了。
Socket.io在Node.js中很棒,而且有一个PHP server emitter。我可能会放手一搏。它应该提供近乎即时的通信,而无需等待脚本完成。
或者我会查看Jquery上传,它有一个PHP服务器脚本。支持进度条Jquery Upload。可以直接实现它,也可以查看源代码以了解显示进度信息。我试着快速查看,但无法确定他们如何轻松地做到这一点。
答案 3 :(得分:0)
要节省带宽和数据库流量,您可以将流程分成2个文件
创建 upload.php 以投放上传过程
$_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)){
// Save path to session var
$_SESSION['uploaded']=$targetFile;
//You can tell client if the uploading process were done and show 'Processing ...'
// Place some code
exit;
}
}
接下来,创建一个名为 progress.php
的文件// check
if(!empty($_SESSION['uploaded'])){
// Do your processing code here
// Remove session
unset($_SESSION['uploaded']);
// Then send response to client after your processing were done
echo 'Done';
exit;
}
您可以在标记客户端时使用jquery重定向客户端。祝你好运