Ошибка PHP fsockopen началась после обновления до Windows Server 2016 - PullRequest
0 голосов
/ 12 апреля 2019

Я работаю с двумя серверами, которые отправляют данные друг другу с помощью PHP fsockopen (). Код отлично работал в течение многих лет на Windows Server 2008 R2. Недавно мы установили новый сервер на Windows Server 2016. На этом сервере все работает нормально в большинстве случаев, но периодически появляется ошибка сокета: сбой отправки X байтов с errno = 10054 Существующее соединение было принудительно закрыто удаленным хостом.

Сначала мы думали, что может быть проблема с сетью на новом сервере, и настроили еще одну (также Windows Server 2016) с другим поставщиком, но только для той же периодически возникающей проблемы.

Поскольку он является прерывистым и имеет место только в Windows Server 2016, я предполагаю, что в более новых версиях Windows Server произошли некоторые изменения, которые влияют на соединения через сокеты / TCP, но я не могу понять, что! Я не специалист по сокетам, и любые предложения с благодарностью приняты.

FYI - на серверах достаточно низкий трафик, и, используя TCPView, я вижу, что в каждый момент времени обычно устанавливается около 100 соединений TCP (установлено 20ish, прослушивание 40ish и ожидание 25ish). Мне кажется, этого недостаточно, чтобы вызвать проблемы с нехваткой портов / максимальным количеством TCP-соединений, но я не знаю достаточно по теме, чтобы быть уверенным!

Это для Windows Server 2016, работающей на PHP 5.3 (я знаю, что она старая).

$fp=fsockopen("ssl://$server1_IP", 443, $errno, $errstr, 10); 

if($fp)

{   

$eol="\r\n";

fputs($fp, "POST example.php HTTP/1.1$eol");

fputs($fp, "HOST: $server1_IP$eol");

fputs($fp, "Connection: close$eol");

fputs($fp, "Content-Type: application/x-www-form-urlencoded$eol");

fputs($fp, 'Content-Length: '.strlen($data).$eol);

fputs($fp, $eol);

fputs($fp, $data);

fputs($fp, $eol);   

while(!feof($fp))

{

    $response=fgets($fp, 4000);

}

fclose($fp);

}
...