Hướng dẫn nâng cấp PHP 8 cho website WordPress

Chạy các trang Web của bạn trên PHP 7.1 hoặc phiên bản thấp hơn sẽ khiến chúng gặp rủi ro về các vấn đề bảo mật. Không chỉ vậy, bạn cũng sẽ bỏ lỡ các cải tiến về hiệu suất của hệ thống trong các phiên bản PHP mới hơn. PHP 8 là một phiên bản PHP chính vừa được phát hành, có nghĩa là nó sẽ giới thiệu một số thay đổi đột phá, cũng như nhiều tính năng mới và cải tiến hiệu suất.

Bên cạnh những thay đổi đột phá, PHP 8 cũng mang đến một loạt các tính năng mới như trình biên dịch JIT (JIT Compiler), union typesattributes, v.v.

Các hiệu năng của PHP 8 mang lại

PHP là một hệ thống lớn cần được sửa chữa và cải tiến liên tục. Mỗi phiên bản mới đều đi kèm với các bản sửa lỗi bảo mật trên các phiên bản trước. Vì thế, bạn nên sử dụng các phiên bản PHP mới nhất để ngăn chặn các cuộc tấn công mạng và bảo vệ tài sản, dữ liệu của bạn.

Union Types – Chức năng của PHP 8

Với bản chất được định kiểu động của PHP, có rất nhiều trường hợp mà kiểu liên hợp (union types) có thể hữu ích. Các union types là một tập hợp của hai hoặc nhiều kiểu cho biết rằng một trong hai kiểu đó có thể được sử dụng.

public function foo(Foo|Bar $input): int|float;

Lưu ý rằng void không bao giờ có thể là một phần của union type, vì nó chỉ ra ‘không có giá trị trả lại nào cả’. Hơn nữa, nullable có thể được viết bằng cách sử dụng |null, hoặc bằng cách sử dụng ký hiệu ?:

public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;

Truyền tham số theo tên gọi – function PHP 8

Việc một function có nhiều tham số (với mình là từ 3 tham số trở nên), có thể khiến developer lúng túng khi sử dụng vì không nhớ rõ ý nghĩa của từng tham số, cũng như thứ tự truyền của chúng.

Ví dụ, function mkdir() (function giúp tạo thư mục) trong PHP có 4 tham số lần lượt là:

  • $directory: Bắt buộc, là đường dẫn để tạo thư mục
  • $permissions: Không bắt buộc, là khả năng truy cập vào thư mục (kiểu 0777, hay 0655), mặc định là 0777.
  • $recursive: Không bắt buộc, có cho phép tạo thư mục con ngay cả khi thư mục cha không tồn tại (cho phép tạo kiểu đệ quy), mặc định là false.
  • $context: Không bắt buộc, còn ý nghĩa là gì thì mình cũng chẳng hiểu lắm, chưa bao giờ dùng đến tham số này.

Các vấn đề mà một developer có thể gặp phải khi sử dụng mkdir() đó là:

  • Đôi khi không nhớ rõ thứ tự của 2 tham số $permissions và $recursive, không biết tham số nào được viết trước.
  • Nếu muốn đổi giá trị của tham số $recursive từ false thành true, developer buộc phải truyền cả tham số $permissions (vì $permissions đứng trước $recursive).

Cả hai vấn đề trên đều gây bất tiện khi sử dụng, để khắc phục nó, thì PHP cung cấp cú pháp mới cho phép truyền tham số theo tên gọi:

1
2
3
4
5
6
7
8
9
<?php
// PHP 7.x
mkdir('./hello/world', 0777, true);
// PHP 8
mkdir(recursive: true, directory: './hello/world');
// Hoặc
mkdir('./hello/world', recursive: true);

Lưu ý:
– Đây chỉ là cú pháp mới mà PHP 8 cung cấp để tiện sử dụng hơn khi cần, còn bạn vẫn có thể sử dụng cú pháp cũ bình thường trên phiên bản PHP 8 này.

– Tên tham số bạn không được phép “tự nghĩ ra” mà phải tuân theo tài liệu của PHP. Như trong ví dụ trên, recursive và directory là 2 tham số mà mình buộc phải tuân theo tài liệu mà PHP cung cấp.

Trình biên dịch JIT trong PHP 8

Mặc dù không phải lúc nào là ưu tiên hàng đầu của webstie. Mình đã thực hiện các bài test của riêng mình trên các ứng dụng web ngoài đời thực và có vẻ như JIT không tạo ra nhiều khác biệt. Hiểu nhanh thì JIT (Just In Time) là một kỹ thuật được PHP tích hợp vào việc biên dịch code PHP thành mã máy, giúp PHP 8 đạt được hiệu năng cao gấp 1,5 – 2 lần so với PHP 7. Nhưng đừng vội mừng, hãy xem biểu đồ dưới đây và mình sẽ giải thích cho bạn hiểu:

  • bench.php, micro_bech.php, N-body, Mandelbrot đều là các bài test trên ứng dụng PHP đơn giản.
  • Các bài test còn lại, lần lượt test trên các ứng dụng PHP có độ phức tạp tăng dần.
  • Đường màu đen, kẻ dọc ở biểu đồ trên là ngưỡng tối đa khi PHP không sử dụng JIT

Ứng dụng PHP đơn giản khi áp dụng JIT mới có hiệu năng cao, còn các ứng dụng PHP phức tạp, sử dụng các framework, cms phổ biến như WordPress, Symfony (Chắc laravel cũng không ngoại lệ) thì sử dụng JIT lại không đem lại nhiều lợi ích. Thậm chí như trường hợp của Symfony khi áp dụng JIT còn làm ứng dụng chạy chậm hơn so với lúc không áp dụng.

