file_get_contents не работает на производственном сервере, хорошо на локальном - PullRequest
4 голосов
/ 18 июля 2011

У меня есть 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 ]

11 голосов
/ 18 июля 2011

Убедитесь, что сервер позволяет открывать удаленные URL-адреса с помощью файловых функций (значение php.ini «allow_url_fopen» должно быть «true»).

1 голос
/ 18 июля 2011

Попробуйте вот так

<?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');
?>

еще одно решение из руководства

Иногда вы можете получить сообщение об ошибке при открытии http URL. даже если вы установили "allow_url_fopen = On" в php.ini

Для меня решение было также установить для user_agent что-то.

1 голос
/ 18 июля 2011

Вы должны убедиться, что ваш хостинг-провайдер не отключил удаленную загрузку URL из соображений безопасности.Значение параметра allow_url_fopen, и вы можете проверить текущую конфигурацию с помощью phpinfo () .В этом случае file_get_contents () должен вернуть FALSE, поэтому вы должны проверить $img на ложь с помощью оператора ===.

1 голос
/ 18 июля 2011

Попробуйте

ob_start()

в начале и

ob_end_flush()

в конце сценария. Также убедитесь, что скрипт не содержит символов до <?php.

0 голосов
/ 18 июля 2011
  1. вам следует проверить кодировку файла, поскольку utf8 сломает заголовки
  2. проверить, не печатает ли ваш файл какие-либо другие данные перед запуском скрипта.
0 голосов
/ 18 июля 2011

Заголовки отправляются, когда вы начинаете выводить контент. Таким образом, где-то перед кодом, который вы указали выше, содержимое выводится (из PHP или в простом HTML или javascript). Вам нужно выследить, где это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...