Javascript 使用ajax检查PHP中的脚本状态
我的应用程序中有一个文件上传页面。我需要在文件上传时显示“上传”,然后在文件处理时显示“处理”。然后在脚本完成后,我的页面被重定向到某个url 我尝试在脚本中使用PHP会话。代码如下:Javascript 使用ajax检查PHP中的脚本状态,javascript,php,jquery,session,Javascript,Php,Jquery,Session,我的应用程序中有一个文件上传页面。我需要在文件上传时显示“上传”,然后在文件处理时显示“处理”。然后在脚本完成后,我的页面被重定向到某个url 我尝试在脚本中使用PHP会话。代码如下: $_SESSION['uploaded']=0; if (!empty($_FILES)) { $tempFile = $_FILES['file']['tmp_name']; $targetPath = dirname( __FILE__ ) . $ds. $storeFolder . $ds;
$_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
}
}
文件上传后,完成I更新会话。我通过调用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
}
}
然后上传完成后,我将状态更新为1,并对文件进行处理。
然后在成功完成脚本后,我重定向到结果页面,并使用session\u 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'];
?>
到目前为止还找不到解决办法。非常感谢您的帮助。谢谢。
仅在将此javascript发送到客户端之前,由PHP预处理一次。也就是说,客户端上的javascript看起来像:
function countdown(seconds){
console.log(0);
if(0==0){
setTimeout(function() {
//uploading
seconds--;
countdown(seconds);
}, 1000);
}
else{
//processing
}
}
您应该找到其他方法(ajax?)在客户端更新信息 您可以使用静态文件检查上载状态,而不是每秒在服务器端调用一个PHP进程 为客户端生成上载表单时:
要确保删除所有生成的文件,请注册一个删除会话中生成的文件的销毁处理程序:这对于注释来说太长了 我不确定你会如何用PHP的进度信息来回应。我试过一次,但失败了 Socket.io在Node.js中非常棒,并且有一个。我可能会试一试。它应该提供近乎即时的通信,而无需等待脚本完成 或者,我可以查看jqueryupload,它有一个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;
}
}
// 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重定向它。祝你好运我是这样问的。这是在服务器端更新值并在客户端访问值的最佳方法。服务器端的一切都已准备就绪。现在需要在超时时对服务器执行ajax调用。检查这一点,它应该可以做到。尝试实现ajax解决方案。它不起作用。它也有同样的问题会话变量更新只有在脚本完成后。您正在寻找@CBroe尝试您的建议。将很快更新。@非常感谢您的输入。我已经用另一种方法解决了。谢谢你的意见。我用另一种方法解决了它。
// 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;
}