PHP fwrite прекращает запись в указатель файла сокета - PullRequest
0 голосов
/ 22 июля 2010

У меня есть следующий код PHP для записи в указатель файла $fp, который был открыт с помощью 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

кстати. возвращаемое значение 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

1 Ответ

0 голосов
/ 22 июля 2010

Попробуйте это

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, как предполагалось, тоже, и т. Д.

Посмотри когда он перестанет писать

...