Ошибки PHP на cronjob, отлично работает при подсказке

Я запускаю следующий скрипт на cronjob …

cd /etc/parselog/ php run_all.php >/dev/null 

и я получаю следующие ошибки:

 [05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './pdo.so' - ./pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0 [05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './mysql.so' - ./mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0 [05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './mysql.so' - ./mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0 [05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './mysqli.so' - ./mysqli.so: cannot open shared object file: No such file or directory in Unknown on line 0 [05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './odbc.so' - ./odbc.so: cannot open shared object file: No such file or directory in Unknown on line 0 [05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './pdo.so' - ./pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0 [05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './pdo_mysql.so' - ./pdo_mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0 [05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './pdo_odbc.so' - ./pdo_odbc.so: cannot open shared object file: No such file or directory in Unknown on line 0 [05-May-2009 20:30:12] PHP Warning: PHP Startup: Unable to load dynamic library './pdo_sqlite.so' - ./pdo_sqlite.so: cannot open shared object file: No such file or directory in Unknown on line 0 [05-May-2009 20:30:12] PHP Fatal error: Call to undefined function mysql_connect() in /etc/parselog/stats_downloads.php on line 5 

Однако, когда я запускаю один и тот же сценарий из командной строки, журнал вступает в работу без ошибок.

Это строка $ PATH в командной строке:

 $PATH = /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin 

Любые идеи или предложения? Я уверен, что при запуске cronjob у него нет пути к lib или что-то в нем. Я даже попытался добавить точный путь

Solutions Collecting From Web of "Ошибки PHP на cronjob, отлично работает при подсказке"

Совет 1: Убедитесь, что у вас есть точно такой же $ PATH в задании cron:

 cd /etc/parselog/ export PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin php run_all.php >/dev/null 

Совет 2. Убедитесь, что все другие переменные среды совпадают. Сбросьте среду с помощью команды env и добавьте соответствующий экспорт в ваше задание cron.

Обычно, когда что-то терпит неудачу во время cron, но запускается в командной строке, это разрешения, рабочая директория или переменные среды.

Похоже, что сам исполняемый файл php не загружает библиотеки, проблема может быть не в вашем скрипте.

Когда вы запускаете скрипт в задании cron, он запускается в ограниченной оболочке с очень небольшим набором переменных окружения. Из ваших ошибок похоже, что LD_LIBRARY_PATH должен быть установлен как ошибки, относящиеся к кучке разделяемых библиотек, но это всего лишь предположение. Похоже, что правильные пути библиотеки для PHP не настроены правильно в скрипте cron.

Вы можете захватить среду, используемую при запуске скрипта cron, добавив команду env в скрипт и захватив вывод. Сравните это с выходом env в командной строке и найдите варианты. Скорее всего, они будут из команд, выпущенных либо в вашем локальном, либо в системном профиле, либо в файлах bashrc (или, возможно, даже .login ), которые устанавливают пути к библиотеке. Я специально ищу пути и переменные, связанные с PHP, поскольку это, кажется, ваша проблема.

Мне пришлось несколько раз разбираться с этой проблемой в моем последнем проекте, и основным решением является:

  1. определить минимальную среду, необходимую для выполнения скрипта
  2. создайте короткий скрипт, который настроит требуемую среду
  3. добавьте вызов сценария из пункта 2 сценария, запускающего ваши приложения, чтобы среда была настроена правильно.
  4. Тщательно проверьте, чтобы вы не пропустили ничего :-).

Когда задание cron запускается от пользователей crontab, оно выполняется как этот пользователь. Однако он не содержит никаких файлов в домашнем каталоге пользователей, таких как их .profile, .cshrc или .bashrc или любой другой файл. Если вам нужен cron для источника (read) любого файла, который вам понадобится для вашего скрипта, вы должны сделать это из скрипта cron. Настройка путей, поиск файлов, настройка переменных среды и т. Д.