代码之家  ›  专栏  ›  技术社区  ›  Sjoerd

相对路径在cron PHP脚本中不起作用

  •  46
  • Sjoerd  · 技术社区  · 15 年前

    如果PHP脚本作为cron脚本运行,那么如果使用相对路径,则include通常会失败。例如,如果你有

    require_once('foo.php');
    

    一个典型的解决方法是首先chdir到工作目录,或者使用绝对路径。然而,我想知道cron和shell之间有什么不同导致了这种行为。为什么在cron脚本中使用相对路径时失败?

    8 回复  |  直到 15 年前
        1
  •  110
  •   TazGPL    10 年前

    将工作目录更改为正在运行的文件路径。只用

    chdir(dirname(__FILE__));
    include_once '../your_file_name.php'; //we can use relative path after changing directory
    

    在运行文件中。这样就不需要在每个页面中将所有相对路径更改为绝对路径。

        2
  •  14
  •   Sjoerd    14 年前

    从cron运行时,脚本的工作目录可能不同。此外,PHPs require()和include()之间存在一些混淆,这导致了对工作目录的混淆,而工作目录才是真正的问题所在:

    include('foo.php') // searches for foo.php in the same directory as the current script
    include('./foo.php') // searches for foo.php in the current working directory
    include('foo/bar.php') // searches for foo/bar.php, relative to the directory of the current script
    include('../bar.php') // searches for bar.php, in the parent directory of the current working directory
    
        3
  •  7
  •   Sjoerd    12 年前

    我得到“require_once”同时与cron和apache合作的唯一机会是

    require_once(dirname(__FILE__) . '/../setup.php');
    
        4
  •  7
  •   aequalsb    9 年前

    因为cron作业的“当前工作目录”将是crontab文件所在的目录,所以任何具有的相对路径都将是相对于该目录的。

    dirname() 函数与PHP __FILE__ 常数否则,无论何时将文件移动到不同的目录或具有不同文件结构的服务器,都需要使用新的绝对路径编辑该文件。

    dirname( __FILE__ )
    

    __文件__ 是一个常量,由PHP定义为调用它的文件的完整路径。即使包含该文件, __文件__ 将始终引用文件本身的完整路径,而不是执行包含操作的文件。

    所以 dirname( __FILE__ ) basename( __FILE__ ) 返回文件名本身。

    例子:

    如果你打电话 目录名(文件名)

    如果需要包含文件的目录,请使用: dirname( $_SERVER['PHP_SELF'] ) 它将返回“/home/user/public\u html”,与调用相同 在“index.php”文件中,因为相对路径相同。

    示例用法:

    @include dirname( __FILE__ ) . '/your_include_directory/your_include_file.php';
    
    @require dirname( __FILE__ ) . '/../your_include_directory/your_include_file.php';
    
        5
  •  3
  •   John Parker    15 年前

    另一种可能是CLI版本使用了不同的php.ini文件(默认情况下,它将使用php-cli.ini并回退到标准php.ini)

    此外,如果您使用.htaccess文件设置库路径等,则显然无法通过cli进行此操作。

        6
  •  3
  •   Eaten by a Grue kackleyjm    9 年前

    chdir(__DIR__);
    
        7
  •  2
  •   Jan Hančič    15 年前

    当通过cron作业执行时,您的PHP脚本可能在不同的上下文中运行,而不是从shell手动启动。因此,您的相对路径没有指向正确的路径。

        8
  •  0
  •   Jordan Rumpelstiltskin Nemrow    11 年前

    DIR可以工作,但它不会在本地主机上工作,因为它的路径与我的live site server不同。我用这个来修好它。

        if(__DIR__ != '/home/absolute/path/to/current/directory'){ // path for your live server
            require_once '/relative/path/to/file';
        }else{
            require_once '/absolute/path/to/file';
        }