2010-09-15 20 views
3

J'ai écrit un script d'upload assez basique qui prend le fichier et le télécharge en utilisant la méthode standard de move_uploaded_file que vous voyez ci-dessous:Temporisations de téléchargement PHP: script de téléchargement plus efficace?

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

Ce script de téléchargement fonctionne parfaitement pour la plupart des buts. Voici mon numéro:

J'ai un forfait d'hébergement mutualisé standard, donc parfois lorsque l'utilisateur essaie de télécharger un fichier qui prend plus de cinq minutes à télécharger (par exemple une vidéo ou un autre média haute résolution), le serveur expire. La société d'hébergement a déclaré que comme il s'agit d'un serveur d'hébergement partagé, ils ne sont pas disposés à augmenter la limite de temps d'attente pour moi. Y a-t-il un script de téléchargement plus efficace qui permettra aux fichiers de remonter en moins de cinq minutes ou y a-t-il une alternative que vous pourriez suggérer?

Cheers, Dan

+0

Obtenir un nouveau forfait d'hébergement. –

+0

Ha, bravo, mais malheureusement, c'est la responsabilité de mon travail, pas la mienne, et ils ne vont pas changer –

+0

Cela peut vous mettre entre une roche et un endroit difficile, comme vous ne pouvez pas avoir un moyen de résoudre ce problème. – Piskvor

Répondre

2

Le script PHP est exécuté après le téléchargement terminé; donc s'il y a un timeout pendant le téléchargement, il n'y a rien que vous puissiez faire dans le script (car il ne sera pas exécuté du tout). Si le délai d'attente se produit pendant le script, vous pouvez le diviser en plusieurs parties: le premier script doit simplement stocker le fichier téléchargé et la redirection HTTP vers un autre, qui effectuera le traitement et la base de données. Dans le script que vous montrez, le traitement semble assez simple, pas sûr si la division que aiderait.

En supposant que vous montrant juste une version simplifiée:

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

Comment ferais-je cela? –

+0

@ Daniel Hanly: ajouté que dans la réponse. – Piskvor

+0

Nous vous remercions de votre solution. Je vais accepter votre réponse, mais je comprends aussi que cela peut ne pas raser autant de temps à cause de: comme vous l'avez dit, le PHP est exécuté après le téléchargement du fichier. –