BabyWolf - Nguyễn Vũ Tuấn Anh

Blog cá nhân chia sẻ về thiết kế web, SEO, Online Marketing, giải pháp web, cuộc sống và nhật ký của tôi.

Khắc phục lỗi module PHP fileinfo khi cài đặt trên CentOS

Thông thường, bạn sẽ cài đặt PHP bằng một gói nào đó hoặc có các phần mềm cài đặt như Vertrigo, Xampp, Lampp, Wamp... có bao gồm cả Apache, PHP, MySQL... Sau khi cài đặt xong thì PHP cũng sẽ tự động cài đặt một số modules có sẵn.

Nhìn chung là mình không rõ lắm trên Windows thì có bị lỗi hay không do mình cũng ít khi quan tâm bởi vì thường mình chỉ ứng dụng Apache, PHP, MySQL làm localhost là chính. Thế nhưng trên Linux và đặc biệt là đối với CentOS mình thấy sau khi cài đặt PHP thường hay xuất hiện lỗi module fileinfo. Mặc dù lỗi này không ngăn cản PHP Engine được thực thi nhưng sẽ được ghi vào file log error.

Nếu website của bạn có lượng truy cập đông thì việc xuất hiện nhiều lỗi trong file log cũng là điều mà bạn cần quan tâm. Bởi vì file log càng lớn thì cũng làm chậm phần nào web server của bạn. Vì vậy, nếu bạn là một người quan tâm đến tốc độ website của mình thì cũng cần khắc phục lỗi này. Với những website có lượng truy cập đông, việc file log của bạn lên đền hàng GB là chuyện bình thường. Và hãy thử tưởng tượng cứ mỗi request thì Apache lại load file đó lên để ghi cũng sẽ làm chậm hệ thống của bạn phần nào.

Cụ thể hơn, bạn có thể kiểm tra bằng cách vào xem error log của Apache để biết có bị lỗi hay không. Đường dẫn file log thường nằm trong /var/log trên linux và chính xác ở đâu thì còn tùy vào các gói web server mà bạn cài đặt. Để biết được chính xác error log nằm ở trong folder nào bạn có thể vào file cấu hình của apache, ví dụ như httpd.conf và tìm dòng có khai báo directive ErrorLog để biết được đường dẫn chính xác.

Lỗi module fileinfo mà bạn có thể gặp sẽ được ghi trong file log với dạng như sau:
PHP Warning: PHP Startup: fileinfo: Unable to initialize module
Module compiled with module API=20050922, debug=0, thread-safety=0
PHP compiled with module API=20060613, debug=0, thread-safety=0
These options need to match

Dưới đây sẽ là bài hướng dẫn bạn cách khắc phục trên CentOS. Đầu tiên bạn cần xác định một số thông số của module fileinfo bằng câu lệnh:
$ yum list installed | grep "php-pecl-Fileinfo"
php-pecl-Fileinfo.x86_64 1.0.4-3.el5.centos installed

Như ví dụ ở trên thì gói module fileinfo là php-pecl-fileinfo.x86_64. Tên file có thể hoàn toàn không chính xác như tôi đưa ra vì còn tùy theo hệ thống của bạn, như 32 bit hay 64 bit.

Tương ứng với gói được cài đặt ở trên thì việc kế tiếp của bạn là cần remove gói này đi bằng câu lệnh sau:
$ yum erase php-pecl-Fileinfo.x86_64
...
Running Transaction
Erasing : php-pecl-Fileinfo 1/1
warning: /etc/php.d/Fileinfo.ini saved as /etc/php.d/Fileinfo.ini.rpmsave

Removed:
php-pecl-Fileinfo.x86_64 0:1.0.4-3.el5.centos

Complete!

Công việc tiếp theo là bạn cần cài lại gói này thông qua pecl:
$ pecl install fileinfo
audit_log_user_command(): Connection refused
WARNING: "pear/Fileinfo" is deprecated in favor of "channel://php-src/ext/fileinfo/in php sources"
downloading Fileinfo-1.0.4.tgz ...
Starting to download Fileinfo-1.0.4.tgz (5,835 bytes)
.....done: 5,835 bytes
3 source files, building
running: phpize

...lotsa crap...

build process completed successfully
Installing '/usr/lib64/php/modules/fileinfo.so'
install ok: channel://pear.php.net/Fileinfo-1.0.4
$

Trong quá trình xử lý ở trên bạn cũng thấy phpize được thực thi để cài đặt. Có thể có một khả năng nữa là quá trình cài đặt sẽ bị fail nếu như bạn chưa có command phpize. Trong trường hợp này bạn cần cài phpize thông qua gói php-devel bằng lệnh bên dưới trước khi thực thi dòng trên:
$ yum install php-devel

Sau đó, bạn cần khai báo cho PHP để load module này khi thực thi bằng việc thêm dòng dưới đây vào php.ini (thường nằm trong /etc):
extension=fileinfo.so

Bạn có thể thêm dòng trên dưới phần sau trong file php.ini:
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

Tiếp theo, việc cuối cùng của bạn là phải restart lại apache bằng lệnh bên dưới:
$ service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
$

Để kiểm tra chắc chắn là fileinfo đã được cài đặt hay chưa bạn dùng lệnh theo như bên dưới:
$ php -r "phpinfo();" | grep "fileinfo"
fileinfo
fileinfo support => enabled

Khả năng vẫn có thể có một vài sai sót và sự cố nào đó xảy ra. Bạn có thể đặt câu hỏi bằng cách gửi comment bên dưới bài này của tôi.