【问题标题】:PHP Upload Timeouts: More Efficient Upload Script?PHP 上传超时:更高效的上传脚本?
【发布时间】:2011-04-12 14:14:00
【问题描述】:

我编写了一个非常基本的上传脚本,它使用标准 move_uploaded_file 方法获取文件并上传它,如下所示:

//UPLOAD IMAGE
        $path = "../../clients/$realClient/" . $_FILES["image"]["name"][$x];
        move_uploaded_file($_FILES["image"]["tmp_name"][$x], $path);
        $displayPath = "private/clients/$realClient/" . $_FILES["image"]["name"][$x];       
        mysql_query("INSERT INTO images VALUES(NULL, '$displayPath', '$client', '$project', '$newWeight')") or die("Unable to Insert Image - Please Try Again");
        echo "File Successfully Uploaded<br />";

此上传脚本适用于大多数用途。这是我的问题:

我有一个标准的共享主机包,所以有时当用户尝试上传一个需要五分钟以上才能上传的文件(比如视频或其他一些高分辨率媒体)时,服务器会超时。托管公司表示,由于它是共享托管服务器,他们不愿意为我增加超时限制。

是否有更高效的上传脚本可以让文件在五分钟内上传完毕,或者您是否可以提出替代方案?

干杯, 丹

【问题讨论】:

  • 哈,干杯,但不幸的是,这是我的工作,不是我自己的责任,他们不会切换
  • 这可能会让你陷入困境,因为你可能没有办法解决这个问题。

标签: php file-upload upload timeout


【解决方案1】:

PHP 脚本在上传完成后运行;因此,如果在上传期间出现超时,您将无法在脚本中执行任何操作(因为它根本不会运行)。

如果在脚本期间发生超时,您可以将其拆分为多个部分 - 让第一个脚本存储上传的文件,并将 HTTP 重定向到另一个脚本,这将完成处理和数据库工作。在您显示的脚本中,处理似乎很简单,不确定拆分 that 是否会有所帮助。

假设您只展示一个简化版本:

script1.php

    // upload is complete
    $fname= basename($_FILES["image"]["name"][$x]); //prevent directory traversal
    $uniqid = uniqid("",true);
    $path = "../../clients/$realClient/temporary/" . $uniqid . '/' . $fname;
    // move to temporary location and redirect
    move_uploaded_file($_FILES["image"]["tmp_name"][$x], $path);
    header('Location: /script2.php?file=' . $uniqid . '/' . $fname);

script2.php

    $path = $_GET['file'];
    $uniqid = basename(dirname($path));
    $fname = basename($path);
    $temp_path = "../../clients/$realClient/temporary/" . $uniqid . '/' . $fname;
    $final_path = "../../clients/$realClient/" . $fname;
    move($temp_path,$final_path);

    // do whatever processing is necessary
    mysql_query("INSERT INTO images VALUES(NULL, '$displayPath', '$client', '$project', '$newWeight')") or die("Unable to Insert Image - Please Try Again");
    echo "File Successfully Uploaded<br />";

【讨论】:

  • 我该怎么做?
  • @Daniel Hanly:将其添加到答案中。
  • 感谢您的解决方案。我会接受你的回答,但我也明白这可能不会节省太多时间,因为:就像你说的 PHP 在文件上传后运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 2012-08-04
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多