在PHP中完成流程后重定向页面

时间:2011-08-19 22:19:22

标签: php javascript jquery

我在页面中有一些进程。它正在下载文件。

<?php

// getting file with CURL
        $ch = curl_init ('http://adress.com/file.csv');
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    curl_setopt($ch, CURLOPT_TIMEOUT,7500);
    $rawdata=curl_exec($ch);
    curl_close ($ch);
// End Curl Process

// SAVE FILE
    $name = Rand(100000,1000000);
    $fp = fopen('files/'.$name.'.csv','w');
    fwrite($fp, $rawdata);
    fclose($fp);

// END SAVE PROCESS

// REDIRECT OTHER PAGE
       **header('Location: x.php');**
// END OF PAGE

?>

这没关系。但有一个问题。它没有完整的流程重定向。我希望在完成所有流程后重定向。当我使用该方法重定向时,该文件为空。

我该怎么办?所有流程完成后如何重定向页面? php或javascript / jquery。

4 个答案:

答案 0 :(得分:2)

您的代码应该没问题,并且应该在重定向之前完成该过程。

PHP在单个线程中运行,因此下一个语句在前一个语句完成之前不会执行。这意味着在header()完成文件写入之前,您的fwrite()行才会执行。

实际上,设置Location标头甚至不意味着PHP脚本停止。您可以通过创建虚拟文件并在发出unlink()标头后在其上运行Location来对此进行测试。该文件仍将被删除。 Location所做的就是向浏览器发送一个新位置。然后,您的浏览器会在旧页面运行之前检索新页面。

答案 1 :(得分:2)

我认为在标题完成时设置回调是最好的解决方案。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.php.net/');

// here is the hack - Set callback function for headers
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header');

curl_exec($ch);
curl_close($ch);

//Callback function for header
function read_header($ch, $string)
{   
    if (trim($string) == 'HTTP/1.1 200 OK')
        header("location: http://www.php.net"); 
}

答案 2 :(得分:1)

您可以设置睡眠(秒)并检查它是否足以完成整个过程。

您也可以进行简单的检查:

$start_size = 0;
while (1) {
   $new_file_size = filesize($filename);

   if ($start_size != $new_file_size) {
      $start_size = $new_file_size;
      sleep(30)
   } else {
      break;
   }
}

答案 3 :(得分:1)

如果您没有将文件返回给客户端,则可以执行以下操作:

  ignore_user_abort();
  header("Content-Length: 0", true, HTTP_RESPONSE_204_NO_CONTENT);
  header("Connection: close", true);
  flush();

这会将控制权返回给客户端并关闭浏览器连接,但服务器端进程将继续工作。

但是,我同意@AgentConundrum,在其他进程完成之前,header()行不会被执行。