2012-04-01 51 views
2

我想送与fsock, 后变数,但是当我尝试这个办法:fsock:找不到插座运输“HTTP”

$post_arr = array ("a" => "b"); 
    $addr = 'http://1.2.3.4/confirmation.html'; 

    $fp = fsockopen($addr, 80, $errno, $errstr, 30); 
    if (!$fp) { 
     echo "$errstr ($errno)<br />\n"; 
    } else { 

     $req = ''; 
     foreach ($post_arr as $key => $value) { 
      $value = urlencode(stripslashes($value)); 
      $req .= "&" . $key . "=" . $value; 
     } 


     $header = "POST /cgi-bin/webscr HTTP/1.0\r\n"; 
     $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
     $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 
     fwrite($fp, $header); 
     while (!feof($fp)) { 
      echo fgets($fp, 128); 
     } 
     fclose($fp); 
    } 

我得到“无法找到插座运输‘HTTP’” , 有什么想法为什么?

+0

这个小程序库可以帮助你编写更简单的HTTP请求:https://github.com/jamm/HTTP – 2012-04-01 15:11:01

+2

你应该省略'http://'部分,默认情况下'tcp:'transport是用过的。 – 2012-04-01 15:30:51

回答

7

fsockopen()打开一个插座。套接字不知道关于Layer5 +协议的任何信息,例如HTTP。

$fp = fsockopen('1.2.3.4', 80, $errno, $errstr, 30); 

要请求特定路径,在请求发送:GET /confirmation.html
要指定域,在Host头发送:Host: 1.2.3.4


你可能要考虑使用curl延期。在PHP中手动构建HTTP请求通常没有什么好的理由。

+0

这真的取决于。卷曲可能是可取的,但并不总是安装。我已经在我编写和发布的软件包中遇到过这个问题。卷曲还增加了一些额外的开销。 – Peter 2012-04-01 16:24:23