2010-12-05 21 views
0

J'essaie de tester mon script PHP qui crée 48 poignées multiples cURL, contenant chacune environ 1500 requêtes, toutes exécutées en parallèle. J'essaye de m'assurer que toutes les demandes sont réellement envoyées, et pour ce faire, j'enregistre les demandes sur mon serveur. Voici mon dump.php, que je fais des demandes de, avec mon script, et il enregistrera la demande d'un fichier:Demandes de connexion rapide

<?php 
ob_start(); 
echo $_SERVER["REQUEST_URI"]; 
$dump = ob_get_clean(); 
$log = "dump.txt"; 
$fh = fopen($log, 'a') or die("can't open file"); 
fwrite($fh, $dump . "\r\n\r\n"); 
fclose($fh); 

echo "Dump Completed"; 
?> 

Cependant, il y a un léger problème de mon quad core PC étant capable de tirer hors de ces demandes au rythme d'environ 1500 toutes les 10 secondes, et probablement surcharger mon serveur car il essaie d'ouvrir le fichier en même temps. J'ai mis un délai de 0.1 secondes entre l'envoi de chaque demande, mais mon serveur, je pense ne peut toujours pas ouvrir le fichier, vider le texte, et le fermer avant que la prochaine demande arrive. En conséquence, mon fichier PHP dit qu'environ 72k demandes ont été envoyées, mais mon serveur dit que seulement 14k ont ​​été reçues. Cela peut être dû au fait que mon programme PHP a surchargé mon PC, ou le système de port, et que certaines demandes n'ont jamais été envoyées avec succès, ou que mon serveur n'est pas assez rapide pour gérer 150 requêtes par seconde.

Toutes les solutions possibles pour tenter de savoir en toute sécurité que toutes mes demandes ont été envoyées? Lorsque mon client utilise le script, il est impératif qu'au moins 99,5% des demandes soient réellement envoyées, et que son serveur soit assez puissant pour gérer cela sans problème. Je ne peux pas le tester sur ses serveurs pour des raisons de sécurité, mais le mien n'est pas assez puissant pour que je puisse simuler les conditions de travail.

+0

Juste une note rapide - Stocker les données dans un fichier plat (surtout s'il s'agit d'un seul fichier plat) peut vous causer des problèmes lorsque vous gérez des requêtes simultanées. C'est un goulot d'étranglement. Si vous avez besoin d'enregistrer des données dans un magasin central, pensez à utiliser une base de données (qui peut gérer les écritures simultanées). Comment mesurez-vous le nombre de pageloads réels? –

Répondre

0

Idéalement, j'écrirais ces valeurs dans un cache de clé tel que l'instance memcached, puis finalement dans un fichier de base de données/plat avec un script monothread. Cela vous donnera la vitesse de pouvoir suivre les demandes, ainsi que la possibilité de stocker les données sur le disque. Cela dit, il suffit d'utiliser une base de données comme solution de contournement rapide.

0

Une base de données est certainement la meilleure option ici si vous avez besoin d'informations complexes sur les demandes. Si tout ce qui vous intéresse, c'est le nombre, je recommande un compteur Membase (http://www.membase.org/downloads), en utilisant l'opération d'ajout atomique de Memcache (http://php.net/manual/fr/index.php?lang=fr) /memcache.add.php)