PHP卷曲放500错误

时间:2013-11-18 16:52:37

标签: php curl

我有一个curl put请求在我的localhost上工作正常,但在实时服务器上它会抛出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()访问的。

5 个答案:

答案 0 :(得分:6)

如果错误是,就像您认为的那样,与脚本超时有关,并且您无权访问php.ini文件 - 可以轻松修复

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

设置set_time_limit(128)的超时应解决您的所有问题,并且通常被视为合理的上限

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

答案 1 :(得分:3)

以下是一些尝试:

  1. 删除脚本中的可变性 - 用于测试,硬编码会话ID,以使卷曲卷曲相同。如果每次运行它都会发生变化,则无法可靠地测试某些内容。

  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默认值导致包含不同的数据?

答案 2 :(得分:1)

我怀疑你的服务器不支持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

答案 3 :(得分:0)

哪个服务器实际显示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;
     }

有效吗?

答案 4 :(得分:0)

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

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

并改变:

FcgidIOTimeout 3600

然后做:

service httpd restart

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