Это связано с этот предыдущий вопрос. Я задаю новый вопрос, потому что на данный момент считаю, что это проблема доступа к базе данных.
По сути, из-за миграции сервера я переключил базу данных с сервера MySql на сервер Amazon RDS MySql. Подводя итог, я пытаюсь перенести сайт PHP на основе CodeIgniter (версия 1.7.2) на новый сервер с операционной системой AmazonLinux. Предыдущим сервером был Ubuntu, на котором работал PHP 5.3.3-1ubuntu9.5 на Apache2. Версия PHP на новом сервере AmazonLinux — 5.3.29, работающая на httpd.
Проблема в том, что, когда я пытаюсь получить доступ к URL на новом сервере, я получаю пустой экран. Код останавливается в system / core / CodeIgniter.php в этой строке:
$CI = new $class();
Последняя строка журнала приложения выглядит так:
DEBUG - 2015-04-25 17:17:58 --> Database Driver Class Initialized
Итак, это происходит вокруг базы данных. Я также читал, что вы получаете пустое отображение, если это проблема с базой данных из-за того, что «@» используется для сообщений, связанных с базой данных.
Это настройки в database.php:
$active_group = "default";
$active_record = TRUE;
$db['default']['hostname'] = "xxxxx.xxxxxxxx.us-east-1.rds.amazonaws.com";
$db['default']['username'] = "xxxxx";
$db['default']['password'] = "xxxxx";
$db['default']['database'] = "xxxxx";
$db['default']['dbdriver'] = "mysql";
$db['default']['port'] = 3306;
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = "TRUE";
// $db['default']['cache_on'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "/opt/xxxxx/cachedb/";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
Я также попробовал это сделать без указания порта (как он настроен на текущем производственном сайте), а также с портом, указанным в конце URL:
$db['default']['hostname'] = "xxxxx.xxxxxxxx.us-east-1.rds.amazonaws.com:3306";
Но я все еще получаю пустой дисплей.
У нас есть приложение Java / Tomcat, работающее на том же сервере, который может получить доступ к базе данных RDS, используя тот же URL-адрес, имя и пароль, поэтому это не является проблемой групп безопасности.
Есть мысли о том, в чем может быть проблема? и если да, то как решить?
Изменить 1: я разыскал проблему — не удивительно, что это драйвер базы данных. Сбой при вызове этой функции:
система / база данных / драйверы / mysqli / mysqli_driver.php: функция db_pconnect ()
Вопрос в том, могу ли я просто скопировать более свежий драйвер в эту более старую версию CodeIgnitor, и он будет чудесным образом работать? Я попробую этот эксперимент завтра. В противном случае мы могли бы посмотреть на обновление. Мрачно, но теоретически это должно сработать, поскольку у него будет обновленный драйвер. Правильно?
Проблема оказалась проблемой доступа к базе данных. В частности, оказалось, что версия PHP на новом сервере не поддерживает устаревшие вызовы API-интерфейсов php-mysql (например, @mysql_pconnect или @mysql_connect)
Решение было
1) Загрузите библиотеку mysql, которая поддерживает устаревшие вызовы. В случае AmazonLinux это достигается следующим образом:
sudo yum install php-mysql
2) Найдите, где была загружена библиотека, например,
find / -name mysql.so
Возможно, это было показано и при установке, но это способ найти его в любое время. YMMV, но в моем случае имя библиотеки было:
/usr/lib64/php-zts/modules/mysql.so
3) Измените php.ini (как показано в phpinfo при вызове со страницы php на сервере httpd / apached) следующим образом:
а) измените «extension_dir», чтобы показать, где установлен mysql.so:
extension_dir = "/usr/lib64/php-zts/modules"
б) Затем добавьте следующие строки:
extension=mysqli.so
extension=mysql.so
extension=pdo_mysql.so
Перезагрузите Apache, и вы должны быть готовы к работе.
Примечание: конкретный устаревший вызов, который не поддерживается, который является частью версии CodeIgnitor, с которой я работаю, был следующим:
return @mysql_pconnect($this->hostname, $this->username, $this-// etc.
Журнал ошибок php показал эту ошибку:
PHP Fatal error: Call to undefined function mysql_connect() in xxx.php on line xx
Разрешите порт 3306 на вашем сервере. Я буду возможен только когда у вас есть доступ к WHM. В противном случае свяжитесь с администратором вашего сервера.