MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Cara Menjalankan Aplikasi PHP 5 dengan MySQL 8.0 di CentOS 7

Terlepas dari kenyataan bahwa PHP 5 telah mencapai akhir masa pakainya, masih ada aplikasi lama yang dibangun di atasnya yang perlu dijalankan di lingkungan produksi atau pengujian. Jika Anda menginstal paket PHP melalui repositori sistem operasi, masih ada kemungkinan Anda akan berakhir dengan paket PHP 5, mis. Sistem operasi CentOS7. Karena itu, selalu ada cara untuk membuat aplikasi lawas Anda berjalan dengan versi database yang lebih baru, dan dengan demikian memanfaatkan fitur-fitur baru.

Dalam posting blog ini, kami akan memandu Anda melalui bagaimana kami dapat menjalankan aplikasi PHP 5 dengan versi terbaru MySQL 8.0 pada sistem operasi CentOS 7. Blog ini didasarkan pada pengalaman nyata dengan proyek internal yang membutuhkan aplikasi PHP 5 untuk berjalan bersama MySQL 8.0 baru kami di lingkungan baru. Perhatikan bahwa menjalankan versi terbaru PHP 7 bersama MySQL 8.0 akan bekerja paling baik untuk memanfaatkan semua peningkatan signifikan yang diperkenalkan di versi yang lebih baru.

PHP dan MySQL di CentOS 7

Pertama-tama, mari kita lihat file apa saja yang disediakan oleh paket php-mysql:

$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
$ repoquery -q -l --plugins php-mysql
/etc/php.d/mysql.ini
/etc/php.d/mysqli.ini
/etc/php.d/pdo_mysql.ini
/usr/lib64/php/modules/mysql.so
/usr/lib64/php/modules/mysqli.so
/usr/lib64/php/modules/pdo_mysql.so

Secara default, jika kita menginstal komponen LAMP stack standar datang dengan CentOS 7, misalnya:

$ yum install -y httpd php php-mysql php-gd php-curl mod_ssl

Anda akan menginstal paket terkait berikut ini:

$ rpm -qa | egrep 'php-mysql|mysql|maria'
php-mysql-5.4.16-46.el7.x86_64
mariadb-5.5.60-1.el7_5.x86_64
mariadb-libs-5.5.60-1.el7_5.x86_64
mariadb-server-5.5.60-1.el7_5.x86_64

Modul terkait MySQL berikut akan dimuat ke dalam PHP:

$ php -m | grep mysql
mysql
mysqli
pdo_mysql

Saat melihat versi API yang dilaporkan oleh phpinfo() untuk klien terkait MySQL, semuanya cocok dengan versi MariaDB yang telah kami instal:

$ php -i | egrep -i 'client.*version'
Client API version => 5.5.60-MariaDB
Client API library version => 5.5.60-MariaDB
Client API header version => 5.5.60-MariaDB
Client API version => 5.5.60-MariaDB

Pada titik ini, kita dapat menyimpulkan bahwa modul php-mysql yang diinstal telah dibuat dan kompatibel dengan MariaDB 5.5.60.

Menginstal MySQL 8.0

Namun, dalam proyek ini, kami diharuskan untuk menjalankan MySQL 8.0 sehingga kami memilih Percona Server 8.0 untuk menggantikan instalasi MariaDB default yang kami miliki di server tersebut. Untuk melakukan itu, kita harus menginstal Percona Repository dan mengaktifkan repositori Percona Server 8.0:

$ yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
$ percona-release setup ps80
$ yum install percona-server-server

Namun, kami mendapatkan kesalahan berikut setelah menjalankan perintah terakhir:

--> Finished Dependency Resolution
Error: Package: 1:mariadb-5.5.60-1.el7_5.x86_64 (@base)
           Requires: mariadb-libs(x86-64) = 1:5.5.60-1.el7_5
           Removing: 1:mariadb-libs-5.5.60-1.el7_5.x86_64 (@anaconda)
               mariadb-libs(x86-64) = 1:5.5.60-1.el7_5
           Obsoleted By: percona-server-shared-compat-8.0.15-6.1.el7.x86_64 (ps-80-release-x86_64)
               Not found
