Выполнить PHP через cron – Нет указанного входного файла

Я использую следующую команду для выполнения PHP-файла через cron

php -q /home/seilings/public_html/dvd/cron/mailer.php 

Проблема заключается в том, что у меня есть файл, который включен в исполнение, который определяет, какую конфигурацию загружать … например, следующее:

 if (!strstr(getenv('HTTP_HOST'), ".com")) { $config["mode"] = "local"; } else { $config["mode"] = "live"; } 

Cron загружает LOCAL config, когда он должен загружать конфигурацию LIVE. Я пытался использовать URL http: // для файла вместо абсолютного пути, но не нашел файл. Нужно ли мне изменять команду, чтобы использовать в ней URL?

Используйте этот php_sapi_name() чтобы проверить, вызван ли сценарий в командной строке:

 if (php_sapi_name() === 'cli' OR !strstr(getenv('HTTP_HOST'), ".com")) { $config["mode"] = "local"; } else { $config["mode"] = "live"; } 

Если вы хотите использовать «live» в командной строке, используйте этот код:

 if (php_sapi_name() === 'cli' OR strstr(getenv('HTTP_HOST'), ".com")) { $config["mode"] = "live"; } else { $config["mode"] = "local"; } 

Еще одно простое решение:

хрон:

 php -q /home/seilings/public_html/dvd/cron/mailer.php local 

PHP:

 if (!empty($argv[0])) { $config["mode"] = "local"; } else { $config["mode"] = "live"; } 

Когда вы запускаете php с cron, очень вероятно, что тогда переменная среды « HTTP_HOST » не будет установлена ​​(или равна нулю), а когда null будет присвоен функции strstr , strstr вернет false , поэтому режим установлен на "local" .

Вероятно, вы получаете другой набор переменных среды, когда вы выполняете свою команду через cron, по сравнению с командной строкой. Возможно, вам потребуется написать сценарий оболочки, который устанавливает среду так, как вы хотите, прежде чем запускать команду PHP.

Переменная HTTP_HOST такая как HTTP_HOST существует только при запуске php-скриптов под веб-сервером. Но вы можете добавить его вручную в конфигурацию crontab:

 ## somewhere in crontab config HTTP_HOST=somthing.com 15 * * * * /path/to/your/script > /dev/null 2>&1 

Это позволит вашему сценарию думать, что он работает на производственной среде.

Если вы чувствуете себя ленивым и не хотите, чтобы все эти переменные env работали, вы можете попробовать запустить cron, используя:

lynx -dump http://url.to.your.script > /dev/null