Why is crontab not executing my PHP script?

Given

*/30 * * * * php /var/www/html/result.php

There are multiple possibilities why it is not working:

  1. First of all it is important to check if the simple execution of php /var/www/html/result.php. This is required. But unfortunately, accomplishing this does not mean that the problem is solved.

  2. The path of the php binary has to be added.

    */30 * * * * php /var/www/html/result.php
    

    to be changed to

    */30 * * * * /usr/bin/php /var/www/html/result.php
    

    or whatever coming from which php.

  3. Check the permission of the script to the user running the crontab.

    Give execution permission to the file: chmod +x file. And make sure the crontab is launched by a user having rights to execute the script. Also check if the user can access the directory in which the file is located.

  4. To be safer, you can also add the php path in the top of the script, such as:

    #!/usr/bin/php -q
    <?php
    
     ...
    
    ?>
    
  5. Make sure the user has rights to use crontab. Check if he is in the /etc/cron.d/deny file. Also, make a basic test to see if it is a crontanb or php problem.

    * * * * * touch /tmp/hello
    
  6. Output the result of the script to a log file, as William Niu suggested.

    */30 * * * * /usr/bin/php /var/www/html/result.php > /tmp/result
    
  7. Use the -f option to execute the script:

    */30 * * * * /usr/bin/php -f /var/www/html/result.php > /tmp/result
    
  8. Make sure the format in crontab is correct. You can do so for example using the site Crontab.guru.


To sum up, there are many possible reasons. One of them should solve the problem.


It may be because php is not in the path. crontab has a very minimal path. So, include the full path for your php program.

you can test your cron commands by piping the output to a file, e.g.

*/30 * * * * php /var/www/html/result.php > /tmp/result.log

From this reference page, under "Crontab Environment":

cron invokes the command from the user’s HOME directory with the shell, (/usr/bin/sh). cron supplies a default environment for every shell, defining:

HOME=user’s-home-directory 
LOGNAME=user’s-login-id
PATH=/usr/bin:/usr/sbin:. 
SHELL=/usr/bin/sh

Also, /30 syntax might not be supported by all platforms, so, try to change it to 0,30 instead.


Had a similar issue; from command line, it worked, but from cron, no go.

had a "include ("./connect.php"); in my php code for the db stuff.

Removed that, and added the connect.php code directly into the php script, and it worked from cron.


I had a similar issue on Ubuntu 14.04.1 and the problem turned out to be the way I was modifying the crontab:

I was using sudo crontab -e instead of just crontab -e and this caused my changes to be ignored.


I had a funny one regarding this. Although my scripts would run manually, they wouldn't run from crontab.

Turns out that because the script was being run from /usr/bin/php rather that the location of the file (as it does when I run it manually) my php require wasn't finding the files I wanted. Changing that to reflect the full address fixed it.

troubleshooting by running the script as /usr/bin/php -f /var/www/myfile.php helped me find the issue