2011-11-10 4 views
3

Possible en double:
Super fast getimagesize in phpalternative efficace à getimagesize() en php

Je veux obtenir la taille d'image de toutes les images dans les pages Web (d'où toutes les balises img)

Le problème est la fonction getimagesize() de PHP est si inefficace.

J'ai essayé de courir ce ...

for($i=0;$i<55;$i++){ 
    getimagesize('http://www.blackcommentator.com/265/265_images/265_cartoon_do_something_now_bill_large.jpg'); 
} 

..et il a fallu très longtemps pour compléter.

Je me demande si quelqu'un connaît une alternative plus efficace à getimagesize() afin d'obtenir les tailles d'images dans une page Web en utilisant PHP quand il est typique d'obtenir les tailles de 20-30 images.

+2

J'imagine qu'il s'agit d'une limitation Web (c'est-à-dire que l'aller-retour pour saisir réellement l'image prend plus de temps que de calculer sa taille). Vous pourriez vouloir comparer ceci sur une image qui est sur le serveur à partir duquel vous exécutez le code. –

+0

pas vraiment, le but est à peu près d'obtenir toutes les images dans une seule page Web, et clairement, il ne faut pas longtemps pour télécharger ces images sinon toutes les pages Web seront lentes .... même quand je prenais simplement tous les tags img de disons cnn.com et calculez leur taille d'image, cela prendra encore longtemps, même si cnn.com ainsi que toutes ses images se chargent en quelques secondes si vous allez simplement sur cnn.com –

+0

et cnn.com probablement a un bien meilleur CDN que blackcommentator.com. À l'heure actuelle, il y a 84 images utilisées sur la page d'accueil de CNN.com, mais elles ne sont pas toutes des jpeg non optimisés de 400 x 400. Essayez un benchmarking combien de temps cela prend pour faire un 'file_get_contents()' sur l'image. Je serais surpris si la plupart du temps de votre benchmark d'origine n'est pas consommé par le téléchargement. –

Répondre

6

Utilisez curl pour enregistrer les images, mais exécuter les curl demandes en parallèle - cette façon, il se charge beaucoup plus rapide (le goulot d'étranglement n'est pas la bande passante, il est le temps de demande l'établissement, donc cela aidera). Une fois que vous avez enregistré les images dans un répertoire local, , puis exécutez getimagesize() sur chacune d'elles.

+0

une idée sur quelles commandes curl va accomplir cela? (en php) –

+1

Commencez ici: http://us.php.net/curl-multi-init –

+0

@FrankFarmer Je ne savais pas à ce sujet, merci! – Tim

0

Pour commencer, mettez l'image en cache localement. Vous le transportez sur le réseau 55 fois. Les frais généraux de téléchargement de l'image l'emportent largement sur le temps passé à trouver sa largeur et sa hauteur.

Si vous parlez de trouver la taille de 55 différentes images, vous pourriez envisager de paralléliser votre code. Vous passez probablement autant de temps à établir des connexions que vous transférez des données réelles, et puisque le téléchargement d'une image à la fois est probablement loin de saturer votre connexion Internet, vous pouvez littéralement doubler vos performances en exécutant deux processus simultanés. Continuez à augmenter la concurrence jusqu'à ce que vous cessiez de voir les gains de performance.

+0

ye mais même avec 55 images différentes (d'où le téléchargement est un must) il est encore lent ... ce code ci-dessus est juste un exemple et ne signifie rien vraiment –

+1

Il n'y a aucun moyen. Vous récupérez les images sur le réseau, c'est le * réseau * qui est lent. Si vous ne pouvez pas obtenir les images localement, vous ne pouvez pas vous empêcher d'installer une connexion Internet plus rapide. – meagar