file_get_contents不在生产服务器上工作,在本地工作正常

时间:2011-07-18 07:30:10

标签: php file-get-contents production-environment

我有一个PHP脚本从远程服务器获取图像,以便我可以使用HTML5 canvas API对其进行操作。

<?php
if ((isset($_GET['url']))) {
    $url = $_GET['url'];
    $file_format = pathinfo($url, PATHINFO_EXTENSION);
    try
    {   
        header("Content-Type: image/$file_format");
        header("Content-disposition: filename=image.$file_format");
        $img = file_get_contents($url);
        echo $img;
    }

    catch(Exception $e)
    {
        echo $e->getMessage();
    }
}

else die('Unknown request');
?>

典型的请求如下所示:

fetch_image.php?url=http://example.com/images/image.png

我的本​​地服务器上的一切正常,但生产服务器给我这个错误:

  

NetworkError:500内部服务器错误。

错误日志注册此消息:

  

PHP警告:无法修改标头信息 - 已发送的标头。

我已经尝试了一些建议,但它不起作用:

allow_url_fopen = 1

6 个答案:

答案 0 :(得分:11)

检查服务器是否允许您使用文件功能打开远程URL(php.ini“allow_url_fopen”设置必须为“true”)。

答案 1 :(得分:1)

尝试

ob_start()

在开头和

ob_end_flush()

在脚本的末尾。另外,请确保脚本在<?php之前不包含任何字符。

答案 2 :(得分:1)

出于安全原因,您应确保您的托管服务提供商未禁用远程URL提取。设置为allow_url_fopen,您可以使用phpinfo()检查当前配置。在这种情况下,file_get_contents()应该返回FALSE,因此您必须使用$img运算符对===进行错误测试。

答案 3 :(得分:1)

试试这种方式

<?php
if ((isset($_GET['url']))) {
    $url = $_GET['url'];
    $file_format = pathinfo($url, PATHINFO_EXTENSION);
    try
    {   
        ob_clean();
        ob_start();

        header("Content-Type: image/$file_format");
        header("Content-disposition: filename=image.$file_format");
        $img = file_get_contents(urlencode($url));
       // as per manual "If you're opening a URI with special characters, such as spaces, you need to encode the URI with urlencode(). " 
        echo $img;
        echo ob_get_clean();
        exit();
    }

    catch(Exception $e)
    {
        echo $e->getMessage();
    }
}

else die('Unknown request');
?>

来自manual

的另一个解决方案

有时您可能会在打开http网址时出错。 即使你在php.ini中设置了“allow_url_fopen = On”

对我来说,解决方案是将“user_agent”设置为某种东西。

答案 4 :(得分:0)

开始输出内容时会发送标头。因此,在您上面提供的代码之前的某个地方,内容会被回显(来自PHP或纯HTML或javascript)。你需要找到发生的地方。

答案 5 :(得分:0)

  1. 你应该检查文件的编码,因为utf8会破坏标题
  2. 检查您的文件在运行脚本之前是否不打印任何其他数据。