getenv()有时在CodeIgniter 4中返回false,为什么?

wz8daaqr  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(130)

我正在将使用 AJAX 获取的表数据加载到一个包含datatables的表中。逻辑使用getenv()函数从.env文件中获取一些值。getenv()只在某些时候返回false,否则不会返回。
我试着在浏览器中打开数据表用来通过 AJAX 获取数据的URL(HTTP GET),在那里似乎一点问题都没有。

public function ap_FetchData()
{
    $accountLibrary = new Account();
    if($accountLibrary->checkIsUserLogged())
    {
        // do some stuff and print JSON - dummy logic
        $data = [];
        for($i=1;$i<=10;$i++)
        {
            $image = getBucketURL($i.".jpg");
            $data[] = $image;
        }
        outPutAsJSON($data);
    }
    else outPutAsJSON("Your session is timed-out. Please login again.", 403);
}

有时候我会得到带有Bucket URL(部分)的JSON输出,有时候我会得到session is timed-out错误。然而,这种session timed-out行为只在 AJAX 上可见。
checkIsUserLogged位于库目录下的Account.php中

function checkIsUserLogged(): bool
{
    $sessionName = getenv("session.name"); // this is the session name stored in env file sometimes and false sometimes 
    // do validation and return true or false
}

getBucketURL()位于帮助文件中。

function getBucketURL($key)
{
    return getenv("s3bucket.url").$key;
    /*
     * some times this return as http://www.example.com/$key
     * and
     * some times it return only $key
     * var_dump(getenv("s3bucket.url")) outputs (bool) false is second case
     */
}

预期产出:

{
    "http://www.example.com/1.jpg",
    "http://www.example.com/2.jpg",
    "http://www.example.com/3.jpg",
    .
    .
    "http://www.example.com/10.jpg"
}

实际问题输出:

{
    "1.jpg",
    "2.jpg",
    "3.jpg",
    .
    .
    "10.jpg"
}

编辑

$_SERVER["s3bucket.url]$_ENV["s3bucket.url]$_SERVER["session.name]$_ENV["session.name]工作完美。似乎问题只出在getenv()

uurv41yg

uurv41yg1#

要获得更 “防弹” 的解决方案,请使用CodeIgniter 4的helper函数:
env(string $key, $default = null).
即:

echo env("s3bucket.url");

它首先搜索$_ENV变量中的 'key',然后搜索$_SERVER环境变量,最后搜索getenv(string $varname, bool $local_only = false) PHP函数。

摘自:

https://github.com/codeigniter4/CodeIgniter4/blob/develop/system/Common.php

if (! function_exists('env')) {
    /**
     * Allows user to retrieve values from the environment
     * variables that have been set. Especially useful for
     * retrieving values set from the .env file for
     * use in config files.
     *
     * @param string|null $default
     *
     * @return bool|string|null
     */
    function env(string $key, $default = null)
    {
        $value = $_ENV[$key] ?? $_SERVER[$key] ?? getenv($key);

        // Not found? Return the default value
        if ($value === false) {
            return $default;
        }

        // Handle any boolean values
        switch (strtolower($value)) {
            case 'true':
                return true;

            case 'false':
                return false;

            case 'empty':
                return '';

            case 'null':
                return null;
        }

        return $value;
    }
}

相关问题