IIS Express зависает с запросом скручивания

Я занимаюсь разработкой веб-сайта с 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 не показывает никаких ошибок. Что я должен делать по-другому?

1

Решение

Эти два варианта являются истинными / ложными:

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);
1

Другие решения

Что ж, ответ оказался простым. Я зашел в Свойства проекта и выбрал параметр сервера «Использовать локальный IIS Express». Я попросил Visual Studio создать виртуальный каталог для меня, и теперь он отлично работает.

0

По вопросам рекламы [email protected]