2017-10-11 11 views
0

J'ai actuellement un script qui utilise curl pour vérifier la taille du fichier d'environ 3000 images chaque fois qu'un utilisateur visite la page .. c'est parce que chaque fois que le contenu pourrait changer.PHP quelque chose de plus rapide que curl pour vérifier la taille du fichier d'image à distance environ 3000 fois?

Si elle correspond à la taille de 7442 octets, elle modifie le chemin de l'image, si ce n'est pas le cas, conserve sa source. L'URL de l'image est stockée sur $ variable, mysql, et à la fois le fichier xml distant et local. Mais l'image est toujours stockée à distance.

$image = 'http://remoteserver.com/user22.jpg'; 
//Check if all thumbs are ok real and available 
$ch = curl_init($image); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_HEADER, TRUE); 
curl_setopt($ch, CURLOPT_NOBODY, TRUE); 

$data = curl_exec($ch); 
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 
curl_close($ch); 
if($size == 7442){ 
    echo '<img src="https://www.newdomain.com/tmp.jpg" height="190.11"/></a>'; 
} else { 
    echo '<img src="' . $image . '" alt="' . $user . '" /></a>'; 
} 

Quand il est activé la page prend environ 40 secondes pour charger, quand il a commenté, il faut 3 secondes. Mais il est exécuté chaque fois qu'un utilisateur visite la page web ou si j'exécute curl avant d'ajouter des données à mysql et change d'adresse dans mysql, cela retarde énormément le chargement de cette information sur mysql et ne montre donc pas toutes les images.

Je sais qu'il y a beaucoup de choses en fonction de cette vérification, des temps de réponse du serveur, de la configuration php, etc. Mais j'ai vraiment besoin de ce fichier d'image pour fonctionner et ne pas avoir besoin de 40 secondes chaque fois qu'un utilisateur visite la page.

Une suggestion/aide? Merci

+3

Exécuter en tant que processus d'arrière-plan, et non dans le cadre d'une requête Web –

+1

Vous pouvez utiliser memcache ou quelque chose pour stocker la collection de redirections d'URL d'image. Un service d'arrière-plan planifié (script PHP) peut être exécuté périodiquement pour vérifier la taille des fichiers et ajouter les URL redirigées à memcache. Vous obtenez l'URL de l'image pour une fonction qui regarde dans memcache et renvoie la clé si elle est trouvée ou retourne l'URL d'origine si ce n'est pas le cas. – jcorry

+0

Merci Mark Baker et Jcorry. Les URL d'origine sont en fait stockées dans mysql, mais seulement l'url, pas d'information sur la taille. Cela permettrait de bannir le besoin de memcache? –

Répondre

0

Comme d'autres l'ont suggéré dans les commentaires, je voudrais créer un processus en arrière-plan pour vérifier la taille des fichiers et mettre à jour mysql complètement séparé de la demande de la page. C'est beaucoup plus efficace si plusieurs utilisateurs demandent les mêmes images. Toutefois, si le chargement de la page doit vraiment être effectué, une autre option pour améliorer l'expérience utilisateur consiste à effectuer la vérification à partir du navigateur. Chargez la page avec les chemins d'image stockés, puis utilisez JS pour demander la taille des fichiers et modifier les chemins d'image si nécessaire. Par exemple.

var images = document.getElementsByTagName('img'); 
for(var i = 0; i < images.length; i++) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("HEAD", images[i].src, true); 
    xhr.onreadystatechange = function() { 
     if (this.readyState == this.DONE) { 
      if (parseInt(xhr.getResponseHeader("Content-Length"))) === 7442) { 
       images[i].src = 'https://www...'; // New path 
      } 
     } 
    }; 
    xhr.send(); 
} 

(non testé, mais vous voyez l'idée. Adapté de another SO answer.)

Alors quand tout fait, vous pouvez faire un AJAX POST à ​​votre application Web pour mettre à jour MySQL si nécessaire. Gardez également à l'esprit que cela tentera de faire de nombreuses demandes simultanées au serveur hébergeant les images, ce qui pourrait avoir un impact sur les performances.

+0

Merci Matt, je vais essayer avec Javascript/Ajax, puisque avec la boucle tout semble décrocher, ce pourrait être la meilleure option. Va dire quelque chose a.s.a.p. –