Я сталкиваюсь со спорадической проблемой с параметром curl RETURNTRANSFER. Я не уверен, что я пропустил что-то в своем коде, что вызывает его, или это просто плохо документировано, и я не знаю о работе RETURNTRANSFER.
Я использую curl (через php) для отправки xml-данных через POST внешнему слушателю. В случае успеха слушатель отвечает и возвращает тот же xml с одним или двумя заполненными полями, которые я отправил через пустое поле.
например. <Status />
становится <Status>
Принято </Status>
. Примерный размер полного XML-запроса POST - [upload_content_length] => 1414. Отправляется уникальный идентификатор (сгенерированный на моей стороне), если слушатель получает повторный идентификатор, он отклоняет данные xml и отвечает сообщением об ошибке в виде простого текста.
Это работает в 99,9% случаев.
Код скручивания:
$header[] = "Content-Type: text/xml";
$header[] = "Content-length: ".strlen($post_string);
$x = curl_init("https://xyz.com");
curl_setopt($x, CURLOPT_HEADER, 0);
curl_setopt($x, CURLOPT_HTTPHEADER, $header);
curl_setopt($x, CURLOPT_POST, 1);
curl_setopt($x, CURLOPT_POSTFIELDS,$xmldata);
curl_setopt($x, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($x, CURLOPT_REFERER, "https://mypage.com");
curl_setopt($x, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($x, CURLOPT_PORT, 443);
curl_setopt($x, CURLOPT_SSL_VERIFYPEER, 0); //to allow self-signed SSL cert
curl_setopt($x, CURLOPT_SSL_VERIFYHOST, 0); //to allow self-signed SSL cert
curl_setopt($x, CURLOPT_TIMEOUT, 30);
curl_setopt($x, CURLOPT_FORBID_REUSE, TRUE);
curl_setopt($x, CURLOPT_FRESH_CONNECT, TRUE);
curl_setopt($x, CURLOPT_BUFFERSIZE, 64000);
curl_setopt($x, CURLOPT_VERBOSE, 1);
$listenerresponse = curl_exec($x);
$info = curl_getinfo($x);
curl_close($x);
Недавно я обнаружил ошибки, в которых ошибки слушателя встречались с дублирующимися идентификаторами.
Мои журналы показывают временную шкалу, как это ::
curl POST уникального идентификатора "12345678"
слушатель отвечает «Дубликат ID» в 2010-10-13 17: 27: 59
слушатель отвечает «Принят» 2010-10-13 17: 28: 06
Первоначально я думал, что предыдущий идентификатор был каким-то образом кэширован и отправлялся по ошибке, но это не так. Слушатель получает правильный идентификатор.
Журналы слушателей показывают это с немного другой хронологией:
Слушатель отвечает «Принят» в 2010-10-13 17: 27: 48
Слушатель отвечает «Дубликат ID» в 2010-10-13 17: 27: 58
Насколько я понимаю, я ожидаю, что поток curl будет ждать ответа, а не отправлять другой запрос. Прав ли я, предполагая, что проблема связана с сетью - возможен сброс пакетов / что-то подобное?
Любые предложения о том, как предотвратить это, были бы очень признательны.
В идеале я хотел бы, чтобы curl отправлял и ждал полного ответа перед отправкой другого запроса ... Есть ли возможность указать это? Пожалуйста, помогите: -)
Спасибо за внимание.
S.