Cách cài đặt pthreads để thử code multithreading trong PHP.

Bài viết hướng dẫn cách cài đặt extension pthreads cho phép chúng ta có thể thao tác với thread, hay thấy dân chúng dịch lập trình đa luồng trong PHP.  Việc xử lý đa luồng trong PHP vốn tương đối lạ và ít tài liệu trên thế giới và nước mình cũng vậy. Bài viết nằm trong loạt bài viết về PHP Multithreading trên blog KiKiGuru.

Mình xin nhắc luôn là do extension pthreads đã ngừng phát triển từ năm 2018. Các bạn không nên dùng nó để làm product đem bán nhé. Mình viết bài này cho các bạn sinh viên là chính, mình hi vọng rằng các bạn có thể hiểu sơ sơ về threading trong PHP hoặc cho bạn nào thích vọc vọc mà thôi.

Sơ sơ về extension pthreads của krakjoe

Trước tiên PHP core khi phát hành thì không hỗ trợ việc thao tác với threading. Để làm được điều này thì mình phải cài đặt một extension của php là pthreads. Source code của extension này các bạn có thể tìm trên github, mình kèm link bên dưới cho bạn nào lười nhé. Như đã đề cập ở trên thì extension này đã ngưng phát triển từ năm 2018. Tác giả của extension này đã chuyển sang phát triển một cái khác tương tự là krakjoe/parallel để thực hiện xử lý song song trên PHP.

Một vài điểm yếu của ext pthreads

  • pthreads đã ngưng phát triển
  • Multi-threading chỉ support cho các ứng dụng console, cli thôi nên khôn chạy được với PHP FPM hay Apache.

Nói cũng hơi nhiều rồi, tới lúc chiến rồi anh em..

Hướng dẫn cài đặt pthreads trên windows 10.

Mình xin hướng dẫn các bạn cài đặt pthreads trên windows 10 để lập trình đa luồng, bạn nào xài linux hay Mac nếu có nhu cầu thì comment bên dưới, nếu có nhu cầu thì mình sẽ viết thêm cách làm trên Linux nhé (do mình ko có Mac).

Vài lưu ý trước khi cài đặt nè:

  • Mình cần PHP 7.2 ZTS, cái này là bắt buộc và nhớ là bản ZTS chứ không phải NTS nhé. Hiện tại thì phiên bản mà PHP còn hỗ trợ là PHP 7.3 nên để cài đặt PHP 7.2 ZTS thì bạn phải tìm lại phiên bản cũ trên internet nhé, mình có thể download tại link này:
  • pthreads version cuối cùng là 3.2.0, các bạn download nó tại github nhé, chứ trên php.net thì mới có 3.1.x thôi. Mà theo mình thấy chỉ có bản 3.2.0 là còn chạy tàm tạm thôi nhé mấy bạn.

Cách cài đặt pthreads tương đối giống với như các extension khác, các bạn cần làm 2 việc để cài đặt đó là.

Bước 1: Tải về PHP 7.2 ZTS

Việc đầu tiên cần làm là cài đặt PHP 7.2 ZTS, cái này là khá tốn công vì như đề cập thì PHP cũng ngưng support version 7.2 luôn rồi. Các bạn download PHP 7.2 ở đây nhé:

https://windows.php.net/downloads/releases/archives/php-7.2.9-Win32-VC15-x64.zip

Bước 2:  Tải về pthreads từ github

Tải về bản php-pthreads cuối cùng từ github thông qua link này nha:

https://github.com/krakjoe/pthreads/releases/download/v3.2.0/php_pthreads-3.2.0-7.2-ts-vc15-x64.zip

Tải xuống xong rồi giải nén rồi copy mấy file dll theo thông tin sau nha. Lưu ý rằng mình cài đặt php tại đường dẫn C:\bin\php nên các bạn chắc sẽ phải khác chút nhé.

  • Copy file php_pthreads.dll copy vào thư mục ext của PHP, của mình là C:\bin\php\ext.
  • Copy file pthreadvc2.dll vào thu mục có cái file thực thi của PHP php.exe, của mình sẽ là C:\bin\php.

Sau khi copy xong rồi thì bạn thêm vào php.ini thông tin để nó load cái ext lên thôi, đơn giản như làm mấy cái extension khác vậy.

; On windows: 
extension_dir = "ext"
 
;Load pthreads 
extension=pthreads

Thêm một lưu ý nữa là bạn cần đảm bảo php.exe được tìm thấy trong biến môi trường $PATH của windows 10 nhé.

Add PHP vào biến môi trường PATH

Bước 3:  Kiểm tra việc cài đặt pthreads

Kiểm tra việc cài đặt khá đơn giản,  bạn kiểm tra module pthreads có được load không bằng lệnh php -m trong cmd. Lệnh php -m sẽ cho bạn biết thông tin những module mà PHP đang sử dụng.

Kiểm tra pthreads trong php.

Để cho chắc ăn hơn thì mình sẽ test nhẹ pthread bằng một đoạn script PHP đơn giản thế này.

<?php

class KikiThreaded extends Thread
{
    private $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

    //This is where all of your work will be done.
    public function run()
    {
        for ($i = 0; $i < 10; $i++) {
            echo sprintf('..hi thread %s..', $this->id);
            if ($this->id === 0) {
                echo PHP_EOL;
            }
            sleep(rand(2, 10));
        }
    }
}

$allThreads = [];
for ($i = 0; $i < 5; $i++) {
    $newThread = new KikiThreaded($i);
    $newThread->start();
    $allThreads[] = $newThread;
}
array_map(function ($thread) {
    $thread->join();
}, $allThreads);

Chương trình này sẽ in ra random threadId, nếu bạn thấy thứ tự mấy cái threadId nó xuất ra không đúng thứ tự tăng dần 1, 2, 3 bạn đã đi qua được chặn đường gian khổ số 1 rồi đó.

Tới đây là bạn đã hoàn thành xong việc cài đặt pthread cho PHP trong windows 10 rồi đó.

Kết nhẹ

Vậy là mình đã hướng dẫn xong cài đặt pthreads trong PHP để lập trình multithreading trong PHP rồi đó. Vì vấn đề này khá ít bạn quan tâm, nên mình cần bạn nào thấy bài viết còn thiếu sót hay có ý kiến gì thì để lại tí comment để mình còn biết là có bạn đang gặp vấn đề để hỗ trợ nhé.

Chúc các bạn một ngày tốt lành.


Bài mình có tham khảo thông tin tại các nguồn:

  1. pthreads – https://github.com/krakjoe/pthreads
  2. PHP docs – https://www.php.net/manual/en/book.pthreads.php