2010-07-22 1 views
0

J'ai le code PHP ci-dessous pour écrire à un filepointer $fp qui a été ouvert à l'aide fsockopen:de fwrite PHP cesse d'écrire à un pointeur de fichier socket

syslog(LOG_INFO, "Write " . strlen($buf) . " bytes to socket:"); 

$bytes = 0; 
while ($bytes < strlen($buf) && ($w = @fwrite($fp, substr($buf, $bytes)))) 
{ 
    syslog(LOG_INFO, " - " . $w . " bytes written to socket"); 
    $bytes += $w; 
} 

if ($bytes != strlen($buf)) 
{ 
    syslog(LOG_INFO, "error while writing to socket"); 
    exit(); 
} 

Ce code fonctionne bien aussi longtemps que la taille de $buf est petite assez. Une grande quantité de données ne peut pas être écrite complètement. Je reçois la sortie suivante:

Write 4900360 bytes to socket: 
    - 11096 bytes written to socket 
error while writing to socket 

btw. la valeur de retour de fwrite est 0 et non false.

Est-ce que quelqu'un a une idée de ce qui pourrait être le problème? Merci beaucoup pour vos réponses

Je reçois les avis suivants lors du retrait du @ devant la fwrite:

Notice: fwrite(): send of 8192 bytes failed with errno=104 Connection reset by peer in /root/test.php on line 10 

Notice: fwrite(): send of 8192 bytes failed with errno=32 Broken pipe in /root/test.php on line 10 

Je viens renifla le flux TCP et je compris, que je reçois un

HTTP/1.1 413 Request Entity Too Large 

Y at-il une solution à ce problème? J'utilise un lighttpd/1.4.22 serveur

+0

supprimer le @ avant fwrite, il imprimera presque sûrement l'avertissement avec les détails pertinents. – nothrow

+0

fwrite ne génère aucun avertissement. la valeur retournée est 0 et non fausse, ce qui signifie que la commande n'a pas échoué mais n'a pas écrit d'octets (selon la documentation) –

+0

Je place maintenant error_reporting (E_ALL) devant mon code, et j'obtiens les notifications suivantes: Remarque: fwrite(): l'envoi de 8192 octets a échoué avec errno = 104 Connexion réinitialisée par l'homologue dans /root/test.php sur la ligne 10 Remarque: fwrite(): l'envoi de 8192 octets a échoué avec errno = 32 Broken pipe dans /root/test.php sur la ligne 10 Im heureux pour toutes les traductions :) ... mais pourquoi la valeur de retour de fwrite n'est pas fausse? –

Répondre

0

Essayez cette

syslog(LOG_INFO, "Write " . strlen($buf) . " bytes to socket:"); 

$bytes = 0; 
do 
{ 
    $w = fwrite($fp, substr($buf, $bytes)); 
    $bytes += $w; 
      syslog(LOG_INFO, "written: ".$w); 
    if ($w === 0) 
    { 
     // end of write 
     break; 
    } 
    if ($w === false) 
    { 
      syslog(LOG_INFO, "error while writing to socket"); 
      exit(); 
    } 
} while (true); 

Je crois que votre boucle while était le problème précédemment, ne retournerait pas vrai, comme il était supposé trop etc ..

Voir quand il arrête d'écrire

+0

Merci pour votre réponse, mais j'obtiens le même résultat ici. Quand j'imprime $ octets après le do ... alors que je reçois quelque chose comme 11096 comme avant –

+0

Pouvez-vous poster plus de votre code, c'est-à-dire la partie $ fp = fsockopen? Vous pouvez éditer le nom du serveur etc ... mais vous devez voir ce que vous faites car cela devrait fonctionner. Et pour celui que j'ai posté, que dit-il pour les lignes "écrites: xx", plus de 1 d'entre elles? –

+0

Ok, lisez vos modifications et commentaires maintenant: D, pouvez-vous poster votre commande fsock, besoin de voir ce que vous ouvrez et quel genre d'en-têtes vous envoyez. encore une fois, vous pouvez enlever tout ce qui est sensible. –

Questions connexes