Celui-ci semble assez simple, et il l'est. Tout ce que vous avez à faire pour télécharger un fichier sur votre serveur est :
file_put_contents("Tmpfile.zip", file_get_contents("http://someurl/file.zip"));
Mais il y a un problème. Que faire si vous avez un gros fichier, comme 100mb. Dans ce cas, vous manquerez de mémoire et ne pourrez pas télécharger le fichier.
Ce que je veux, c'est un moyen d'écrire le fichier sur le disque pendant que je le télécharge. De cette façon, je peux télécharger de plus gros fichiers, sans avoir de problèmes de mémoire.
Depuis PHP 5.1.0, file_put_contents()
supporte l'écriture pièce par pièce en passant un stream-handle comme paramètre $data
:
file_put_contents("Tmpfile.zip", fopen("http://someurl/file.zip", 'r'));
Extrait du manuel :
Si data [qui est le second argument] est une ressource de flux, le tampon restant de ce flux sera copié dans le fichier spécifié. Ceci est similaire à l'utilisation de
stream_copy_to_stream()
.
(Merci à [Hakre][1].)
private function downloadFile($url, $path)
{
$newfname = $path;
$file = fopen ($url, 'rb');
if ($file) {
$newf = fopen ($newfname, 'wb');
if ($newf) {
while(!feof($file)) {
fwrite($newf, fread($file, 1024 * 8), 1024 * 8);
}
}
}
if ($file) {
fclose($file);
}
if ($newf) {
fclose($newf);
}
}
Essayez d'utiliser cURL
set_time_limit(0); // unlimited max execution time
$options = array(
CURLOPT_FILE => '/path/to/download/the/file/to.zip',
CURLOPT_TIMEOUT => 28800, // set this to 8 hours so we dont timeout on big files
CURLOPT_URL => 'http://remoteserver.com/path/to/big/file.zip',
);
$ch = curl_init();
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
Je ne suis pas sûr mais je crois qu'avec l'option CURLOPT_FILE
, l'écriture se fait au fur et à mesure de l'extraction des données, c'est-à-dire sans mise en mémoire tampon.