Примечание - эта проблема решена, но я публикую здесь, чтобы понять, что происходит, потому что я не понимаю.
Конфигурация моего общего хоста по умолчанию - PHP 5.2.17. Когда я спросил их, могу ли я перейти на 5.3.X, они ответили точно, и процитировали:
Добавлен обработчик для PHP 5.3 на наших общих и посреднических серверах для
те, кто хочет использовать это. Чтобы использовать этот обработчик, вы
потребуется добавить следующий код в ваш файл .htaccess:
Action application/x-hg-php53 /cgi-sys/php53
AddType application/x-hg-php53 .php
Чтобы уточнить, почему у нас нет этого по умолчанию,
это связано с проблемами совместимости старых PHP-скриптов с новыми
Версия 5.3. Поэтому, чтобы не допустить взлома старых скриптов на сайтах наших клиентов, мы оставили версию PHP по умолчанию как 5.2.X.
Итак, я сделал это и быстро обнаружил, что это убило мои сайты с помощью PDO. В результате вызова new PDO();
класс не обнаружил ошибок в журнале.
Ответ поддержки общего хоста был:
Наши установки PHP 5.3 уже имеют включенный PDO. Вопрос здесь
кажется, вызвано пользовательским php.ini на основе php.ini для PHP
5.2, поэтому он пытается загрузить модули PHP 5.2 вместо модулей PHP 5.3.
ок, кажется разумным, говорит я, теперь иди и исправь это!
Они обновили INI-файл и добавили обработчики в мой .htaccess, и ...
Ваш сайт загружается правильно, но сообщите нам, если вы обнаружите какие-либо проблемы.
, что было правдой, теперь основной сайт и PDO работали нормально, и проверка phpinfo()
действительно подтвердила, что я был на 5.3.8, но затем, через несколько часов, работа cron умерла огненной смертью:
[16.12.2011 03:00:01] Предупреждение PHP: Запуск PHP: невозможно загрузить динамическую библиотеку '/ opt / php53 / lib / php / extensions / no-debug-non-zts-20090626 / pdo. so '- /opt/php53/lib/php/extensions/no-debug-non-zts-20090626/pdo.so: неопределенный символ: gc_remove_zval_from_buffer в Неизвестный в строке 0
и журнал ошибок из каталога заданий cron:
[16-Dec-2011 03:00:01] Предупреждение PHP: require_once (../ pghqClasses / PDO.php) [function.require-Once]: не удалось открыть поток: нет такого файла или каталога в / home /XXXXXX/pghqIncs/initCron.php в строке 19
Итак, снова вызовы PDO не выполняются, но на этот раз только для заданий cron .
Окончательный ответ команды поддержки:
Я видел такое поведение раньше, когда относительные пути в скриптах PHP не указывают на правильное место. Согласно руководству по PHP, одно из различий между CLI php и другими интерфейсами для PHP состоит в том, что CLI PHP не будет изменять каталоги в соответствии со сценарием. http://www.php.net/manual/en/features.commandline.differences.php
Чтобы это исправить, я добавил строку:
chdir (dirname ( FILE ));
в начало вашего скрипта cron, так что при его выполнении он изменит каталоги на каталоги скрипта, что заставит работать относительный путь. При запуске с веб-сайта эта строка по существу ничего не делает, но она должна заставить ваш cronjob работать правильно.
И это действительно работает. Мои задания в cron работают без сбоев, и мой основной сайт работает хорошо, и все довольны на 5.3.8, но эта последняя часть устранения неполадок полностью потеряла меня, и я хотел бы, чтобы кто-то объяснил мне, как может произойти сбой включений cron, но НЕ для public_html
скрипта, почему мы chdir()
и так далее?
Спасибо, и извините за длину ...