Привет я делаю curl
PHP POST запрос (из-за междоменного происхождения), и я столкнулся с проблемой. Запрос на отправку отправляется на компьютер, на котором размещен пользовательский веб-сервер, который я не могу контролировать. Первые запросы (например, 15-20 в порядке), но после этого количества запросов я получаю 503 error
ответ с сообщением об ошибке
Услуга недоступна — достигнуто максимальное количество активных клиентов.
Я полагаю, что curl создает новое соединение каждый раз, когда я отправляю запрос. Я также предполагаю, что на сервере машины может быть открыто только несколько соединений.
Вот мой PHP-код:
$data = array("getTags" => array("Start_dav","CutON"), "includeTagMetadata" => false);
$data_string = json_encode($data);
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,"http://domainipaddres/");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch,CURLOPT_POSTFIELDS,$data_string);
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE, "SID=8c81775da6");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , false);
curl_setopt($ch, CURLOPT_FORBID_REUSE, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string),
'Connection: Keep-alive',
'Keep-alive: 300'
)
);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
Мне действительно нужно выяснить это, но после 2 дней пробовать различные варианты и данные заголовка я не могу заставить его работать. Как заставить curl использовать только одно соединение?
большое спасибо
РЕДАКТИРОВАТЬ: Я нашел проблему сегодня. Сервер может иметь только 3 активных клиента. Я обнаружил, что в первом заголовке ответа от сервера указан SET cookie, и мне нужно использовать этот cookie в других запросах. Я установил это вручную, и это работает. Есть ли способ сделать это автоматически?
Я решил проблему сегодня. Я проверил заголовок ответа и увидел, что сервер устанавливает куки. Мне просто нужно было сохранить куки и использовать их в других запросах, и это работает. Вот часть кода:
$data_string = json_encode($data);
$agent= 'Mozilla/5.0 (Windows; U;Windows NT 5.1; ru; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9';
//open connection
$ch = curl_init();
$f = fopen('request.txt', 'w'); //writes headers to this file
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,"domainipaddress");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch,CURLOPT_POSTFIELDS,$data_string);
$tmpfname = dirname(__FILE__).'/cookie.txt'; //saves the cookie from server
curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , false);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
curl_setopt( $ch, CURLOPT_VERBOSE, 1 );
curl_setopt( $ch, CURLOPT_STDERR, $f );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt($ch, CURLOPT_FORBID_REUSE, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string),
'Connection: keep-alive',
"Keep-Alive: 300")
);
//execute post
$result = curl_exec($ch);
$headers = curl_getinfo($ch);
fclose($f);
В любом случае, спасибо
Других решений пока нет …