javascript - 使用 ajax 检查 PHP 中的脚本状态

标签 javascript php jquery session

我的应用程序中有一个文件上传页面。我需要在上传文件时显示“正在上传”,然后在处理文件时显示“正在处理”。然后,在脚本完成后,我的页面被重定向到某个网址。

我尝试在脚本中使用 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
    }
}

文件上传完成后,我更新 session 。我通过在 javascript 中调用以下函数每秒检查 session :

    function countdown(seconds){
                console.log(<?php echo $_SESSION['uploaded']; ?>);
                if(<?php echo $_SESSION['uploaded']; ?>==0){
                    setTimeout(function() {                        
                        //uploading
                        seconds--;
                        countdown(seconds);
                    }, 1000);                     
                }
                else{
                    //processing
                }
            }

在google上搜索了很长时间后,我发现在单个脚本中,SESSION是锁定的,直到脚本执行完成。然后我使用了 session_write_close(); 但它也不起作用。我总是得到 0 的 SESSION 值。

请帮我以最简单的方式找出解决方案。谢谢。

更新

也无法使其与 Ajax 请求一起使用。于是进一步尝试使用MySQL表。

我所做的是在调用上传脚本时创建表。然后使用以下代码在其中插入 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'];
?>

到目前为止还找不到解决方案。非常感谢您的帮助。谢谢。

最佳答案

您可以使用静态文件来检查上传状态,而不是每秒调用服务器端的 PHP 进程。

为客户端生成上传表单时:

  1. 为可访问的目录创建临时文件 客户。
  2. 将“上传”写入临时文件
  3. 将文件名存储在 session 中。 (请注意:用户可能会打开多个上传表单。将文件名存储在数组中)
  4. 将文件名作为隐藏字段发送给客户端。

用户提交表单后在服务器端:

  1. 检查客户端发送的文件名是否与 session 中存储的文件名匹配。
  2. 将“处理”写入状态文件
  3. 在上传脚本末尾将“完成”写入状态文件

在用户提交表单后,在客户端通过对状态文件执行ajax请求来检查上传状态。

备注

禁用 .htaccess 状态文件的缓存。如果这不是选项,您可以使用 php 状态脚本实现相同的行为,并将上传状态保存到 session 变量而不是状态文件中。

为了确保删除所有生成的文件,请注册一个销毁处理程序来删除 session 中生成的文件:http://php.net/manual/en/function.session-set-save-handler.php

关于javascript - 使用 ajax 检查 PHP 中的脚本状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27250540/

相关文章:

javascript - 是否可以将 PHP 代码嵌入到 HTML 标记的类或名称属性中?

javascript - 平滑停止 CSS 关键帧动画

php - Laravel:如何允许带有 .php 文件扩展名的路由

php - 如何将几个选定的依赖项设置为 "prefer source",将其余部分设置为 "prefer dist"?

jquery - 将 JQuery 内容放入 .html.erb 文件 Rails 中是一个好习惯吗?

javascript - 禁用相似下拉列表之间的选定选项

javascript - 重定向到用户来自的页面

javascript - 如果用户两次插入错误的凭据,Jquery 登录功能将不起作用

javascript - 使用 Javascript 在网页上显示另一台计算机的时间?

jquery - 如何在这个 div 上添加滚动条?