Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.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
在PHP中进程完成后重定向页面_Php_Javascript_Jquery - Fatal编程技术网

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

在PHP中进程完成后重定向页面,php,javascript,jquery,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, fal

我在第页有一些程序。它正在下载一个文件

<?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。

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

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

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

您的代码应该很好,并且应该在重定向之前完成该过程

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


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

如果不将文件返回到客户端,可以执行以下操作:

  ignore_user_abort();
  header("Content-Length: 0", true, HTTP_RESPONSE_204_NO_CONTENT);
  header("Connection: close", true);
  flush();
这将把控制权返回给客户端并关闭浏览器连接,但服务器端进程将继续工作


但是,我同意@AgentRundrum的观点,即在其他进程完成之前,不会执行header()行。

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

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

您如何知道所有流程都没有完成?此代码应按顺序运行。问题不可能是您的重定向-它发生在文件已写入时。一定是别的原因。您是否有1000%确定删除标题行可以正常工作?是的,如果我不重定向页面,它可以正常工作。文件很大(40-50MB)。超时一切正常。它的工作,如果我不重定向我说。但我必须重定向到其他进程(上传到某处)。谢谢大家。标题位置功能在所有流程完成后工作。问题是脚本的另一部分。抱歉,再次感谢您提供的快速替代方案。