2010-07-22 101 views
0

我有写一个文件指针$fp这是使用fsockopen打开下面的PHP代码:PHP的fwrite的停止写入套接字文件指针

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(); 
} 

此代码工作正常只要$buf尺寸小足够。大量的数据不能完全写入。我得到以下输出:

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

btw。 fwrite的返回值是0而不是false

有没有人有一个想法可能是什么问题?非常感谢您的回答

在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 

我只是闻闻TCP流,我想通了,我得到一个

HTTP/1.1 413 Request Entity Too Large 

有没有解决这个问题?我使用的lighttpd/1.4.22服务器

+0

删除fwrite之前的@,它几乎肯定会打印出具有相关细节的警告。 – nothrow 2010-07-22 13:12:33

+0

fwrite不会产生任何警告。返回值是0而不是false,这意味着该命令没有失败,但没有写入任何字节(根据文档) – 2010-07-22 13:24:19

+0

我现在把error_reporting(E_ALL)放在我的代码前面,我得到以下通知: ():发送8192字节失败,errno = 104在第10行的/root/test.php中由对等端重置连接 注意:fwrite():发送8192字节失败,errno = 32中断管道在/root/test.php在线10 我很高兴为任何翻译:) ...但为什么fwrite的返回值不是false? – 2010-07-22 15:42:46

回答

0

尝试就像是想得等这个

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); 

我相信你的while循环是问题之前,并没有返回true ..

见当它停止写入时

+0

感谢您的回复,但我在这里得到了同样的结果。当我在do之后打印$字节时,虽然我像之前一样获得了像11096这样的东西 – 2010-07-22 15:15:01

+0

您可以发布更多代码,即$ fp = fsockopen部分吗?你可以编辑出服务器名称等等,但需要看看你在做什么,因为这应该工作。 对于我发布的那个,它对“写入:xx”行有什么意义,多于1个? – 2010-07-22 17:18:57

+0

确定现在阅读您的编辑和评论:D,您可以发布您的fsock命令,需要查看您正在打开的内容以及您要发送的标题类型。再次,你可以去掉任何敏感的东西。 – 2010-07-22 17:33:10