इस तथ्य के बावजूद कि PHP 5 जीवन के अंत तक पहुंच गया है, इसके ऊपर अभी भी लीगेसी एप्लिकेशन बनाए गए हैं जिन्हें उत्पादन या परीक्षण वातावरण में चलाने की आवश्यकता है। यदि आप ऑपरेटिंग सिस्टम रिपॉजिटरी के माध्यम से PHP पैकेज स्थापित कर रहे हैं, तो अभी भी एक मौका है कि आप PHP 5 पैकेज के साथ समाप्त हो जाएंगे, उदा। सेंटोस 7 ऑपरेटिंग सिस्टम। ऐसा कहने के बाद, आपके पुराने अनुप्रयोगों को नए डेटाबेस संस्करणों के साथ चलाने का हमेशा एक तरीका है, और इस प्रकार नई सुविधाओं का लाभ उठाएं।
इस ब्लॉग पोस्ट में, हम आपको बताएंगे कि कैसे हम CentOS 7 ऑपरेटिंग सिस्टम पर MySQL 8.0 के नवीनतम संस्करण के साथ PHP 5 एप्लिकेशन चला सकते हैं। यह ब्लॉग एक आंतरिक प्रोजेक्ट के वास्तविक अनुभव पर आधारित है जिसके लिए एक नए वातावरण में हमारे नए MySQL 8.0 के साथ PHP 5 एप्लिकेशन को चलाने की आवश्यकता होती है। ध्यान दें कि नए संस्करणों में पेश किए गए सभी महत्वपूर्ण सुधारों का लाभ उठाने के लिए PHP 7 के नवीनतम संस्करण को MySQL 8.0 के साथ चलाना सबसे अच्छा काम करेगा।
CentOS 7 पर PHP और MySQL
सबसे पहले, आइए देखें कि 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
डिफ़ॉल्ट रूप से, यदि हम मानक LAMP स्टैक घटकों को स्थापित करते हैं तो CentOS 7 के साथ आते हैं, उदाहरण के लिए:
$ yum install -y httpd php php-mysql php-gd php-curl mod_ssl
आपको निम्नलिखित संबंधित पैकेज स्थापित होंगे:
$ 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
निम्नलिखित MySQL-संबंधित मॉड्यूल तब PHP में लोड किए जाएंगे:
$ php -m | grep mysql
mysql
mysqli
pdo_mysql
MySQL से संबंधित क्लाइंट के लिए phpinfo() द्वारा रिपोर्ट किए गए API संस्करण को देखते समय, वे सभी हमारे द्वारा इंस्टॉल किए गए MariaDB संस्करण से मेल खाते हैं:
$ 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
इस बिंदु पर, हम यह निष्कर्ष निकाल सकते हैं कि स्थापित php-mysql मॉड्यूल मारियाडीबी 5.5.60 के साथ बनाया और संगत है।
MySQL 8.0 स्थापित करना
हालाँकि, इस परियोजना में, हमें MySQL 8.0 पर चलने की आवश्यकता है, इसलिए हमने उस सर्वर पर मौजूद डिफ़ॉल्ट मौजूदा मारियाडीबी स्थापना को बदलने के लिए Percona Server 8.0 को चुना। ऐसा करने के लिए, हमें Percona रिपॉजिटरी को स्थापित करना होगा और 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
हालांकि, आखिरी कमांड चलाने के बाद हमें निम्न त्रुटि मिली:
--> 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
उपरोक्त का सीधा सा अर्थ है कि Percona सर्वर साझा कॉम्पेट पैकेज mariadb-libs-5.5.60 अप्रचलित हो जाएगा, जो पहले से स्थापित mariadb-server संकुल के लिए आवश्यक है। चूंकि यह एक सादा नया सर्वर है, इसलिए मौजूदा मारियाडीबी पैकेजों को हटाना कोई बड़ी समस्या नहीं है। आइए पहले उन्हें हटा दें और फिर Percona Server 8.0 को फिर से स्थापित करने का प्रयास करें:
$ 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
mariadb-libs को हटाने से अन्य पैकेज भी हट जाएंगे जो सिस्टम से इस पर निर्भर करते हैं। हमारी प्राथमिक चिंता php-mysql संकुल है जिसे mariadb-libs द्वारा प्रदान की गई libmysqlclient.so.18 पर निर्भरता के कारण हटा दिया जाएगा। हम इसे बाद में ठीक कर देंगे।
उसके बाद, हमें त्रुटि के बिना Percona Server 8.0 स्थापित करने में सक्षम होना चाहिए:
$ yum install percona-server-server
इस समय, यहाँ MySQL से संबंधित पैकेज हैं जो हमारे पास सर्वर में हैं:
$ 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
ध्यान दें कि हमारे पास php-mysql पैकेज नहीं हैं जो हमारे PHP एप्लिकेशन को हमारे नए स्थापित Percona सर्वर 8.0 सर्वर से जोड़ने के लिए मॉड्यूल प्रदान करते हैं। हम लोड किए गए PHP मॉड्यूल की जांच करके इसकी पुष्टि कर सकते हैं। आपको निम्न कमांड के साथ खाली आउटपुट मिलना चाहिए:
$ php -m | grep mysql
आइए इसे फिर से स्थापित करें:
$ yum install php-mysql
$ systemctl restart httpd
अब हमारे पास ये हैं और PHP में लोड हो गए हैं:
$ php -m | grep mysql
mysql
mysqli
pdo_mysql
और हम यह भी पुष्टि कर सकते हैं कि कमांड लाइन के माध्यम से PHP जानकारी को देखकर:
$ 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
क्लाइंट एपीआई लाइब्रेरी संस्करण और एपीआई हेडर संस्करण पर अंतर देखें। हम बाद में परीक्षण के दौरान इसका असर देखेंगे।
आइए हमारे PHP5 एप्लिकेशन का परीक्षण करने के लिए अपना MySQL 8.0 सर्वर शुरू करें। चूंकि हमारे पास मारियाडीबी ने डेटादिर का उपयोग /var/lib/mysql में किया था, हमें पहले इसे मिटा देना होगा, डेटादिर को फिर से शुरू करना होगा, उचित स्वामित्व प्रदान करना होगा और इसे शुरू करना होगा:
$ rm -Rf /var/lib/mysql
$ mysqld --initialize
$ chown -Rf mysql:mysql /var/lib/mysql
$ systemctl start mysql
MySQL त्रुटि लॉग फ़ाइल से Percona सर्वर द्वारा उत्पन्न अस्थायी 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
उपयोगकर्ता के पहली बार लॉगिन के दौरान लॉगिन करने के लिए इसका उपयोग करें [email protected] सर्वर पर आगे कोई कार्रवाई करने से पहले हमें अस्थायी पासवर्ड को किसी और चीज़ में बदलना होगा:
$ mysql -uroot -p
mysql> ALTER USER [email protected] IDENTIFIED BY 'myP455w0rD##';
फिर, हमारे एप्लिकेशन के लिए आवश्यक हमारे डेटाबेस संसाधन बनाने के लिए आगे बढ़ें:
mysql> CREATE SCHEMA testdb;
mysql> CREATE USER [email protected] IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON testdb.* TO [email protected];
एक बार हो जाने के बाद, मौजूदा डेटा को बैकअप से डेटाबेस में आयात करें, या अपने डेटाबेस ऑब्जेक्ट को मैन्युअल रूप से बनाएं। हमारा डेटाबेस अब हमारे एप्लिकेशन द्वारा उपयोग के लिए तैयार है।
त्रुटियां और चेतावनियां
हमारे आवेदन में, हमारे पास यह सुनिश्चित करने के लिए एक सरल परीक्षण फ़ाइल थी कि एप्लिकेशन सॉकेट के माध्यम से कनेक्ट करने में सक्षम है, या दूसरे शब्दों में, नेटवर्क के माध्यम से सभी डेटाबेस कनेक्शन को खत्म करने के लिए पोर्ट 3306 पर लोकलहोस्ट। तुरंत, हमें संस्करण बेमेल चेतावनी मिलेगी:
$ 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
साथ ही, आप 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
या, यदि आप MySQL नेटिव ड्राइवर लाइब्रेरी (php-mysqlnd) के साथ चल रहे थे, तो आपको निम्न त्रुटि मिलेगी:
$ 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
साथ ही, एक और समस्या भी होगी जिसे आप वर्णसेट के संबंध में देखेंगे:
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
समाधान और समाधान
प्रमाणीकरण प्लगइन
PHP5 के लिए न तो php-mysqlnd और न ही php-mysql पुस्तकालय MySQL 8.0 के लिए नई प्रमाणीकरण विधि का समर्थन करता है। MySQL 8.0.4 से शुरू करके प्रमाणीकरण विधि को 'caching_sha2_password' में बदल दिया गया है, जो पिछले संस्करणों में डिफ़ॉल्ट 'mysql_native_password' की तुलना में अधिक सुरक्षित पासवर्ड हैशिंग प्रदान करता है।
हमारे MySQL 8.0 पर पश्च संगतता की अनुमति देने के लिए। MySQL कॉन्फ़िगरेशन फ़ाइल के अंदर, [mysqld] अनुभाग के अंतर्गत निम्न पंक्ति जोड़ें:
default-authentication-plugin=mysql_native_password
MySQL सर्वर को पुनरारंभ करें और आपको अच्छा होना चाहिए। यदि डेटाबेस उपयोगकर्ता उपरोक्त परिवर्तनों से पहले बनाया गया है, उदाहरण के लिए, बैकअप और पुनर्स्थापना के माध्यम से, DROP USER और CREATE USER स्टेटमेंट का उपयोग करके उपयोगकर्ता को फिर से बनाएं। नया उपयोगकर्ता बनाते समय MySQL नए डिफ़ॉल्ट प्रमाणीकरण प्लगइन का पालन करेगा।
मामूली संस्करण बेमेल
Php-mysql पैकेज के साथ, यदि हम स्थापित पुस्तकालय संस्करण की जांच करते हैं, तो हमें अंतर दिखाई देगा:
$ 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
PHP लाइब्रेरी को MariaDB 5.5.60 libmysqlclient के साथ संकलित किया गया है, जबकि क्लाइंट API संस्करण संस्करण 5.6.28 पर है, जो percona-server-shared-compat पैकेज द्वारा प्रदान किया गया है। चेतावनी के बावजूद, आप अभी भी सर्वर से सही प्रतिक्रिया प्राप्त कर सकते हैं।
लाइब्रेरी संस्करण बेमेल पर इस चेतावनी को दबाने के लिए, php-mysqlnd पैकेज का उपयोग करें, जो MySQL क्लाइंट सर्वर लाइब्रेरी (libmysqlclient) पर निर्भर नहीं है। यह अनुशंसित तरीका है, जैसा कि MySQL दस्तावेज़ में बताया गया है।
php-mysql लाइब्रेरी को php-mysqlnd से बदलने के लिए, बस रन करें:
$ yum remove php-mysql
$ yum install php-mysqlnd
$ systemctl restart httpd
यदि php-mysql को बदलना एक विकल्प नहीं है, तो अंतिम उपाय PHP को MySQL 8.0 क्लाइंट सर्वर लाइब्रेरी (libmysqlclient) के साथ मैन्युअल रूप से संकलित करना है और संकलित लाइब्रेरी फ़ाइलों को /usr/lib64/php/मॉड्यूल/ निर्देशिका में कॉपी करना है, पुराने mysqli की जगह। तो, mysql.so और pdo_mysql.so। सफलता दर की छोटी संभावना के साथ यह थोड़ी परेशानी का कारण है, ज्यादातर वर्तमान MySQL संस्करण में हेडर फाइलों की पदावनत निर्भरता के कारण। इसके आसपास काम करने के लिए प्रोग्रामिंग का ज्ञान आवश्यक है।
असंगत वर्णसेट
MySQL 8.0.1 से शुरू होकर, MySQL ने डिफ़ॉल्ट वर्ण सेट को latin1 से utf8mb4 में बदल दिया है। Utf8mb4 कैरेक्टर सेट उपयोगी है क्योंकि आजकल डेटाबेस में न केवल भाषा के कैरेक्टर बल्कि सिंबल, नए पेश किए गए इमोजी आदि को भी स्टोर करना होता है। यदि मानक utf8 (a.k.a utf8mb3) की तुलना में प्रति वर्ण एक से तीन बाइट्स का उपयोग किया जाता है, तो वर्णसेट utf8mb4 यूनिकोड वर्ण सेट का UTF-8 एन्कोडिंग है, जो प्रति वर्ण एक से चार बाइट्स का उपयोग करता है।
utf8mb4 कैरेक्टर सेट के शीर्ष पर कई लीगेसी एप्लिकेशन नहीं बनाए गए थे। तो यह अच्छा होगा यदि हम MySQL सर्वर के लिए वर्ण सेटिंग को हमारे विरासत PHP ड्राइवर द्वारा समझने योग्य कुछ में बदल दें। [mysqld] अनुभाग के अंतर्गत MySQL कॉन्फ़िगरेशन में निम्नलिखित दो पंक्तियाँ जोड़ें:
collation-server = utf8_unicode_ci
character-set-server = utf8
वैकल्पिक रूप से, आप utf8 का उपयोग करने के लिए सभी क्लाइंट एक्सेस को सुव्यवस्थित करने के लिए MySQL कॉन्फ़िगरेशन फ़ाइल में निम्न पंक्तियाँ भी जोड़ सकते हैं:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
परिवर्तनों को प्रभावी करने के लिए MySQL सर्वर को पुनरारंभ करना न भूलें। इस बिंदु पर, हमारे आवेदन को MySQL 8.0 के साथ मिलना चाहिए।
अभी के लिए बस इतना ही। यदि आपके पास विरासती अनुप्रयोगों को MySQL 8.0 पर ले जाने में कोई अन्य समस्या है, तो टिप्पणी अनुभाग में हमारे साथ कोई प्रतिक्रिया साझा करें।