【问题标题】:Bad PHP script for downloading用于下载的错误 PHP 脚本
【发布时间】:2011-09-17 09:01:43
【问题描述】:

我有一个简单的脚本:

  $url=file_get_contents($_GET['url']);
  $name=$_GET['name'];
  file_put_contents('temp.'.$_GET['ext'],$url);

它是通过http下载文件的脚本。但是文件太大(~10 Mb),脚本停止并显示消息:

“致命错误:超过 30 秒的最大执行时间”

在我的本地服务器上我可以编辑 php.ini 并设置 300 秒,但我不能在 Internet 上的服务器上执行此操作。如何在不编辑 php.ini 的情况下完成我的任务?请给我代码示例,谢谢。

【问题讨论】:

  • 如果您的托管服务提供商不允许您更改设置,您无能为力
  • 您可以尝试在根目录中使用自定义 php.ini 覆盖 thi,但这可能不起作用。联系您的托管服务提供商并说明情况,或寻找其他方式来实现您的目标,或购买 VPS
  • 你试过set_time_limit()吗?
  • 顺便说一句,写入这样的任意文件名不是很安全

标签: php


【解决方案1】:

也许你可以分部分下载文件:

$parts = 4;
$file_size = 500000;
$size_per_part = $file_size/$parts;

for($i=1;$i<$parts;$i++){ 
$url{$i} = file_get_contents('file.text', NULL, NULL, 0, $size_per_part);
}

【讨论】:

    【解决方案2】:

    如果您无法编辑您的 php.ini 文件,请尝试以下代码来增加您的;

    // check if your web server accepts ini_set, before attempt to change anything
    if(!ini_get('safe_mode')) {
        set_time_limit(240);
        ini_set('max_input_time', 300);
        ini_set("max_execution_time", "240");
    }
    

    关于PHP ini_set的更多信息。

    【讨论】:

      【解决方案3】:

      没有办法绕过脚本超时。您需要在后台开始下载并使用另一个脚本来检查其进度。

      exec( 'wget -b -O temp.' . $_GET['ext'] . ' "' . $_GET['url'] . '" > /dev/null &' );
      

      将在后台执行 wget(假设您的托管服务具有 wget),您可以检查生成的 wget-log 文件以查看何时完成。

      【讨论】:

      • 哇,巨大的安全漏洞!如果他使用托管帐户,我非常怀疑他是否能够运行 shell 命令。如果他拥有自己的服务器并启用了它,那么$_GET['ext'] 需要进行清理!
      • 我认为他不能使用 exec()。考虑到许多托管公司不允许这样做,他甚至无法更改 php.ini,他将无法使用 exec() 但这是一个很好的信息 +1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      相关资源
      最近更新 更多