2017-04-20 96 views
0

我试图用file_put_contents从远程服务器上下载文件。这个脚本通过ajax调用。我遇到的问题是当文件很大时例如脚本超时(500MB)。我得到504网关超时 - nginx的PHP长时间运行的脚本替代?

的download.php $目标= “/home/mywebsite/public_html/wp-content/channels/videos/test.mp4”;

$link = "http://www.example.com/videos/movie.mp4"; //500mb 
    $result = file_put_contents($destination, fopen($link, 'r')); 

我正在使用专用主机。我已经改变了我的php.ini并确认phpinfo();

max_execution_time 7200 max_input_time 7200 max_input_vars 1000 memory_limit -1 output_buffering 4096 post_max_size 1200M upload_max_filesize 1000M

此脚本保持超时。有没有另一种解决方案,我该如何解决?当我检查目录时,文件已成功下载,但页面超时。所以我不能通过ajax返回任何数据。

我该如何解决?

+0

而不是我建议你执行wget从php exex –

+0

如果您正在您的服务器上下载文件,它不是服务于该请求中的任何人,首先不需要PHP在那里。如果您有* NIX –

回答

1

您还应该更改nginx fcgi超时值。 PHP脚本继续执行,但你的连接nginx和PHP超时。

1

使下载异步。像一个进程只填写一些数据库或rabbitMq的下载请求和其他威尔cosume它(也许cron)

+0

,您可以简单地执行'wget http:// www.example.com/videos/movie.mp4'这对于长时间运行的流程来说是最明智的选择。它还能很好地防御DOS攻击,因为尝试只会在数据库中生成一堆请求条目(您可以通过限制特定用户同时拥有多少条目来轻松阻止),而不是将服务器通过长时间运行的流程充斥着它。 –

+0

cron脚本会超时吗? – mdnba50

+0

它可能,但你可以通过'ini_set('max_execution_time',0);'在php代码中没有任何更改nginx(whitch不是由你维护......只是asuming) –