我该如何找出cURL为什么会卡住并且无响应?

19

我在尝试追踪PHP中cURL调用的问题。在我们的测试环境中运行良好,但在生产环境中却不行。当我尝试执行cURL函数时,它只是挂起来,从来没有响应过。我尝试从命令行建立cURL连接,结果也是一样。

我想知道cURL是否会记录发生的情况,因为我无法弄清楚这个命令在转啊转的时间里到底发生了什么。有人知道是否有记录正在执行的日志吗?

我认为这是连接问题,但我们的IT人员坚持认为我应该能够毫无问题地访问它。有什么想法吗?我正在运行CentOS和PHP 5.1。

更新:使用详细模式,我得到了一个错误28 "Connect()超时"。我尝试将超时时间延长到100秒,并将最大重定向次数限制为5,但没有改变。我尝试ping这个盒子,也超时了。所以我要把这个问题呈现给IT,看看他们是否会再次查看它。感谢所有的帮助,希望在半小时内能回来告诉你这是他们的问题。

更新2:原来我的盒子正在用外部IP地址解析服务器名称。当IT给了我内部IP地址并在cURL调用中替换后,一切都很顺利。谢谢大家的帮助。

4个回答

18

在你的php中,可以设置CURLOPT_VERBOSE变量:

curl_setopt($curl, CURLOPT_VERBOSE, TRUE);

这会将日志记录到 STDERR 或使用 CURLOPT_STDERR 指定的文件(它接受一个文件指针):

curl_setopt($curl, CURLOPT_STDERR, $fp);

从命令行,你可以使用以下开关:

  • --verbose:将更多信息报告到命令行
  • --trace <file>--trace-ascii <file>:将跟踪信息记录到文件中

你可以使用--trace-time在冗长的/文件输出之前添加时间戳。


好的,这给了我一些更多的信息,但不是很多。它只是说:
  • 准备连接()到[服务器名称]端口443
  • 正在尝试[服务器IP地址]...
然后就卡住了。对我来说似乎是一个连接问题。还有其他想法吗?我现在正在尝试Pekka的答案。
- SenorPuerco
添加了一些命令行细节。你尝试过设置更高的时间限制来查看它是否会返回吗?使用 set_time_limit(600) 来设置为10分钟。 - Adam Hopkinson
你能ping通这个IP地址吗?听起来像是网络/防火墙问题。如果你不能ping通,你可以直接把它送回给你的IT人员,告诉他们解决它! - Adam Hopkinson
当我看到端口443时,确实可能是不受信任的证书问题。您可以尝试使用端口80来开个玩笑吗? - Pekka
CURLOPT_STDERR选项需要一个打开的文件指针,而不是表示文件路径的字符串:http://www.php.net/manual/en/function.curl-setopt.php - Randy Syring

0

1
除非我错了,否则这只有在建立连接时才有用,对吧? - SenorPuerco

0

你尝试过设置CURLOPT_MAXREDIRS吗?我发现有时候会出现一个正常浏览器用户看不到的“无限”重定向循环。


好的想法,但它并没有改变任何事情。仍然只是超时了。 - SenorPuerco

-1

如果可能的话,请尝试以PHP运行的用户(可能是Apache运行的用户)的身份进行sudo

curl问题可能有各种原因,需要用户输入,例如存储在根用户的受信任证书缓存中但不在PHP用户中的不受信任证书。在这种情况下,命令将等待从未发生的输入。

更新:仅当您使用exec外部运行curl时才适用-也许不适用。


我正在使用PHP函数,所以我猜它不适用。然而,记住这一点是很好的。 - SenorPuerco

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