【问题标题】:PHP Magic ConstantsPHP 魔术常量
【发布时间】:2009-09-29 09:03:54
【问题描述】:

我正在尝试获取正在运行的脚本的文件名(但不是它正在调用的包含)。

echo basename(__FILE__); # will always output include.php

echo basename($_SERVER['SCRIPT_FILENAME']);
# This will do what I want (echo myscript.php), but I was wondering if there was
# a better way to grab it, as I have had problems with $_SERVER['SCRIPT_FILENAME']
# when running certain scripts from a cron.

有什么建议吗?

<?
#myscript.php
require('include.php');
echo "Hello all";
?>

<?
#include.php
echo basename(__FILE__);
echo basename($_SERVER['SCRIPT_FILENAME']);
?>

谢谢!

【问题讨论】:

    标签: constants php


    【解决方案1】:

    您必须使用 $_SERVER['SCRIPT_NAME'],如 reserved_variables 手册页中所述

    'SCRIPT_NAME' 包含当前脚本的路径。这对于需要指向自身的页面很有用。 __FILE__ 常量包含当前(即包含的)文件的完整路径和文件名。

    【讨论】:

    • 只是为了让您知道,无论出于何种原因,我使用 $_SERVER['SCRIPT_FILENAME'] 并且可能 $_SERVER['SCRIPT_NAME'] 的旧服务器在通过 cron 运行时没有返回任何内容.但我同意你关于在 SCRIPT_FILENAME 上使用 SCRIPT_NAME 的观点。所以谢谢
    • $_SERVER["argv"][0] 可能也有你想要的。
    • argv[0] 是由 cmd 行调用的脚本名称,因此包含的路径是绝对的、相对的(path/name.php、./path/name.php 等)取决于您调用脚本的方式。此外,当不在 cli 环境中时,它可能是未定义的
    【解决方案2】:

    如果您在 crontab 中使用了 `php -f /home/me/foo.php(即 php-cli),您可能还对 $argv 数组感兴趣。 $argv[0] 包含最初传递给 php 的脚本的路径/名称。

    【讨论】:

    • 感谢您的帮助!没想过在这种情况下使用它。
    【解决方案3】:

    我对你有什么和没有什么做了一些测试,这是一个对我来说很好的解决方案;) 代码名称为Debug.php的文件,下面是响应日志文件名称的方法。

    在浏览器和 cron 中,我的结果是:test.log

    public static function filename($value = null) {
            static $_filename;
            if (isset($value)) $_filename = $value;
            if ($_filename === null) {
                $_filename = '';
                if (strlen($_SERVER["SCRIPT_FILENAME"])) {
                    $filename = $_SERVER["SCRIPT_FILENAME"];
                } else if (count($_SERVER["argv"])) { // for cron calls
                    $filename = $_SERVER["argv"][0];
                }
                if (!strlen($filename)) {
                    $filename = __FILE__;
                }
                $arr = explode('.', basename($filename));
                $_filename = array_shift($arr) . '.' . Debug::extension();
            }
            return $_filename;
        }
    

    【讨论】:

      【解决方案4】:

      我记得使用过'$_SERVER["SCRIPT_NAME"]',但不知道它是否与玉米有关。

      【讨论】:

        【解决方案5】:

        从命令行执行 PHP 时(可能是您设置 cron 的方式)SCRIPT_FILENAME 将包含 用户指定的路径。如果您的脚本以../myscript.php 执行,那么这就是您将获得的值。无论如何,当您通过basename() 传递值时,它仍然应该满足您的需求。你到底遇到了什么问题?

        SCRIPT_NAME 是另一个要查看的预定义变量,但它也不总是包含执行文件的绝对路径。

        【讨论】:

        • 不太确定为什么会发生或如何发生,从那时起我们已经移动了服务器,现在一切都按预期工作。只是想检查 $_SERVER 变量是否是我应该使用的变量。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-09
        • 1970-01-01
        • 1970-01-01
        • 2012-09-19
        • 2015-09-13
        • 1970-01-01
        相关资源
        最近更新 更多