Error: Package: 1:mariadb-server-5.5.60-1.el7_5.x86_64 (@base)
           Requires: mariadb-libs(x86-64) = 1:5.5.60-1.el7_5
           Removing: 1:mariadb-libs-5.5.60-1.el7_5.x86_64 (@anaconda)
               mariadb-libs(x86-64) = 1:5.5.60-1.el7_5
           Obsoleted By: percona-server-shared-compat-8.0.15-6.1.el7.x86_64 (ps-80-release-x86_64)
               Not found
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

Di atas berarti bahwa paket compat bersama Percona Server akan menghapus mariadb-libs-5.5.60, yang diperlukan oleh paket mariadb-server yang sudah diinstal. Karena ini adalah server baru, menghapus paket MariaDB yang ada bukanlah masalah besar. Mari kita hapus dulu dan coba instal Percona Server 8.0 sekali lagi:

$ yum remove mariadb mariadb-libs
...
Resolving Dependencies
--> Running transaction check
---> Package mariadb-libs.x86_64 1:5.5.60-1.el7_5 will be erased
--> Processing Dependency: libmysqlclient.so.18()(64bit) for package: perl-DBD-MySQL-4.023-6.el7.x86_64
--> Processing Dependency: libmysqlclient.so.18()(64bit) for package: 2:postfix-2.10.1-7.el7.x86_64
--> Processing Dependency: libmysqlclient.so.18()(64bit) for package: php-mysql-5.4.16-46.el7.x86_64
--> Processing Dependency: libmysqlclient.so.18(libmysqlclient_18)(64bit) for package: perl-DBD-MySQL-4.023-6.el7.x86_64
--> Processing Dependency: libmysqlclient.so.18(libmysqlclient_18)(64bit) for package: 2:postfix-2.10.1-7.el7.x86_64
--> Processing Dependency: libmysqlclient.so.18(libmysqlclient_18)(64bit) for package: php-mysql-5.4.16-46.el7.x86_64
--> Processing Dependency: mariadb-libs(x86-64) = 1:5.5.60-1.el7_5 for package: 1:mariadb-5.5.60-1.el7_5.x86_64
---> Package mariadb-server.x86_64 1:5.5.60-1.el7_5 will be erased
--> Running transaction check
---> Package mariadb.x86_64 1:5.5.60-1.el7_5 will be erased
---> Package perl-DBD-MySQL.x86_64 0:4.023-6.el7 will be erased
---> Package php-mysql.x86_64 0:5.4.16-46.el7 will be erased
---> Package postfix.x86_64 2:2.10.1-7.el7 will be erased

Menghapus mariadb-libs juga akan menghapus paket lain yang bergantung padanya dari sistem. Perhatian utama kami adalah paket php-mysql yang akan dihapus karena ketergantungan pada libmysqlclient.so.18 yang disediakan oleh mariadb-libs. Kami akan memperbaikinya nanti.

Setelah itu, kita seharusnya dapat menginstal Percona Server 8.0 tanpa kesalahan:

$ yum install percona-server-server

Pada titik ini, berikut adalah paket terkait MySQL yang kami miliki di server:

$ rpm -qa | egrep 'php-mysql|mysql|maria|percona'
percona-server-client-8.0.15-6.1.el7.x86_64
percona-server-shared-8.0.15-6.1.el7.x86_64
percona-server-server-8.0.15-6.1.el7.x86_64
percona-release-1.0-11.noarch
percona-server-shared-compat-8.0.15-6.1.el7.x86_64

Perhatikan bahwa kami tidak memiliki paket php-mysql yang menyediakan modul untuk menghubungkan aplikasi PHP kami dengan server Percona Server 8.0 yang baru diinstal. Kami dapat mengonfirmasi ini dengan memeriksa modul PHP yang dimuat. Anda harus mendapatkan output kosong dengan perintah berikut:

$ php -m | grep mysql

Mari kita instal lagi:

$ yum install php-mysql
$ systemctl restart httpd

Sekarang kami memilikinya dan dimuat ke PHP:

$ php -m | grep mysql
mysql
mysqli
pdo_mysql

