Мне нужно получить довольно много удаленных данных, используя запросы на мыло (получая около 12000 заказов на доставку и составляя запрос для каждого отдельного заказа). На моем тестовом сервере (Windows с Xampp) он работает нормально и занимает около часа или около того. Помещая сценарии на рабочий сервер (Linux), соединение теряется примерно через 10 минут (оно меняется).
Я попытался изменить заголовок te с «Connection: Close» на «Connection: Keep-Alive», но по какой-то причине извлечение каждой записи было таким медленным — например, 3 записи вместо 170 записей в минуту. Обратите внимание, если это из-за fputs или цикла fgets.
Кто-нибудь может сказать мне, как заставить соединение быть живым в течение определенного периода?
В основном мой сценарий:
if (!is_resource($fp))
{
$fp = @fsockopen($host, $port, $errno, $errstr);
if (!$fp) { echo "soap_parser error message is: $errstr ($errno)<br />\n";exit;}
stream_set_timeout($fp,3600);//one hour
}
$soap_out = "POST " . $path . " HTTP/1.1\r\n";
$soap_out .= "Host: " . $hostname . "\r\n";
$soap_out .= "User-Agent: MYSOAPREQUEST \r\n";
$soap_out .= "Content-Type: text/xml;charset=UTF-8;\r\n";
$soap_out .= "Content-Length: ".strlen($xml_request)."\r\n";
$soap_out .= "Connection: Close\r\n";
$soap_out .= "Cache-Control: no-cache\r\n";
$soap_out .= "SOAPAction: ".$soap_action."\r\n\r\n";
$soap_out .= $xml_request;
fputs($fp, $soap_out); //send request SOAP
$soap_in = "";
while (!feof($fp))
{
$soap_in .= fgets($this->fp, 512);
}
return $soap_in;
Это решено сейчас; использование stream_socket_client () вместо fsockopen () теперь работает.
Других решений пока нет …