【问题标题】:PHP and Curl not working for particular urlPHP 和 Curl 不适用于特定的 url
【发布时间】:2012-02-17 23:49:03
【问题描述】:

我有一个 PHP 脚本,它使用 Curl 来获取关于我们 URL 的推文数量;以这个网址为例:

http://urls.api.twitter.com/1/urls/count.json?url=http://stackoverflow.com

另外,我正在使用 Phil Sturgeon 的 Curl 库 for CodeIgniter 来执行获取: https://github.com/philsturgeon/codeigniter-curl

当我在本地运行脚本时,脚本运行良好。但是,当我将它部署到我们的生产环境时,它会在尝试访问上述 Twitter URL 时立即中断。

这是奇怪的事情。我对来自 Facebook Graph 的相同基本 URL 执行类似的计数检索,它适用于生产服务器。请看下面的示例代码:

    $fb_get_url = "http://graph.facebook.com/?ids=http://stackoverflow.com";
    $twitter_get_url = "http://urls.api.twitter.com/1/urls/count.json?url=http://stackoverflow.com";

    $fb_response_json = $this->curl->simple_get($fb_get_url, array(CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_FAILONERROR => true));
    $twitter_response_json = $this->curl->simple_get($twitter_get_url, array(CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_FAILONERROR => true));

simple_get 可以很好地与 $fb_get_url 配合使用。但是,当我让 Curl 访问 $twitter_get_url 时,我似乎遇到了错误。不幸的是,我无法告诉您错误是什么,因为连接会在错误发生后立即重置。另外,提醒你一下,我自己机器上的相同 Twitter url 可以正常工作;就在我将它部署到我们的服务器时,它就坏了。

这是奇怪的事情。我尝试通过 ssh 连接到我们的每台服务器,并使用相同的 url 从命令行执行 Curl,它成功了。这向我证明呼叫没有被防火墙或其他东西阻止。

所以我想弄清楚的是:为什么从 CL 运行 Curl 有效,但使用 Curl lib 获取相同的 URL 似乎会中断?我不认为这是我正在使用的 CI Curl 库中的错误,因为我也尝试使用 http://php.net/manual/en/book.curl.php 中的 http_response 函数进行测试,但它似乎也引发了错误。

至于确切的错误;我对错误的唯一线索是脚本需要很长时间才能失败并重置连接;所以我想这可能是一个超时。我将以下代码放在控制器顶部以启用错误显示;但仍然没有收到任何错误消息:

error_reporting(E_ALL);
ini_set( 'display_errors','1');

非常感谢任何建设性的意见。

谢谢,弗兰克

【问题讨论】:

  • 这不是您问题的答案,但看起来您获取推特计数的方式并未得到官方允许。见dev.twitter.com/discussions/5653
  • 您是否尝试过在不使用库的情况下构建 CURL 请求?
  • 是的,我尝试了直接的 PHP Curl 请求,而不是使用库;有同样的问题。
  • 您是否尝试过检查 $this->curl->error_code 或 $this->curl->error_string 以获取有关 curl 正在做什么的更多信息?
  • 这可能是一个愚蠢的问题,但是 PHP 中是否启用了 CURL 支持?在您的生产服务器上创建一个 phpinfo.php,其中包含 <?php phpinfo();。查找curl 部分。

标签: php codeigniter curl


【解决方案1】:

仅供参考,

从来没有弄清楚为什么 Facebook 的 URL 有效,而 Twitter 的却没有。我们最终通过使用 Tweet 按钮的 onShare 处理程序调用 AJAX 服务来解决这个问题,该服务手动增加共享计数;因此不需要直接从 Twitter 检索共享计数。这不是一个完美的解决方案(它不会跟踪转发);但它足以满足我们的需求。

谢谢大家。

【讨论】:

    【解决方案2】:

    您可以尝试使用 Postman 来查看“对话”的实际情况。这是 Chrome 的 REST 客户端 - https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm

    我已经多次尝试使用 REST API,这有助于弄清楚发生了什么...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 2014-01-22
      • 2017-07-27
      • 2018-09-15
      相关资源
      最近更新 更多