J'utilise Curl pour obtenir des données de rang sur plus de 20 000 noms de domaine que j'ai stockés dans une base de données.
Le code que j'utilise est http: / /semlabs.co.uk/journal/Object-Oriented-Curl-class-with-Multi-Troits . P>
Le tableau $ CurryQuests est de 20 000 demandes à Comete.com API pour les classements de sites Web. P>
Ceci est un exemple de demande: http://apps.cpete.com /sites/sites/stactverflow.com/trendue/rank/?apikey=xxxx&start_date=201207&end_date=201208&jsonp= "; p>
Comme il y a 20 000 de ces demandes, je veux les briser en morceaux de sorte que je veux 'M Utilisation du code suivant pour accomplir que: P>
foreach(array_chunk($competeRequests, 1000) as $requests) { foreach($requests as $request) { $curl->addSession( $request, $opts ); } }
4 Réponses :
Mettez ceci en haut de votre script PHP: qui désactiverait tout la mise en cache du serveur Web ou de PHP, ce qui rendra votre sortie à être affichée sur le navigateur pendant que le script est en cours d'exécution. p> Faites attention au commentaire de la ligne Mise à jour pour nginx: Strong> P> SO OP utilise nginx, qui rend les choses un peu plus difficiles que Nginx ne laisse pas désactiver la compréhension Gzip de PHP. J'utilise aussi Nginx et je viens de découvrir que je l'ai actif par défaut, voir: p> de sorte que vous devez désactiver gzip sur nginx.conf et redémarrer nginx: P > ou vous pouvez jouer avec le gzip_disable ou gzip_types options, pour désactiver conditionnellement Gzip Pour certains navigateurs ou pour certains types de contenu de page respectivement. p> p> Apache_Setenv CODE> Si vous utilisez NGinx Web Server au lieu d'Apache. P>
/etc/init.d/nginx redémarrez code> p>
a commenté que la ligne sorti-là, mais il semble que cela ne produisait toujours pas de résultats tant que le script n'est pas effectué à l'exécution de chaque domaines au lieu de chaque lot
ouais vient de confirmer que cela ne produisait rien avant la fin de la fin une fois que le script ait terminé les 20 000.
Avez-vous des idées pour un meilleur traitement plus efficace? Fondamentalement, ma base de données contient 20 000 domaines et requêtes Comete.com en utilisant leur API pour obtenir le rang, puis écrit les rangs à la base de données. En fin de compte, je souhaite planifier le script pour courir chaque mois automatiquement, alors j'espérais éviter JavaScript ou tout autre script du côté client.
Voir ma Mise à jour NGinx B> ci-dessus pour voir si la désactivation GZIP le fait fonctionner pour votre cas.
À quiconque, nous devons faire des appels AJAX de JS pour résoudre que ^ Désactivation de la mise en cache est une mauvaise idée, disons que quelqu'un ouvre quelques milliers de demandes HTTP, et le serveur s'effondrera, car il va échanger jusqu'à la limite.
https://github.com/krakjoe/pthreads p>
p>
Vous pouvez filer en PHP, le code représenté est simplement une programmation horrible du fil, et je ne conseille pas que c'est ainsi que vous le faites, mais je voulais vous montrer les frais généraux de 20 000 threads ... c'est 18 secondes, sur mon Matériel actuel qui est un Intel G620 (Dual Core) avec 8gigs de RAM, sur le matériel du serveur, vous pouvez vous attendre à de nombreux résultats plus rapides ... comment vous enfoncez une telle tâche dépend de vos ressources et des ressources du service que vous demandez. .. p>
La "programmation" elle-même va bien - c'est l'absence totale de la queue d'exécution de la planification threads i> qui rend ce script inefficace. En général, un bon planificateur ne doit jamais permettre plus de insérer la quantité de cœurs de la CPU ici code> à exécuter simultanément, à l'exception des machines avec HT et des threads qui ont extrêmement
attendre code> et il devrait être capable de la queue b> au moins 2 ^ 32 fils
Celui-ci fait toujours le travail pour moi ... https://github.com/petewarden/ParallelCurl a> p>
Une partie importante du code parallelcurl est la bugfix pour curl_multi_select ( bugs.php.net/bug .php? id = 63411 ) pour PHP 5.3.18+ à partir de la ligne 118 à ParallelCurl.php, qui était probablement la solution que l'OP recherchait (et quelqu'un d'autre avec des scripts curl_multi cassés)
Cette réponse est obsolète et la réponse correcte est PHP.net/manual/fr /function.curl-multitiit.php
La réponse acceptée ci-dessus est obsolète, la réponse correcte doit donc être évitée. P>
http://php.net/manual/fr/function .Curl-Multi-init.php P>
Maintenant, PHP prend en charge la récupération de plusieurs URL en même temps. P>
La bonne réponse est celle que j'ai donnée à l'époque. Il n'est pas nécessaire de corriger les anciennes questions à suivre pour suivre la science et le développement. À l'époque, c'était la réponse. Vous ne savez pas si quelqu'un utilise des anciennes versions PHP ou non, elle est possible qu'ils sont. Ne supposez pas que tout le monde court le dernier. Si vous réclamez un certain support sur PHP, vous devez également mentionner la version dont vous parlez.
Devez-vous exécuter ce script via votre serveur, vous ne pouvez pas simplement l'exécuter manuellement? ... 20 000 demandes est de nombreuses demandes, cela devra probablement fonctionner à l'arrière-plan
Je voulais courir comme un travail cron éventuellement .. Pour maintenant, je l'exécute maintenant dans le navigateur ..
php.net/manual/fr/funcunk.Curl-multiti-init. php
J'utilise déjà CURL MULTI ... "Le code im en utilisant est Semlabs.co.uk/journal/... ."