Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用ajax检查PHP中的脚本状态_Javascript_Php_Jquery_Session - Fatal编程技术网

Javascript 使用ajax检查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;

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

我尝试在脚本中使用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)){
            $_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进程

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

  • 为可供用户访问的目录创建临时名称 客户
  • 将“上载”写入临时文件
  • 在会话中存储文件名。(注意:用户可能会打开多个上载表单。将文件名存储在一个数组中)
  • 将文件名作为隐藏字段发送到客户端
  • 在用户提交表单后的服务器端:

  • 检查从客户端发送的文件名是否与会话中存储的文件名匹配
  • 将“处理”写入状态文件
  • 在上载脚本结束时,将“完成”写入状态文件
  • 在用户提交表单后的客户端,通过对状态文件执行ajax请求来检查上载状态

    备注

    使用.htaccess禁用状态文件的缓存。如果没有此选项,则可以使用php状态脚本和保存到会话变量(而不是状态文件)的上载状态实现相同的行为


    要确保删除所有生成的文件,请注册一个删除会话中生成的文件的销毁处理程序:

    这对于注释来说太长了

    我不确定你会如何用PHP的进度信息来回应。我试过一次,但失败了

    Socket.io在Node.js中非常棒,并且有一个。我可能会试一试。它应该提供近乎即时的通信,而无需等待脚本完成

    或者,我可以查看jqueryupload,它有一个PHP服务器脚本。支持进度条。要么直接实现它,要么查看如何显示进度信息的源代码。我试着快速查看一下,但无法确定他们是如何轻松完成的。

    如果可以在服务器上完成,为什么要使用数据库? 为了节省带宽和数据库流量,您可以将进程分成两个文件

  • 创建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重定向它。祝你好运


  • 我是这样问的。这是在服务器端更新值并在客户端访问值的最佳方法。服务器端的一切都已准备就绪。现在需要在超时时对服务器执行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;
    }