Код ошибки из вызова API из одного домена, но не другого индекса Undefined:
Иногда мой домен (example.test.org) показывает мне ошибку при вызове любого API.
"{"error":{"code":500,"message":"Undefined index: DB_HOST","file":"\/var\/www\/app\/config\/production\/database.php","line":7}}".
Но с публичным IP-адресом моей локальной машины он работает. По какой-либо причине он возвратит ошибку из одного домена, но не другой? API работает на Laravel 4.2.
Вывод базы данных .php
<?php
return array(
'default' => 'pgsql',
'connections' => array(
'pgsql' => array(
'host' => $_ENV['DB_HOST'],
'port' => $_ENV['DB_PORT'],
'database' => $_ENV['DB_NAME'],
'username' => $_ENV['DB_USER'],
'password' => $_ENV['DB_PASS'],
),
),
);
Эти значения взяты из /var/www/.env.php, который выглядит как
return array(
'DB_HOST' => 'my-app.cvrrctfasmvk.us-east-1.rds.amazonaws.com',
'DB_PORT' => '*****',
'DB_NAME' => '**************',
'DB_USER' => '**********',
'DB_PASS' => '***********',
'SMTP_HOST' => '*******************',
'SMTP_USER' => '***********************',
'SMTP_PASS' => '********************************',
'AWS_KEY' => '****************************',
'AWS_SECRET' => '*******************',
'AWS_QUEUE' => '*****************************************',
'FB_APP_ID' => '*****************',
'FB_APP_SECRET' => '*********************'
);
Файл хоста DB выглядит, кстати, так. причем, конечно, идентифицируемые значения изменяются на x
<?php
return array(
'DB_HOST' => 'my-app-.xxxxxx.us-east-1.xxx.amazonaws.com',
'DB_PORT' => 'xxxx',
'DB_NAME' => 'xxxx_app_xxx_db',
'DB_USER' => 'xxxx',
'DB_PASS' => 'xxxx',
'SMTP_HOST' => 'email-xxx.xxxx.amazonaws.com',
'SMTP_USER' => 'xxxxxxx',
'SMTP_PASS' => 'xxxx',
'AWS_KEY' => 'xxx',
'AWS_SECRET' => 'xxxx',
'AWS_QUEUE' => 'https://sqs.xxxxx.amazonaws.com/xxxx',
'FB_APP_ID' => 'xxxxx',
'FB_APP_SECRET' => 'xxxx'
);
Похоже, у него проблемы с чтением файла /var/www/.env.php. Поскольку первый элемент массива возвращает ошибку.
Ответы
Ответ 1
Лучше всего проверить строку variables_order
в файле php.ini
, она контролирует порядок загрузки супер-глобалов и какие переменные вы хотите иметь, скорее всего, вам не хватает E в variables_order
string.
Из справочных страниц PHP:
variable_order string Устанавливает порядок обработки переменных EGPCS (Environment, Get, Post, Cookie и Server). Например, если для параметра variable_order установлено значение "SP", тогда PHP создаст суперглобалы $_SERVER и $_POST, но не создаст $_ENV, $_GET и $_COOKIE. Установка в значение "" означает, что суперклассы не будут установлены.
Подробнее здесь PHP man pages
Я думаю, что вы загружаете $_ENV
только локально, так как у вас, вероятно, есть разные файлы php.ini
.
Ответ 2
Ясно, что когда вы получите это сообщение об ошибке, это потому, что ваша переменная $_ENV
не имеет индекса DB_HOST.
Иногда переменные среды отсутствуют в суперглобальном $_ENV
, но могут быть выбраны с помощью getenv()
Я только что протестировал это на своем веб-сервере (под управлением PHP 5.5.9):
<?php
// test.php
echo $_ENV['PATH'];
?>
затем
$ php test.php
PHP Notice: Undefined index: PATH in /tmp/env.php on line 2
пока это работает:
<?php
// test.php
echo getenv("PATH");
?>
$ php test.php
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games