Я работаю с двумя серверами, которые отправляют данные друг другу с помощью 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);
}