来自一个域的API调用但不是其他未定义索引的错误代码:

时间:2017-01-18 21:29:35

标签: php amazon-ec2

有时我的域名(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上运行。

database.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 Host文件看起来像这样。当然,可识别的值被改为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文件时遇到了麻烦。由于数组中的第一项是返回错误。

2 个答案:

答案 0 :(得分:2)

您最好的方法是检查variables_order文件中的php.ini字符串,它确实控制了超级全局加载的顺序以及您想要拥有的变量,最有可能是您在variables_order字符串中遗漏了一个E.

从PHP手册页:

  

variables_order字符串   设置EGPCS(Environment,Get,Post,Cookie和Server)变量解析的顺序。例如,如果variables_order设置为&#34; SP&#34;然后PHP将创建超级全局$ _SERVER和$ _POST,但不创建$ _ENV ,$ _GET和$ _COOKIE。设置为&#34;&#34; 表示不会设置超级全局

在此处阅读更多PHP man pages

我认为您只在本地加载$_ENV,因为您可能有不同的php.ini个文件。

答案 1 :(得分:1)

显然,当您收到此错误消息时,这是因为您的$_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