Relative path not working in cron PHP script

前端 未结 8 1500
甜味超标
甜味超标 2020-11-28 07:59

If a PHP script is run as a cron script, the includes often fail if relative paths are used. For example, if you have

require_once(\'foo.php\');
相关标签:
8条回答
  • 2020-11-28 08:27

    Change the working directory to the running file path. Just use

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

    in the running file. Then you won't need to change all the relative paths to absolute paths in every page.

    0 讨论(0)
  • 2020-11-28 08:28

    The only chance I got "require_once" to work with cron and apache at the same time was

    require_once(dirname(__FILE__) . '/../setup.php');
    
    0 讨论(0)
  • 2020-11-28 08:29

    The working directory of the script may be different when run from a cron. Additionaly, there was some confusion about PHPs require() and include(), which caused confusion about the working directory really being the problem:

    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
    
    0 讨论(0)
  • 2020-11-28 08:33

    Because the "current working directory" for cron jobs will be the directory where your crontab file exists -- so any relative paths with be relative to THAT directory.

    The simplest way to handle that is with dirname() function and PHP __FILE__ constant. Otherwise, you will need to edit the file with new absolute paths whenever you move the file to a different directory or a server with a different file structure.

    dirname( __FILE__ )
    

    __FILE__ is a constant defined by PHP as the full path to the file from which it is called. Even if the file is included, __FILE__ will ALWAYS refer to the full path of the file itself -- not the file doing the including.

    So dirname( __FILE__ ) returns the full directory path to the directory containing the file -- no matter where it is included from and basename( __FILE__ ) returns the file name itself.

    example: Let's pretend "/home/user/public_html/index.php" includes "/home/user/public_html/your_directory/your_php_file.php".

    If you call dirname( __FILE__ ) in "your_php_file.php" you would get "/home/user/public_html/your_directory" returned even though the active script is in "/home/user/public_html" (note the absence of the trailing slash).

    If you need the directory of the INCLUDING file use: dirname( $_SERVER['PHP_SELF'] ) which will return "/home/user/public_html" and is the same as calling dirname( __FILE__ ) in the "index.php" file since the relative paths are the same.

    example usages:

    @include dirname( __FILE__ ) . '/your_include_directory/your_include_file.php';
    
    @require dirname( __FILE__ ) . '/../your_include_directory/your_include_file.php';
    
    0 讨论(0)
  • 2020-11-28 08:35

    When executed trough a cron job your PHP script probably runs in different context than if you start it manually from the shell. So your relative paths are not pointing to the right path.

    0 讨论(0)
  • 2020-11-28 08:40

    In addition to the accepted answer above, you can also use:

    chdir(__DIR__);
    
    0 讨论(0)
提交回复
热议问题