fsockopen和curl哪个方法更好?

12

我正在创建一个自动循环计费的应用程序。
请告诉我发送请求到服务器时应该选择哪个选项:

  • fsockeopen
  • curl

为什么其中一个比另一个更好?

4个回答

11
我建议使用PHP的流上下文与内置函数一起使用:https://www.php.net/manual/en/book.stream.php。具有完整的HTTP/S功能,并与fopen/file_get_contents函数很好地集成。你可以(例如)像这样进行POST请求:
$chunk = file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=".FACEBOOK_APP_ID."&client_secret=".FACEBOOK_SECRET."&grant_type=client_credentials");
if ($request_ids && $chunk) {
    $cookie = explode('=', $chunk);
    if (count($cookie) == 2) $cookie = $cookie[1];
    else $cookie = $cookie[0];

    // flush it
    foreach ($request_ids as $request_id) {
        $context = stream_context_create(array(
            'http' => array(
                'method'        => 'POST',
                'content'       => 'method=DELETE',
                'user_agent'    => "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 (.NET CLR 3.5.30729)",
                'max_redirects' => 0
            )
        ));
        @file_get_contents('https://graph.facebook.com/' . $request_id . '?access_token=' . $cookie, false, $context);
    }
}

这段代码登录到Facebook,获取一个应用登录令牌,然后使用安全的HTTP POST方法使用图形API删除一些对象。
如果你需要做更复杂的事情,也是可以的。
$context = stream_context_create(array('http' => array(
   // set HTTP method
   'method'         => 'GET',
   'user_agent'     => "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 (.NET CLR 3.5.30729)",
   'max_redirects'  => 0
)));

// extract the cookies
$fp      = fopen(URL, "r", false, $context);
$meta    = stream_get_meta_data($fp);
$headers = $metadata['wrapper_data'];
fclose($fp);

将日志记录将为您获取URL返回的标头。不需要外部库。

2
那么如果 allow_url_fopen 是 false,我该怎么办? - Chameron

5
不是直接的方式。 我的意思是,直接在套接字上编写和解析HTTP标头是疯狂的,而且我认为curl的API非常令人反感。建议使用PEAR的HTTP_Request2,它可能已经安装在您的计算机上。如果没有,您可以将其与您的代码捆绑在一起--它是BSD许可证。它包装了任一套接字或curl,并提供了一个相对较为合理的 HTTP 接口。

3

当你需要处理http协议时,请使用Curl,当你需要更通用的访问非http服务器时,请使用socket。


0

我非常喜欢这里采用的方法,但它有一个严重的缺陷。测试时间波动很大,以至于整个测量结果几乎没有用处。服务器响应时间、瞬时服务器延迟以及到服务器的路线的瞬时质量都在测试中起着重要作用。我从测试中得出的真正结论是,对于HTTP查询来说,它几乎不相关,因为随机的各种延迟是任何API性能差异的倍数。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接