Dan kami juga dapat mengonfirmasinya dengan melihat info PHP melalui baris perintah:

$ php -i | egrep -i 'client.*version'
Client API version => 5.6.28-76.1
Client API library version => 5.6.28-76.1
Client API header version => 5.5.60-MariaDB
Client API version => 5.6.28-76.1

Perhatikan perbedaan pada versi library API Klien dan versi header API. Kita akan melihat pengaruh setelahnya nanti selama pengujian.

Mari kita mulai server MySQL 8.0 kita untuk menguji aplikasi PHP5 kita. Karena MariaDB menggunakan datadir di /var/lib/mysql, kita harus menghapusnya terlebih dahulu, menginisialisasi ulang datadir, menetapkan kepemilikan yang tepat, dan memulainya:

$ rm -Rf /var/lib/mysql
$ mysqld --initialize
$ chown -Rf mysql:mysql /var/lib/mysql
$ systemctl start mysql

Ambil kata sandi root MySQL sementara yang dihasilkan oleh Percona Server dari file log kesalahan MySQL:

$ grep root /var/log/mysqld.log
2019-07-22T06:54:39.250241Z 5 [Note] [MY-010454] [Server] A temporary password is generated for [email protected]: 1wAXsGrISh-D

Gunakan untuk login saat pertama kali login pengguna [email protected] Kita harus mengubah kata sandi sementara menjadi sesuatu yang lain sebelum kita dapat melakukan tindakan lebih lanjut di server:

$ mysql -uroot -p
mysql> ALTER USER [email protected] IDENTIFIED BY 'myP455w0rD##';

Kemudian, lanjutkan untuk membuat sumber daya basis data yang diperlukan oleh aplikasi kami:

mysql> CREATE SCHEMA testdb;
mysql> CREATE USER [email protected] IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON testdb.* TO [email protected];

Setelah selesai, impor data yang ada dari cadangan ke database, atau buat objek database Anda secara manual. Basis data kami sekarang siap digunakan oleh aplikasi kami.

Kesalahan dan Peringatan

Dalam aplikasi kami, kami memiliki file pengujian sederhana untuk memastikan aplikasi dapat terhubung melalui soket, atau dengan kata lain, localhost pada port 3306 untuk menghilangkan semua koneksi database melalui jaringan. Segera, kami akan mendapatkan peringatan ketidakcocokan versi:

$ php -e test_mysql.php
PHP Warning:  mysqli::mysqli(): Headers and client library minor version mismatch. Headers:50560 Library:50628 in /root/test_mysql.php on line 9

Pada saat yang sama, Anda juga akan menemukan kesalahan otentikasi dengan modul php-mysql:

$ php -e test_mysql.php
PHP Warning:  mysqli::mysqli(): (HY000/2059): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory in /root/test_mysql.php on line 9

Atau, jika Anda menjalankan dengan pustaka driver asli MySQL (php-mysqlnd), Anda akan mendapatkan kesalahan berikut:

$ php -e test_mysql.php
PHP Warning:  mysqli::mysqli(): The server requested authentication method unknown to the client [caching_sha2_password] in /root/test_mysql.php on line 9

Selain itu, akan ada juga masalah lain yang akan Anda lihat terkait rangkaian karakter:

PHP Warning:  mysqli::mysqli(): Server sent charset (255) unknown to the client. Please, report to the developers in /root/test_mysql.php on line 9

Solusi dan Solusi

Plugin otentikasi

Pustaka php-mysqlnd atau php-mysql untuk PHP5 tidak mendukung metode otentikasi baru untuk MySQL 8.0. Mulai dari metode otentikasi MySQL 8.0.4 telah diubah menjadi 'caching_sha2_password', yang menawarkan hashing kata sandi yang lebih aman jika dibandingkan dengan 'mysql_native_password' yang default di versi sebelumnya.

Untuk memungkinkan kompatibilitas mundur pada MySQL 8.0 kami. Di dalam file konfigurasi MySQL, tambahkan baris berikut di bawah bagian [mysqld]:

default-authentication-plugin=mysql_native_password

