2011-01-28 4 views
3

J'ai un db avec plus de 5 millions de lignes et pour chaque ligne je dois faire un post http à un serveur avec quelques paramètres au taux maximum de 500 connexions. chaque demande de publication prend 12 secondes à traiter. Alors que les anciennes connexions sont terminées, je dois en faire de nouvelles et maintenir une connexion ~ 500. Je dois ensuite mettre à jour la base de données avec les valeurs renvoyées à partir de ces appels Web. Comment créer les appels Web comme indiqué ci-dessus?appels Web asynchrones php

Mon application est en PHP. Puis-je utiliser PHP ou devrais-je passer à autre chose pour cela.

+0

Regardez ce post http://stackoverflow.com/a/13690590/599993 – jzafrilla

Répondre

1

PHP n'est pas le bon outil pour faire des scripts de longue durée, car il a par défaut un temps d'exécution maximum qui est assez court. Vous pourriez envisager d'utiliser python pour cette tâche. Notez également que vous pouvez appeler des scripts externes de PHP (tels que des scripts python) en utilisant la fonction system(), si la seule raison pour laquelle vous utilisez PHP est de faciliter l'intégration d'une interface web. Cependant, vous [b] pouvez [/ b] le faire en php avec un cron-job en ayant simplement votre script php qui ne gère qu'une seule ligne à la fois, et le cron-job appelle le script php à chaque fois seconde. Maintenez simplement l'index dans la table ailleurs (soit ailleurs dans la base de données ou écrivez simplement le nombre dans un fichier)

Si vous souhaitez saturer votre limite de connexion 500, faites que votre script fasse 40 lignes à la fois. 40 lignes/seconde est d'environ 500 lignes/12 secondes

+2

Pour ajouter à cela: la valeur par défaut 'max_execution_time' pour PHP en tant que module de serveur Web est de 30 secondes, je crois. La valeur par défaut pour PHP CLI (programme de ligne de commande autonome) n'est pas une limite, car la définition d'une limite serait assez gênante pour les tâches non Web. Cependant, les limites de mémoire par défaut s'appliqueraient toujours à PHP CLI, ce qui est quelque chose à garder à l'esprit si vous maintenez 500 connexions de ressources simultanées. – Wiseguy

2

En fait, vous pouvez certainement le faire avec PHP en utilisant une technique appelée interrogation longue. Fondamentalement comment cela fonctionne est la machine cliente pings le serveur et dit "Avez-vous quelque chose pour moi" et le serveur voit que ce n'est pas le cas. Au lieu de répondre, il tient sur la demande et répond quand il a quelque chose à envoyer.

La relève longue est une méthode utilisée à la fois par DrupalChat et par le projet APE (AJAX Push Engine). http://drupal.org/project/drupalchat
http://www.ape-project.org/

Voici quelques informations supplémentaires sur la poussée tech: http://en.wikipedia.org/wiki/Push_technology et http://en.wikipedia.org/wiki/Comet_%28programming%29

Et voici un post stackoverflow à ce sujet: How do I implement basic "Long Polling"?

Maintenant, je dois dire que 12 secondes est vraiment dang long pour qu'une requête DB s'exécute. Il semble que soit la requête doit être optimisée, soit la base de données (ou les deux). Avez-vous normalisé la base de données et mis en place une bonne table et une indexation inter-tables? Maintenant, pour ce qui est de la prévention des collisions de mise à jour DB, vous devez utiliser des transactions (que PostGres et les versions plus récentes de MySQL proposent avec la plupart des systèmes DB d'entreprise). Les transactions vous permettront d'annuler les changements de db et de réserver les ID de table et des choses comme ça. http://en.wikipedia.org/wiki/Database_transaction

Questions connexes