【问题标题】:fsock: Unable to find the socket transport "http"fsock:找不到套接字传输“http”
【发布时间】:2012-04-15 11:08:21
【问题描述】:

我想用 fsock 发送 post 变量, 但是当我尝试这个时:

$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”', 任何想法为什么?

【问题讨论】:

  • 这个小库可以帮助你编写更简单的 HTTP 请求:github.com/jamm/HTTP
  • 您应该省略 http:// 部分,因为默认情况下使用 tcp: 传输。

标签: php html sockets


【解决方案1】:

fsockopen() 打开一个套接字。套接字对 HTTP 等 Layer5+ 协议一无所知。

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

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


您可能需要考虑使用 curl 扩展名。通常没有充分的理由在 PHP 中手动构建 HTTP 请求。

【讨论】:

  • 这真的取决于。卷曲可能更可取,但并不总是安装。我在我编写和发布的包中遇到过这个。 Curl 还增加了一些额外的开销。
猜你喜欢
  • 1970-01-01
  • 2017-06-23
  • 2020-02-11
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 2012-06-23
  • 1970-01-01
相关资源
最近更新 更多