IIS Express挂起卷曲请求

时间:2015-04-07 21:12:33

标签: php curl iis-express

我正在使用Visual Studio 2013,Xdebug和IIS Express开发一个使用php 5.4的网站。每当我尝试向localhost:port发送curl请求时,页面都会挂起,直到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没有显示任何错误。我应该做些什么?

2 个答案:

答案 0 :(得分:1)

这两个选项是真/假:

curl_setopt($ch,CURLOPT_VERBOSE , $logfh );
curl_setopt($ch, CURLOPT_FILE, $logfh);

更新

您可以采取一些措施来帮助找到问题

CURLOPT_CONNECTTIMEOUTCURLOPT_FAILONERROR
在调试时很重要 如果没有超时,它将不会超时,您将看不到任何结果。

我想查看服务器是否完全响应并且HTTP响应标头可能包含相关信息,因此请使用CURLOPT_HEADER

使用curl_getinfo($ch);获取结果。

检查错误的卷曲响应:curl_errno($ch))

CURLINFO_HEADER_OUT会返回您的请求标头,这可能会显示您的请求存在问题,例如Cookie。

如果您有递归重定向,请将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);

卷曲饼干罐有时会出现问题。所以我写的可能是自己的cookie例程。

从响应标头中获取Cookie:

  $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:

 $cookie = '';
 $show = '';
 $head = '';
 $delim = '';
 foreach ($cookies as $k => $v){
   $cookie .= "$delim$k$v";
   $delim = '; ';
 }

将Cookie添加到请求标题中:

$request = array();  // clear requests from previous request.
$request[] = $cookies;
curl_setopt($ch, CURLOPT_HTTPHEADER,$request);

答案 1 :(得分:0)

嗯,答案结果很简单。我进入了Project Properties并选择了服务器设置'Use Local IIS Express'。我让Visual Studio为我创建了虚拟目录,现在它运行得很好。