2010-10-15 7 views
2

ive a rencontré un problème lors de la création d'un script telnet PHP au travail pour collecter des données réseau. Comme la quantité de données renvoyées par la commande 'Action: Status' peut être de n'importe quelle taille ... im préoccupé par l'utilisation d'un nombre statique avec fread() sur la ligne 13. J'ai également essayé d'utiliser fgets() à la place mais il n'atteint que la première ligne de données (la ligne META HTTP ... sans la table). comment puis-je saisir une quantité arbitraire de données de la socket en utilisant PHP? s'il vous plaît aiderProblème PHP fread

<?php 
$ami = fsockopen("192.100.100.180", 5038, $errno, $errstr); 

if (!$ami) { 
echo "ERROR: $errno - $errstr<br />\n"; 
} else { 

    fwrite($ami, "Action: Login\r\nUsername: 1005\r\nSecret: password\r\nEvents: off\r\n\r\n"); 

    fwrite($ami, "Action: Status\r\n\r\n"); 
    sleep(1); 

    $record = fread($ami,9999);#this line could over run!!! 
    $record = explode("\r\n", $record); 
    echo "<META HTTP-EQUIV=Refresh CONTENT=\"9\">"; #refresh page every 9 seconds 
    echo "<table border=\"1\">"; 


    foreach($record as $value){ 
     if(!strlen(stristr($value,'Asterisk'))>0 
     && !strlen(stristr($value,'Response'))>0 
     && !strlen(stristr($value,'Message'))>0 
     && !strlen(stristr($value,'Event'))>0 
     && strlen(strpos($value,' '))>0) #remove blank lines 
     php_table($value);; 
    } 

    echo "</table>"; 

    fclose($ami); 
    } 


function php_table($value){ 
     $row1 = true; 
     $value = explode(" ", $value); 
     foreach($value as $field){ 
      if($row1){ 
       echo "<tr><td>".$field."</td>"; 
       $row1 = false; 
      } 
      else{ 
       echo "<td>".$field."</td></tr>"; 
       $row1 = true; 
      } 
     } 
} 

?> 
+0

http://stackoverflow.com/questions/1405457/php-soap-fread-dynamic-post-size avait un problème similaire, cela pourrait aider –

+0

merci phill, j'ai essayé de tester avec les en-têtes, mais le problème a finalement lié à quitter la session ouverte – JB87

Répondre

4
while (strlen($c = fread($fp, 1024)) > 0) { 
    $record .= $c; 
} 

Edit: Votre application se bloque parce qu'il ne fermer la connexion pour signifier la fin d'une requête HTTP. Essayez

fwrite($ami, "Action: Status\r\n\r\n"); 
fwrite($ami, "Connection: Close\r\n\r\n"); 
+0

Beaucoup mieux de vérifier la fin du fichier avec feof() – Cfreak

+0

malheureusement cet exemple de code se bloque aussi – JB87

+0

merci saul, bien que vous soyez correct qu'il ne se bloque plus .. il semble prendre environ 85secs à charger ce qui est trop long pour les spécifications spec .. en fait, la table ne se charge jamais avant la mise à jour de la page (10secs) – JB87

4
$data = ''; 
while (!feof($ami)) { 
    $data .= fread($ami, 1024); 
} 

ou php5

$data = stream_get_contents($ami); 
+0

J'ai essayé les deux méthodes, et tous les deux juste accrochant la lecture 'attendant le localhost' ..... J'ai augmenté ma taille de morceau sur le premier exemple mais il n'a eu aucun effet – JB87

+0

probablement parce que l'extrémité distante ne ferme pas la connexion . Dans ce cas, vous devrez utiliser la variante Fread et déterminer vous-même quand arrêter. –

+0

Je vois ... mais comment puis-je l'arrêter quand il est en train de traiter la connexion en boucle? – JB87

0

Il suffit d'utiliser une boucle et chercher la "fin du fichier"

$record = ''; 
while(!feof($ami)) { 
    $record .= fread($ami,9999); 
} 

Vous devriez probablement envisager d'utiliser des morceaux plus petits.

+0

même avec ces gros morceaux, l'application est maintenant suspendue indéfiniment – JB87

+0

Ok. Comme il se bloque, la télécommande ne ferme pas la connexion. Ce que vous pouvez faire est de vérifier $ record à chaque fois grâce à votre boucle pour voir si vous avez ce que vous cherchez et puis éclater une fois que vous faites. – Cfreak