【问题标题】:Downloading large file with cURL in PHP - Page hangs在 PHP 中使用 cURL 下载大文件 - 页面挂起
【发布时间】:2011-05-16 14:05:09
【问题描述】:

我有一个从不同位置下载视频的 PHP 脚本。 视频文件可以是 20mb 到 100mb+ 的任何地方

我有 PHP 当前使用 CURLOPT_FILE 将视频文件保存在一个目录中。这工作正常,没有问题。

由于要下载的文件很大,我已将 cURL 超时期限设置为 45 分钟以允许下载文件。我还设置了 set_time_limit(0) 以便 PHP 页面在下载完成后继续处理。我还设置了 ini_set("memory_limit","500M"); 下载完成后,它应该回显“已下载”,然后更新一条 mysql 记录,说明文件已下载。

但是发生了什么,cURL 正在正确下载视频文件,但它没有在浏览器中显示“已下载”,但它正在更新 mysql。

这是为什么?我试图自己想出一个解决方案,但我无法弄清楚这里的问题是什么......

【问题讨论】:

  • 浏览器本身是否断开连接,您可以发送keep-alives吗?
  • 查看 yc 对我的要求的回答。

标签: php javascript curl download timeout


【解决方案1】:

如果您在浏览器环境中,浏览器将在一定时间后超时,因此将停止侦听脚本的输出,即使脚本将继续运行。它因浏览器而异,但我看到的数字是 30 秒。

为了克服这个问题,你应该经常发送输出(即使是毫无意义的echo "<!--empty comment-->";)。

我最近遇到了类似的问题,我通过不从脚本输出任何内容来处理它,而是经常使用 AJAX 从浏览器轮询以查看是否完成。

或者,不要使用浏览器环境(因为它不适合解决这个问题),而是使用命令行提示符,因为它没有(据我所知)这些超时。

【讨论】:

  • 如何在 cURL 进程运行时发送输出?据我所知,它必须先执行 cURL,然后再输出其他内容?
  • @papa_face 是的,你是对的,只有当你同步卷曲时。如果您尝试其中一种记录在案的 cURLing 异步方法,您可以解决这个问题:google.com/…
  • 另一方面,我认为更好的选择是通过查看 MySQL 数据库是否已更新,每隔一段时间从浏览器轮询一次以检查是否完成。
  • 我需要它连续运行,没有检查下载状态的方法。我将如何通过 SSH 运行此脚本并让脚本查看 $_GET 变量?例如 php myscript.php?var=hello 。为了让我的脚本正常工作,它需要“看到”“hello”变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多