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\');
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.
The only chance I got "require_once" to work with cron and apache at the same time was
require_once(dirname(__FILE__) . '/../setup.php');
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
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';
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.
In addition to the accepted answer above, you can also use:
chdir(__DIR__);