Я занимаюсь разработкой веб-сайта с php 5.4 с использованием Visual Studio 2013, Xdebug и IIS Express. Всякий раз, когда я пытаюсь выполнить запрос скручивания к порту localhost:, страница зависает до тех пор, пока запрос скручивания не будет выполнен из-за истечения времени ожидания. Однако после истечения времени ожидания curl выполняется остальная часть кода на запрашивающей странице, а затем выполняется код на запрошенной странице, что мне не помогает, поскольку мне нужны данные со страницы.
Вот скрипт, который делает запрос curl:
$logfh = fopen("C:\Windows\Temp\curl_log.log", 'a+');
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,'http://localhost:46746/test.php');
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE, "XDEBUG_SESSION=" . $_COOKIE['XDEBUG_SESSION'] . ';');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT,5);
curl_setopt($ch,CURLOPT_VERBOSE , true);
curl_setopt($ch,CURLOPT_STDERR ,$logfh );
$result = curl_exec($ch);
curl_close($ch);
fclose($logfh);
Вот скрипт на запрашиваемой странице:
<?php
echo 'reached test';
?>
Вот журнал запроса curl:
Adding handle: conn: 0x370ea80
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 3 (0x370ea80) send_pipe: 1, recv_pipe: 0
* About to connect() to localhost port 46746 (#3)
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 46746 (#3)
> GET /test.php HTTP/1.1 Host: localhost:46746 Accept: */* Cookie: XDEBUG_SESSION=A53CF524;
Operation timed out after 5991 milliseconds with 0 out of -1 bytes received
* Closing connection 3
Мой синтаксис curl должен быть правильным, так как я могу успешно получать данные из другого URL. PHP не показывает никаких ошибок. Что я должен делать по-другому?
Эти два варианта являются истинными / ложными:
curl_setopt($ch,CURLOPT_VERBOSE , $logfh );
curl_setopt($ch, CURLOPT_FILE, $logfh);
ОБНОВИТЬ
Есть несколько вещей, которые вы можете сделать, чтобы помочь найти проблему
CURLOPT_CONNECTTIMEOUT
а также CURLOPT_FAILONERROR
важны при отладке.
Без тайм-аута он не истечет и вы не увидите никаких результатов.
Мне нравится видеть, ответил ли сервер вообще, и может ли заголовок ответа HTTP иметь соответствующую информацию, поэтому используйте CURLOPT_HEADER
использование curl_getinfo($ch);
чтобы получить результаты.
Проверьте ответ скручивания на ошибки: curl_errno($ch))
CURLINFO_HEADER_OUT
вернет ваш заголовок запроса, который может выявить проблему с вашим запросом, например, куки.
Задавать CURLOPT_FOLLOWLOCATION
в false, если у вас рекурсивный редирект.
Если вам не нужны файлы cookie, не используйте их, удалите их во время отладки.
Этот заголовок так, что никакой отраженный вывод не интерпретируется как HTML.
header('Content-Type: text/plain; charset=utf-8');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_FILETIME, true);
curl_setopt($ch, CURLINFO_HEADER_OUT,true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, "TestCookies.txt");
curl_setopt($ch, CURLOPT_TIMEOUT,5);
curl_setopt($ch, CURLOPT_COOKIEJAR, "TestCookies.txt");
curl_setopt($ch, CURLOPT_FAILONERROR,true);
$data = curl_exec($ch);
$info = curl_getinfo($ch);
$info = var_export($info,true);
if (curl_errno($ch)){
$data .= 'Retreive Base Page Error: ' . curl_error($ch);
}
else {
$skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE));
$responseHeader = substr($data,0,$skip);
$data= substr($data,$skip);
$info = curl_getinfo($ch);
$info = var_export($info,true);
}
echo $responseHeader;
echo "\n$info";
echo "\n$data";
Возможно, вам придется изменить заголовок по умолчанию.
$request = array();
$request[] = "Host: www.example.com";
$request[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
$request[] = "User-Agent: MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0";
$request[] = "Accept-Language: en-US,en;q=0.5";
$request[] = "Connection: keep-alive";
$request[] = "Cache-Control: no-cache";
$request[] = "Pragma: no-cache";
curl_setopt($ch, CURLOPT_HTTPHEADER,$request);
Если вам нужен POST-запрос:
$post = 'key1=value1&key2=value2&key3=value3';
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
Скручиваемость баночка печенья иногда проблематично. так что я написал, возможно, собственный рутина печенья.
Получить куки из заголовка ответа:
$e = 0;
while(true){
$s = strpos($head,'Set-Cookie: ',$e);
if (!$s){break;}
$s += 12;
$e = strpos($head,';',$s);
$cookie = substr($head,$s,$e-$s) ;
$s = strpos($cookie,'=');
$key = substr($cookie,0,$s);
$value = substr($cookie,$s);
$cookies[$key] = $value;
}
Создайте куки для любых последующих запросов:
$cookie = '';
$show = '';
$head = '';
$delim = '';
foreach ($cookies as $k => $v){
$cookie .= "$delim$k$v";
$delim = '; ';
}
Добавьте куки в заголовок запроса:
$request = array(); // clear requests from previous request.
$request[] = $cookies;
curl_setopt($ch, CURLOPT_HTTPHEADER,$request);
Что ж, ответ оказался простым. Я зашел в Свойства проекта и выбрал параметр сервера «Использовать локальный IIS Express». Я попросил Visual Studio создать виртуальный каталог для меня, и теперь он отлично работает.