Скрипт php 5.5.14, который подключается к базе данных для извлечения данных и их отправки в веб-сервис, отлично работает при запуске в консоли, но не работает в cronjob (crontab). Когда cronjob выполняет сценарий, соединение с базой данных через драйвер pdo_oci не устанавливается, и вместо этого создается исключение «PDOException» с сообщением «SQLSTATE []: (null)».
Я уже пробовал несколько вещей, чтобы найти ошибку, но ничего не помогло. Сначала я проверил установку php через php -m и php -v в cronjob и сравнил модули и версию с версией php при вызове от имени пользователя. Установленные модули и версия были идентичны. Во-вторых, я позволяю cronjob работать под моим пользователем с помощью команды su -u user crontab -e. Затем я зарегистрировал все учетные данные и все, чтобы убедиться, что строка подключения идентична той, которая вызывается напрямую. Строка подключения оказалась идентичной. Я просто не могу понять, почему скрипт запускается при запуске непосредственно в консоли, а не в cronjob.
Следующая строка устанавливает соединение с базой данных через драйвер pdo_oci:
$con = new PDO('oci:dbname='//dburl:port/dbserver, dbuser, dbpassword);
Сценарий выполняется через crontab следующим образом:
*/1 * * * * /usr/bin/php /path/to/script/phpscript.php -params
Как указывалось ранее, обычно соединение устанавливается, но при запуске с помощью cronjob возникает исключение PDOException с сообщением «SQLSTATE []: (null)». Как ни странно, скрипт уже запущен на другом сервере, и там все отлично работает.
Я знаю, что используемая версия php очень старая, моя задача — выполнить миграцию 1: 1, и мне не разрешено обновлять версию php.
Я наконец нашел решение, если у кого-то когда-либо будет та же самая проблема, это может вам помочь. Случайно я обнаружил, что система каким-то образом использовала другую версию клиента мгновенного доступа oracle, чем мой пользователь. Каким-то образом, даже если скрипт вызывался с моим пользователем в cronjob, это не имело значения, поскольку оно всегда использовало бы неправильную версию. Убедитесь, что установлена только правильная версия клиента мгновенного доступа oracle и что только эта версия экспортируется как путь к библиотеке.
Других решений пока нет …