Тайм-ауты загрузки PHP: более эффективный сценарий загрузки? - PullRequest
3 голосов
/ 15 сентября 2010

Я написал довольно простой скрипт загрузки, который берет файл и загружает его, используя стандартный метод 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 Ответ

2 голосов
/ 15 сентября 2010

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