【问题标题】:Which is better approach between fsockopen and curl? [closed]fsockopen 和 curl 之间哪个更好? [关闭]
【发布时间】:2011-08-21 11:29:46
【问题描述】:

我正在为自动定期计费创建一个应用程序。
请让我知道我应该选择哪个选项将请求发送到服务器

  • fsockeopen
  • 卷曲

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

【问题讨论】:

    标签: php curl payment-gateway fsockopen


    【解决方案1】:

    都不是。我的意思是,不是直接的。

    在裸机套接字上编写和解析 HTTP 标头是疯狂,我发现 curl 的 API 是彻头彻尾的冒犯

    看看 PEAR 的HTTP_Request2,它甚至可能已经安装在您的机器上。如果没有,您可以将它与您的代码捆绑在一起——它是 BSD 许可的。它包装了either sockets or curl,并提供了一个相对健全的HTTP接口。

    【讨论】:

      【解决方案2】:

      我建议将 PHP 的流上下文与内置函数一起使用:http://us3.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);
      

      Will log 将获取 URL 返回的标头。无需外部库。

      【讨论】:

      • 那么在allow_url_fopen为false的情况下怎么办?
      【解决方案3】:

      当您必须处理 http 协议时使用 Curl,当您需要对非 http 服务器进行更通用的访问时使用套接字。

      【讨论】:

        【解决方案4】:

        我现在正在研究这个问题,发现下面的页面提供了用于测试不同选项和生成速度输出的代码。很有意思。

        http://www.hashbangcode.com/blog/quickest-way-download-web-page-php

        【讨论】:

        • 我真的很喜欢这里的方法,但它有一个严重的缺陷。测试的时间波动很大,严重到整个测量结果几乎没有用处。服务器响应时间、瞬时服务器延迟以及到服务器的路由的瞬时质量都在测试中发挥重要作用。我从测试中得出的真正结论是,它几乎与 HTTP 查询无关,因为随机的各种滞后是任何 API 性能差异的倍数。
        猜你喜欢
        • 2010-10-12
        • 1970-01-01
        • 2011-03-06
        • 2011-02-14
        • 1970-01-01
        • 2011-05-24
        • 2014-07-26
        • 2013-12-15
        • 2011-07-22
        相关资源
        最近更新 更多