Код ошибки из вызова 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