PHP+cURL:简单的测试脚本不工作(在一台机器上)


PHP + cURL: simple test script not working (on one machine)

我有以下一个非常简单的PHP脚本,它使用cURL加载网页并显示

<?php
  $ch = curl_init("http://www.reddit.com/");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
  $content = "Hello, World!";
  $content = curl_exec($ch);
  curl_close($ch); 
  echo $content;
?>

在我的本地机器上,它运行得很好,但在我的服务器机器上却不行。在这里,我在Firefox中得到一个"连接已重置"错误。引起麻烦的线路似乎是$content = curl_exec($ch);。如果我评论这一行,我可以在两台机器上看到Hello, World!

在两台机器上调用phpinfo()时,cURL部分看起来非常相似。这里的问题可能是,它在一台机器上工作,但在另一台上不工作。基本上,两者都使用Apache2和PHP5运行Ubuntu14.04。哪些配置或权限可能不同。我有点不知所措。

编辑:正如arkascha所建议的,我已经检查了Apache error.log文件。事实上,如果我在执行curl_exec命令时看到以下错误:

[core:notice] [pid 28267] AH00051: child pid 28274 exit signal Segmentation fault (11), possible coredump in /etc/apache2

我以前也遇到过类似的问题,并用这里给出的解决方案解决了。请在您的文件顶部添加行,然后再次测试。

<?php
ini_set('zend.enable_gc', 0);
....
....

我刚刚经历了类似的事情。两台服务器之间的CURL连接大部分时间都有效,但大约五分之一的服务器会崩溃。

当它崩溃时,Firefox会报告"连接已重置",Safari会告诉我"服务器意外断开了连接"。Apache错误日志将显示exit signal Segmentation fault (11)

添加跟踪后,我发现实际上是curl_close函数导致了崩溃,而不是curl_exec,它实际上运行良好(其结果显示在我的日志中(。

最终,我在代码中找到了这一行。。。

curl_setopt($curlSession, CURLOPT_VERBOSE, true);

我使用它将CURL会话的原始数据输出到日志文件中,用于调试目的。由于我注释掉了那一行,错误就停止了。

因此,使用CURLOPT_VERBOSE似乎会导致CURL崩溃,并带走PHP/Apache