MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

Cách chạy ứng dụng PHP 5 với MySQL 8.0 trên CentOS 7

Mặc dù thực tế là PHP 5 đã hết tuổi thọ, vẫn có những ứng dụng kế thừa được xây dựng trên nó cần phải chạy trong môi trường sản xuất hoặc thử nghiệm. Nếu bạn đang cài đặt các gói PHP thông qua kho lưu trữ hệ điều hành, vẫn có khả năng bạn sẽ kết thúc với các gói PHP 5, ví dụ:Hệ điều hành CentOS 7. Phải nói rằng, luôn có một cách để làm cho các ứng dụng cũ của bạn chạy với các phiên bản cơ sở dữ liệu mới hơn và do đó tận dụng các tính năng mới.

Trong bài đăng blog này, chúng tôi sẽ hướng dẫn bạn cách chạy các ứng dụng PHP 5 với phiên bản MySQL 8.0 mới nhất trên hệ điều hành CentOS 7. Blog này dựa trên kinh nghiệm thực tế với một dự án nội bộ yêu cầu ứng dụng PHP 5 chạy cùng với MySQL 8.0 mới của chúng tôi trong một môi trường mới. Lưu ý rằng tốt nhất nên chạy phiên bản PHP 7 mới nhất cùng với MySQL 8.0 để tận dụng tất cả các cải tiến quan trọng được giới thiệu trong các phiên bản mới hơn.

PHP và MySQL trên CentOS 7

Trước hết, hãy xem gói php-mysql đang cung cấp những tệp nào:

$ 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

Theo mặc định, nếu chúng tôi đã cài đặt các thành phần ngăn xếp LAMP tiêu chuẩn đi kèm với CentOS 7, ví dụ:

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

Bạn sẽ cài đặt các gói liên quan sau:

$ 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

Sau đó, các mô-đun liên quan đến MySQL sau đây sẽ được tải vào PHP:

$ php -m | grep mysql
mysql
mysqli
pdo_mysql

Khi xem phiên bản API được báo cáo bởi phpinfo () cho các máy khách liên quan đến MySQL, tất cả chúng đều khớp với phiên bản MariaDB mà chúng tôi đã cài đặt:

$ 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

Tại thời điểm này, chúng ta có thể kết luận rằng mô-đun php-mysql đã cài đặt được xây dựng và tương thích với MariaDB 5.5.60.

Cài đặt MySQL 8.0

Tuy nhiên, trong dự án này, chúng tôi bắt buộc phải chạy trên MySQL 8.0 nên chúng tôi đã chọn Percona Server 8.0 để thay thế cài đặt MariaDB mặc định hiện có mà chúng tôi có trên máy chủ đó. Để làm điều đó, chúng ta phải cài đặt Percona Repository và kích hoạt Percona Server 8.0 repository:

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

Tuy nhiên, chúng tôi đã gặp lỗi sau khi chạy lệnh cuối cùng:

--> 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

Ở trên chỉ đơn giản có nghĩa là gói máy chủ chia sẻ Percona Server sẽ lỗi thời mariadb-libs-5.5.60, được yêu cầu bởi các gói máy chủ mariadb đã được cài đặt. Vì đây là một máy chủ mới hoàn toàn nên việc loại bỏ các gói MariaDB hiện có không phải là một vấn đề lớn. Trước tiên, hãy xóa chúng và sau đó thử cài đặt Percona Server 8.0 một lần nữa:

$ 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

Xóa mariadb-libs cũng sẽ xóa các gói khác phụ thuộc vào gói này khỏi hệ thống. Mối quan tâm chính của chúng tôi là các gói php-mysql sẽ bị xóa do phụ thuộc vào libmysqlclient.so.18 do mariadb-libs cung cấp. Chúng tôi sẽ sửa lỗi đó sau.

Sau đó, chúng ta có thể cài đặt Percona Server 8.0 mà không gặp lỗi:

$ yum install percona-server-server

Tại thời điểm này, đây là các gói liên quan đến MySQL mà chúng tôi có trong máy chủ:

$ 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

