0

$fpを使用して開かれたファイルポインタに書き込むための次の PHP コードがありますfsockopen

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

ところで。fwriteis0と notの戻り値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 サーバーを使用しています

4

1 に答える 1

1

これを試して

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ループが問題だったと思いますが、想定どおりに真に戻らなかったなどです。

いつ書き込みが停止するかを確認します

于 2010-07-22T14:23:09.540 に答える