PHP上传超时:更高效的上传脚本?

时间:2010-09-15 09:27:09

标签: php file-upload upload timeout

我编写了一个非常基本的上传脚本,它接收文件并使用标准的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 />";

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

我有一个标准的共享托管软件包,因此有时当用户尝试上传需要超过五分钟上传的文件(例如视频或其他高分辨率媒体)时,服务器会超时。托管公司说,由于它是一个共享托管服务器,他们不愿意为我增加超时限制。

是否有更高效的上传脚本,允许文件在五分钟内上升,或者是否有可能建议的替代方案?

干杯, 丹

1 个答案:

答案 0 :(得分:2)

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

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

假设您只展示了简化版本:

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 />";