【问题标题】:PHP curl put 500 errorPHP curl 放 500 错误
【发布时间】:2013-12-01 22:12:42
【问题描述】:

我有一个 curl put 请求,它在我的本地主机上运行良好,但在实时服务器上它会抛出 500 错误。这是我的代码:

public static function send( $xml )
{
    $xml = str_replace( "\n", "", $xml );

    //Write to temporary file
    $put_data = tmpfile();
    fwrite( $put_data, $xml );  
    fseek( $put_data, 0 );

    $options = array(
            CURLOPT_URL => 'http://*****************/cgi-bin/commctrl.pl?SessionId=' . Xml_helper::generate_session_id() . '&SystemId=live',
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_HTTPHEADER => array( 'Content-type: text/xml' ),
            CURLOPT_PUT => TRUE,
                CURLOPT_INFILE => $put_data,
            CURLOPT_INFILESIZE => strlen( $xml )
        );

        $curl = curl_init();
        curl_setopt_array( $curl, $options );
        $result = curl_exec( $curl );
        curl_close( $curl );

        return $result;
    }

我确实在服务器上启用了 curl!

有没有人知道为什么它不能在服务器上运行?如果有帮助,我会使用共享主机。

我还在文件顶部启用了错误报告,但 curl 完成后没有错误显示。我只是得到通用的 500 错误页面。

谢谢

更新:

我已与客户联系,他们已确认发送的信息已被他们接收并已插入他们的后台系统。因此,它必须与作为原因的响应有关。它是假设要返回的一小块 xml。

另一个更新

我在不同的服务器和 heroku 上尝试了相同的脚本,但仍然得到相同的结果。

另一个更新

我想我可能已经找到了问题的出路。由于 FastCGI 超时,脚本似乎超时,而且因为我在共享主机上,所以我无法更改它。谁能证实这一点?

最终更新

我联系了我的托管服务提供商,他们确认脚本超时是由于服务器上的超时值而不是我可以使用任何 PHP 函数或 ini_set() 访问的超时值。

【问题讨论】:

  • 服务器上产生错误500,这里http://************/cgi-bin/commctrl.pl?SessionId=...,不是curl产生的。您需要做的是查看远程主机上的错误日志,而不是在运行 curl 脚本的主机上。
  • 感谢您的反馈,但它是如何在我的本地主机上工作的?无论我从哪里访问它,它都不会返回 500 错误???
  • 你的非本地服务器是否安装了 curl 库?
  • 是的,我在帖子中提到过
  • 你死了($result);在返回 $result; 之前

标签: php curl


【解决方案1】:

如果错误是,如您所想,与脚本超时有关并且您无权访问 php.ini 文件 - 有一个简单的修复方法

只需在脚本开头使用set_time_limit(INT),其中INT 是秒数,即可覆盖php.ini 文件中的设置

设置set_time_limit(128) 的超时时间应该可以解决您的所有问题,并且通常被认为是一个合理的上限

更多信息可以在这里找到http://php.net/manual/en/function.set-time-limit.php

【讨论】:

  • 您好,我试过了,但是没有用。我联系了我的托管服务提供商,他们确认脚本超时是因为服务器上的超时值,而不是我可以使用任何 PHP 函数或 ini_set() 访问的超时值。还是谢谢。
  • 这是否意味着你无能为力?
  • 是的,我们需要将站点移动到我们的专用服务器,因为我们访问的 API 非常慢。获得响应需要 49 秒,在我们的共享主机上最长执行时间为 30 秒。
  • 糟透了,浪费了 250 个代表点。至少你明白了
【解决方案2】:

这里有一些可以尝试的方法:

  1. 删除脚本中的可变性 - 为了测试,对会话 ID 进行硬编码,以便 curl curl 相同。如果每次运行时它都发生变化,您就无法可靠地测试它。

  2. 尝试直接从命令行使用 curl,例如 curl http://*****************/cgi-bin/commctrl.pl?SessionId=12345&SystemId=live。这将告诉您问题是否真的是由计算机本身引起的,或者与 PHP 有关。

  3. 检查服务器上的日志,可能类似于 /var/log/apache/error.log,具体取决于服务器使用的操作系统。还要查看访问日志,这样您就可以看到您是否真的收到了相同的请求。

  4. 最后,如果你真的没办法,你可以使用wireshark或tcpdump/WinDump之类的程序来监控连接,这样你就可以比较每台计算机发送的数据包。这将使您了解它们的不同之处-它们是否被防火墙破坏了? php 是否向其中之一添加了额外的标头?不同的 CURL 默认值是否会导致包含不同的数据?

【讨论】:

  • 1.每个请求的会话 ID 都需要更改。尽管我确实尝试了几次硬编码,但都失败了。 2. 我试过了,它返回了预期的响应。这是否意味着服务器是问题? 3.错误日志和访问日志没有显示任何帮助我们的信息。 4.我已经安装了wireshark,不错的工具tbh。从我的本地主机发送请求时,我已经检查了响应,并且它们按照我的预期执行。我能看到我们遇到问题的服务器返回了什么吗??
  • 1.如果会话需要随着每个请求而改变,那么问题可能是它生成的会话 id 是错误的? 2. 如果命令行 curl 可以,而 php 不行,那么问题出在 php 代码上;如果命令行也不起作用,那么问题出在计算机之间的连接上。 4. 是的,Wireshark 应该显示发送和接收的数据包,只是配置起来会让人困惑。
【解决方案3】:

我怀疑您的服务器不支持 tmpfile()。只是为了验证:

public static function send( $xml ) {
$xml = str_replace( "\n", "", $xml );

//Write to temporary file
$put_data = tmpfile();
if (!$put_data) die('tmpfile failed');
...

如果您在 GoDaddy 服务器上,请查看...https://stackoverflow.com/questions/9957397/tmpfile-returns-false-on-godaddy-server

【讨论】:

  • 您好,感谢您的反馈,我已经对此进行了测试,发现这不是问题的原因。
【解决方案4】:

哪个服务器实际显示 500 ?从您的代码来看,它似乎是本地服务器而不是远程服务器。 改变

public static function send( $xml )
{

public static function send( $xml )
{
    error_reporting(E_ALL);
    if(!function_exists('curl_exec')) {
        var_dump("NO CURL");
        return false;
     }

这行得通吗?

【讨论】:

  • 首先,您在 var_dump 上缺少一个分号,我说在帖子中启用了 curl。谢谢。
  • 是的,我们服务器的那个并不表示提交数据时发生错误
  • 错误报告是否显示更多?从您发布的代码中,您永远不会从那里的服务器获得状态代码。只是输出。处理 xml 是否有错误?
  • 不,是 curl 的执行触发了 500 错误。如果我删除 curl_exec() 调用脚本工作正常。我有错误报告,但它仍然显示通用 500 内部错误页面。
  • 听起来确实因为某种原因不允许 curl exec。 php5-curl 安装了吗?在disable_functions 列表中是``curl_exec` 吗?你能发布一个php信息页面吗?
【解决方案5】:

这几乎肯定不是 php 超时设置。 如果您使用的是您所说的 FastCGI,那么您需要编辑此文件:

/etc/httpd/conf.d/fcgid.conf

然后改变:

FcgidIOTimeout 3600

然后做:

service httpd restart

这让我发疯了 3 天。投票最多的答案是错误的!

【讨论】:

  • 是的,我知道它不是 PHP 超时设置,它是在 cmets 的某处建立的。我通过将它放在可以更改设置的专用服务器上解决了它。
猜你喜欢
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多