Lorsqu'ils traitent du téléchargement et de l'enregistrement d'images distantes, les développeurs PHP sont souvent confrontés au problème de la vitesse d'économie lente. Pour améliorer les performances, cet article introduira trois solutions d'optimisation efficaces qui conviennent à la plupart des scénarios de projet pratiques.
L'utilisation du multi-threading peut considérablement améliorer la vitesse de téléchargement et d'enregistrement de plusieurs images. Voici un exemple de code pour l'utilisation de Curl_Multi pour implémenter le téléchargement simultané d'images:
<?php
function downloadImages($urls, $savePath)
{
$mh = curl_multi_init();
$handles = [];
foreach ($urls as $i => $url) {
$ch = curl_init($url);
$filename = $savePath . 'image' . $i . '.jpg';
$fp = fopen($filename, 'w');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
$handles[$i] = ['ch' => $ch, 'fp' => $fp];
curl_multi_add_handle($mh, $ch);
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
foreach ($handles as $handle) {
curl_multi_remove_handle($mh, $handle['ch']);
curl_close($handle['ch']);
fclose($handle['fp']);
}
curl_multi_close($mh);
}
$urls = [
'http://example.com/image1.jpg',
'http://example.com/image2.jpg',
'http://example.com/image3.jpg'
];
$savePath = '/path/to/save/';
downloadImages($urls, $savePath);
En chargeant d'abord le contenu de l'image distante en mémoire, puis en écrivant dans le système de fichiers, les opérations d'E / S de disque peuvent être réduites et la vitesse de stockage peut être accélérée. Ce qui suit est le code d'implémentation:
<?php
function saveImage($url, $savePath)
{
$data = file_get_contents($url);
if ($data) {
$filename = $savePath . basename($url);
return file_put_contents($filename, $data);
}
return false;
}
$url = 'http://example.com/image.jpg';
$savePath = '/path/to/save/';
saveImage($url, $savePath);
L'utilisation de l'extension Curl convient plus aux scénarios de concurrence élevés que File_get_Contents , et peut également apporter une efficacité de demande de réseau plus élevée:
<?php
function saveImage($url, $savePath)
{
$ch = curl_init($url);
$fp = fopen($savePath, 'w');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
$result = curl_exec($ch);
curl_close($ch);
fclose($fp);
return $result;
}
$url = 'http://example.com/image.jpg';
$savePath = '/path/to/save/image.jpg';
saveImage($url, $savePath);
Les trois méthodes ci-dessus respectivement commencent à partir des outils multi-threading, d'optimisation de la mémoire et d'expansion, offrant à PHP une solution d'accélération pratique lors de l'enregistrement des images distantes. Les développeurs peuvent choisir la méthode la plus appropriée basée sur le scénario réel pour améliorer l'efficacité de la réponse du programme et l'expérience utilisateur.