Lưu ý rằng chúng tôi không có gói php-mysql cung cấp các mô-đun để kết nối ứng dụng PHP của chúng tôi với máy chủ Percona Server 8.0 mới được cài đặt của chúng tôi. Chúng tôi có thể xác nhận điều này bằng cách kiểm tra mô-đun PHP đã tải. Bạn sẽ nhận được đầu ra trống bằng lệnh sau:

$ php -m | grep mysql

Hãy cài đặt lại nó:

$ yum install php-mysql
$ systemctl restart httpd

Bây giờ chúng tôi đã có chúng và được tải vào PHP:

$ php -m | grep mysql
mysql
mysqli
pdo_mysql

Và chúng tôi cũng có thể xác nhận điều đó bằng cách xem thông tin PHP qua dòng lệnh:

$ 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

Lưu ý sự khác biệt trên phiên bản thư viện API ứng dụng khách và phiên bản tiêu đề API. Chúng tôi sẽ xem ảnh hưởng sau của điều đó sau trong quá trình thử nghiệm.

Hãy khởi động máy chủ MySQL 8.0 của chúng tôi để thử nghiệm ứng dụng PHP5 của chúng tôi. Vì chúng tôi đã có MariaDB sử dụng datadir trong / var / lib / mysql, trước tiên chúng tôi phải xóa nó, khởi tạo lại datadir, gán quyền sở hữu thích hợp và khởi động nó:

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

Lấy mật khẩu gốc MySQL tạm thời do Máy chủ Percona tạo từ tệp nhật ký lỗi 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

Sử dụng nó để đăng nhập trong lần đăng nhập đầu tiên của người dùng [email protected] Chúng tôi phải thay đổi mật khẩu tạm thời thành mật khẩu khác trước khi chúng tôi có thể thực hiện bất kỳ hành động nào khác trên máy chủ:

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

Sau đó, tiến hành tạo tài nguyên cơ sở dữ liệu theo yêu cầu của ứng dụng:

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

Sau khi hoàn tất, hãy nhập dữ liệu hiện có từ bản sao lưu vào cơ sở dữ liệu hoặc tạo các đối tượng cơ sở dữ liệu của bạn theo cách thủ công. Cơ sở dữ liệu của chúng tôi hiện đã sẵn sàng để ứng dụng của chúng tôi sử dụng.

Lỗi và Cảnh báo

Trong ứng dụng của chúng tôi, chúng tôi đã có một tệp thử nghiệm đơn giản để đảm bảo ứng dụng có thể kết nối qua socket, hay nói cách khác, localhost trên cổng 3306 để loại bỏ tất cả các kết nối cơ sở dữ liệu qua mạng. Ngay lập tức, chúng tôi sẽ nhận được cảnh báo phiên bản không khớp:

$ 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

Đồng thời, bạn cũng sẽ gặp phải lỗi xác thực với mô-đun 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

Hoặc, nếu bạn đang chạy với thư viện trình điều khiển gốc MySQL (php-mysqlnd), bạn sẽ gặp lỗi sau:

$ 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

Ngoài ra, cũng sẽ có một vấn đề khác mà bạn sẽ thấy liên quan đến bộ ký tự:

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

Giải pháp và Cách giải quyết

Plugin xác thực

Thư viện php-mysqlnd và php-mysql cho PHP5 đều không hỗ trợ phương thức xác thực mới cho MySQL 8.0. Bắt đầu từ MySQL 8.0.4, phương pháp xác thực đã được thay đổi thành 'caching_sha2_password', cung cấp hàm băm mật khẩu an toàn hơn nếu so sánh với 'mysql_native_password' được mặc định trong các phiên bản trước.

Để cho phép khả năng tương thích ngược trên MySQL 8.0 của chúng tôi. Bên trong tệp cấu hình MySQL, thêm dòng sau trong phần [mysqld]:

default-authentication-plugin=mysql_native_password