Cập nhật khác trên PHP 8

ột số cập nhật điển hình khác trên PHP 8 như sau:

  • Thay vì sử dụng PHPDoc để chú thích, PHP 8 đã cung cấp thêm cấu trúc metadata.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// PHP 7
class PostsController
{
    /**
     * @Route("/api/posts/{id}", methods={"GET"})
     */
    public function get($id) { /* ... */ }
}
// PHP 8
class PostsController
{
    #[Route("/api/posts/{id}", methods: ["GET"])]
    public function get($id) { /* ... */ }
}
  • Toán tử @ vốn để “câm lặng lỗi” không còn được sử dụng ở PHP 8.
1
2
3
4
5
6
<?php
// Khi thêm @ phía trước, nếu function có thực hiện lỗi cũng sẽ không báo lỗi
// Nhưng đó đã là quá khứ rồi.
// Ở PHP 8 vẫn báo lỗi bình thường
@unlink('hello/world');
  • Cụm try {} catch () {} có thể không cần biến $exception trong catch.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
// PHP 7
try {
    1/0;
} catch (\Exception) { // Sẽ báo lỗi cú pháp ở dòng này
    die('Something wrong');
}
// PHP 8
try {
    1/0;
} catch (\Exception) { // Chạy bình thường
    die('Something wrong');
}
  • Cho phép dấu phẩy ở cuối danh sách tham số.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
// PHP 7
class Uri
{
    private function __construct(
        ?string $scheme,
        ?string $user,
        ?string $pass,
        ?string $host,
        ?int $port,
        string $path,
        ?string $query,
        ?string $fragment // <-- Tham số cuối cùng không được phép có dấu phẩy
    ) {
        ...
    }
}
// PHP 8
class Uri
{
    private function __construct(
        ?string $scheme,
        ?string $user,
        ?string $pass,
        ?string $host,
        ?int $port,
        string $path,
        ?string $query,
        ?string $fragment, // <-- Được phép viết dấu phẩy ở tham số cuối cùng
    ) {
        ...
    }
}
  • Bổ sung một số function mới str_contains(), str_starts_with(), str_ends_with()

Hướng dẫn nâng cấp PHP 8

Để nâng cấp PHP 8 cần chuẩn bị những gì

Phiên bản PHP 8.0, nó có thể yêu cầu lập trình viên duyệt code lại khi có thay đổi. Vì thế, nhà đồng sáng lập, đồng thời cũng là chuyên gia tư vấn chính của PHP Consulting Company, Stefan Priebsch khuyên người dùng phải chuẩn bị nhiều trước khi chuyển đổi, do một số tính năng cũ sẽ bị loại bỏ khỏi phiên bản 8.0.

Điển hình như phiên bản PHP 8.0 không sẵn có các thành phần PHP-PSR, Phalcon 4, ionCube 10, Snuffleupagus, Memcache và SourceGuardian.

Một số phần mềm không tương thích với PHP 8.0:

  • DSO: Mặc dù, máy chủ cPanel hỗ trợ PHP8 nhưng trình xử lý DSO lại không được cPanel hỗ trợ với PHP 8.0.
  • Các phần mở rộng của XMLRPC: Đã được chuyển sang PECL.

Điều kiện nâng cấp PHP 8

  • Hosting, hosting wordpress sử dụng cPanel/ DirectAdmin và được trang bị tính năng cho phép tùy chọn phiên bản PHP (Select PHP Version).
  • Tích hợp sẵn PHP 8.
  • Theme và plugin của bạn tương thích tốt với PHP 8.
  • Web của bạn đã được update lên phiên bản WordPress 5.6 hoặc cao hơn. Các phiên bản WordPress thấp hơn chưa hỗ trợ PHP 8.

Nâng cấp PHP 8

Đầu tiên, các bạn truy cập vào cPanel/ DirectAdmin, tìm mục Select PHP Version và click vào đó.

Trong tab Extensions, các bạn lựa chọn PHP 8 trong mục Current PHP Version rồi click vào nút Set as current. Tiếp theo, thiết lập các extension (module) giống như hình bên dưới.

Extension có thể thay đổi tùy theo từng nhà cung cấp. Tuy nhiên, hãy kích hoạt hết những extension tương tự mà bạn thấy xuất hiện ở trên.

Lưu ý: các thiết lập module kể trên là tối ưu nhất dành cho mã nguồn WordPress, chúng chưa được kiểm nghiệm trên các mã nguồn khác.

Chuyển qua tab Options, các bạn thiết lập các thông số

Các thông số tối đa của memory_limitpost_max_size và upload_max_filesize có thể thay đổi tùy theo nhà cung cấp hosting. Nếu bạn được phép tùy chỉnh thông số nào, hãy cố gắng thiết lập nó giống như hình bên trên. Truy cập website của bạn và kiểm tra xem giao diện cũng như các tính năng đã hoạt động bình thường hay chưa. Nếu rồi thì có nghĩa là các bạn đã nâng cấp PHP 8 thành công. Nếu có lỗi xảy ra, các bạn hãy kiểm tra error_log để xem theme hay plugin nào không tương thích. Trong trường hợp không thể khắc phục, các bạn chỉ cần chuyển về phiên bản PHP cũ là được.

Như vậy đã xong Sieutocviet đã hướng dẫn bạn nâng cấp PHP 8, để xem các bài khác để xây dựng thêm cho website của mình những công nghệ mới nhất:

Hướng dẫn chỉnh sửa widget wordpress

Khắc phục lỗi SSL