2009-09-23 11 views
1

J'ai une application client PHP qui s'interface avec un serveur RESTful. Chaque instance de PHP Goat sur le client doit s'initialiser en fonction des informations contenues dans une requête/goat sur le serveur (par exemple/goat/35,/goat/36, etc.). Il le fait en envoyant une requête HTTP à son URL correspondante via cURL. Travailler avec plus de 30 objets de chèvre par chargement de page équivaut à plus de 30 requêtes HTTP, et chacune prend 0,25 seconde - c'est baaaad, comme le diraient mes chèvres. Le chargement paresseux et la mise en cache des réponses en mémoire sont utiles, mais pas suffisants. L'avantage de cette technique est que mes chèvres sont toutes intelligentes et encapsulées. C'est un avantage de cette technique. L'inconvénient est que la performance est horrible. Les chèvres ne savent pas faire la queue de leurs requêtes HTTP, une chèvre ne sait pas si d'autres chèvres doivent lancer une requête, etc. Je suppose qu'une alternative serait de construire les chèvres à l'extérieur:Requêtes HTTP non bloquantes en PHP orienté objet?

$urls = array('http://', 'http://', ...); // array of goat URLs 
$result = fancy_pipelined_http_request_queue($urls); 
foreach ($result as $xml) { 
    $goat->buildSelfFromXML($xml); 
} 

Je suis sûr que c'est un dilemme OO/REST bien connu qu'il existe des moyens plus avancés de résolution, je ne sais pas où chercher. Des idées?

+1

Je suis toujours intéressé par les conseils, mais en attendant, vérifiez cela. Chaque chèvre utilisait sa propre poignée de boucle comme variable privée. En tant que test, je l'ai rendu statique à la place (donc une poignée pourrait être partagée entre toutes les chèvres) et la page qui prenait 8 secondes à charger prend maintenant 0.9. Je pensais que tout cela était dû à la latence de la requête HTTP ... – alexantd

+0

@alexantd, comme toujours, le profil en premier, blame second :) – vava

+0

Similaire/Dublicate: http://stackoverflow.com/questions/1432477/can-php-asynchronously- utilisation-prises –

Répondre

1

Vous pouvez utiliser des sockets non bloquantes si vous le souhaitez. Cela implique un peu de codage pour passer à eux comme vous aurez besoin de virer de côté. Mais cela peut améliorer les performances car vous serez en mesure d'effectuer des requêtes simultanément.

Voir socket_set_blocking/stream_set_blocking fonctions.