Khởi động lại máy chủ MySQL và bạn sẽ ổn. Nếu người dùng cơ sở dữ liệu đã được tạo trước những thay đổi ở trên, ví dụ:thông qua sao lưu và khôi phục, hãy tạo lại người dùng bằng cách sử dụng câu lệnh DROP USER và CREATE USER. MySQL sẽ tuân theo plugin xác thực mặc định mới khi tạo người dùng mới.

Phiên bản nhỏ không khớp

Với gói php-mysql, nếu chúng tôi kiểm tra phiên bản thư viện được cài đặt, chúng tôi sẽ nhận thấy sự khác biệt:

$ 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

Thư viện PHP được biên dịch với MariaDB 5.5.60 libmysqlclient, trong khi phiên bản API máy khách là phiên bản 5.6.28, được cung cấp bởi gói percona-server-shared-compat. Bất chấp cảnh báo, bạn vẫn có thể nhận được phản hồi chính xác từ máy chủ.

Để loại bỏ cảnh báo này về phiên bản thư viện không khớp, hãy sử dụng gói php-mysqlnd, gói này không phụ thuộc vào thư viện Máy chủ Máy khách MySQL (libmysqlclient). Đây là cách được khuyến nghị, như đã nêu trong tài liệu MySQL.

Để thay thế thư viện php-mysql bằng php-mysqlnd, chỉ cần chạy:

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

Nếu thay thế php-mysql không phải là một lựa chọn, thì phương án cuối cùng là biên dịch PHP với thư viện Máy chủ Máy khách MySQL 8.0 (libmysqlclient) theo cách thủ công và sao chép các tệp thư viện đã biên dịch vào thư mục / usr / lib64 / php / modules /, thay thế cho mysqli cũ. vì vậy, mysql.so và pdo_mysql.so. Điều này hơi phức tạp với cơ hội thành công nhỏ, chủ yếu là do các tệp tiêu đề không được dùng nữa trong phiên bản MySQL hiện tại. Cần phải có kiến ​​thức về lập trình để giải quyết vấn đề đó.

Bộ mã không tương thích

Bắt đầu từ MySQL 8.0.1, MySQL đã thay đổi bộ ký tự mặc định từ latin1 thành utf8mb4. Bộ ký tự utf8mb4 rất hữu ích vì ngày nay cơ sở dữ liệu không chỉ phải lưu trữ các ký tự ngôn ngữ mà còn cả các ký hiệu, biểu tượng cảm xúc mới được giới thiệu, v.v. Charset utf8mb4 là mã hóa UTF-8 của bộ ký tự Unicode sử dụng một đến bốn byte cho mỗi ký tự, nếu so sánh với utf8 tiêu chuẩn (a.k.a utf8mb3) sử dụng một đến ba byte cho mỗi ký tự.

Nhiều ứng dụng cũ không được xây dựng trên bộ ký tự utf8mb4. Vì vậy, sẽ rất tốt nếu chúng ta thay đổi cài đặt ký tự cho máy chủ MySQL thành một thứ gì đó có thể hiểu được bằng trình điều khiển PHP kế thừa của chúng ta. Thêm hai dòng sau vào cấu hình MySQL trong phần [mysqld]:

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

Theo tùy chọn, bạn cũng có thể thêm các dòng sau vào tệp cấu hình MySQL để hợp lý hóa tất cả quyền truy cập của máy khách để sử dụng utf8:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

Đừng quên khởi động lại máy chủ MySQL để các thay đổi có hiệu lực. Tại thời điểm này, ứng dụng của chúng ta sẽ tương thích với MySQL 8.0.

Đó là nó cho bây giờ. Hãy chia sẻ bất kỳ phản hồi nào với chúng tôi trong phần nhận xét nếu bạn gặp bất kỳ vấn đề nào khác khi chuyển các ứng dụng cũ sang 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. Cách SECOND () hoạt động trong MariaDB

  2. Cách sao lưu cơ sở dữ liệu Moodle MariaDB của bạn

  3. MariaDB RTRIM () so với RTRIM_ORACLE ():Sự khác biệt là gì?

  4. Cách SQRT () hoạt động trong MariaDB

  5. MariaDB JSON_VALUE () Giải thích