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

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

 

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

我必须做什么? 所有流程完成后如何重定向页面? php或javascript / jquery。

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

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

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

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

 $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"); } 

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

你也可以做一个简单的检查:

 $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; } } 

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

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

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

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