Mulai ulang server MySQL dan Anda harus baik-baik saja. Jika pengguna basis data telah dibuat sebelum perubahan di atas, misalnya melalui pencadangan dan pemulihan, buat ulang pengguna dengan menggunakan pernyataan DROP USER dan CREATE USER. MySQL akan mengikuti plugin autentikasi default baru saat membuat pengguna baru.

Ketidakcocokan versi kecil

Dengan paket php-mysql, jika kita memeriksa versi library yang diinstal, kita akan melihat perbedaannya:

$ php -i | egrep -i 'client.*version'
Client API version => 5.6.28-76.1
Client API library version => 5.6.28-76.1
Client API header version => 5.5.60-MariaDB
Client API version => 5.6.28-76.1

Pustaka PHP dikompilasi dengan MariaDB 5.5.60 libmysqlclient, sedangkan versi API klien pada versi 5.6.28, disediakan oleh paket percona-server-shared-compat. Meskipun ada peringatan, Anda masih bisa mendapatkan respons yang benar dari server.

Untuk menekan peringatan ini pada ketidakcocokan versi perpustakaan, gunakan paket php-mysqlnd, yang tidak bergantung pada perpustakaan Server Klien MySQL (libmysqlclient). Ini adalah cara yang disarankan, sebagaimana dinyatakan dalam dokumentasi MySQL.

Untuk mengganti library php-mysql dengan php-mysqlnd, jalankan saja:

$ yum remove php-mysql
$ yum install php-mysqlnd
$ systemctl restart httpd

Jika mengganti php-mysql bukanlah pilihan, pilihan terakhir adalah mengkompilasi PHP dengan library Server Klien MySQL 8.0 (libmysqlclient) secara manual dan menyalin file library yang dikompilasi ke direktori /usr/lib64/php/modules/, menggantikan mysqli lama. jadi, mysql.so dan pdo_mysql.so. Ini sedikit merepotkan dengan kemungkinan kecil untuk tingkat keberhasilan, sebagian besar karena dependensi file header yang tidak digunakan lagi dalam versi MySQL saat ini. Pengetahuan tentang pemrograman diperlukan untuk mengatasinya.

Chartset Tidak Kompatibel

Mulai dari MySQL 8.0.1, MySQL telah mengubah set karakter default dari latin1 menjadi utf8mb4. Kumpulan karakter utf8mb4 berguna karena saat ini database harus menyimpan tidak hanya karakter bahasa tetapi juga simbol, emoji yang baru diperkenalkan, dan sebagainya. Charset utf8mb4 adalah pengkodean UTF-8 dari kumpulan karakter Unicode menggunakan satu hingga empat byte per karakter, jika dibandingkan dengan utf8 standar (alias utf8mb3) yang menggunakan satu hingga tiga byte per karakter.

Banyak aplikasi warisan tidak dibangun di atas kumpulan karakter utf8mb4. Jadi alangkah baiknya jika kita mengubah pengaturan karakter untuk server MySQL menjadi sesuatu yang dapat dimengerti oleh driver PHP lawas kita. Tambahkan dua baris berikut ke dalam konfigurasi MySQL di bawah bagian [mysqld]:

collation-server = utf8_unicode_ci
character-set-server = utf8

Opsional, Anda juga dapat menambahkan baris berikut ke file konfigurasi MySQL untuk merampingkan semua akses klien untuk menggunakan utf8:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

Jangan lupa untuk me-restart server MySQL agar perubahan diterapkan. Pada titik ini, aplikasi kita seharusnya cocok dengan MySQL 8.0.

Itu saja untuk saat ini. Bagikan umpan balik apa pun dengan kami di bagian komentar jika Anda memiliki masalah lain saat memindahkan aplikasi lama ke MySQL 8.0.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MariaDB MaxScale Load Balancing di Docker:Manajemen:Bagian Kedua

  2. MariaDB JSON_EXTRACT() Dijelaskan

  3. Memindahkan Database MariaDB ke Status Terenkripsi dan Tidak Terenkripsi

  4. Cara Mengurangi Jam dari Nilai Datetime di MariaDB

  5. Bagaimana SYS_GUID() Bekerja di MariaDB