Hướng dẫn php multi thread foreach

Multi-thread là gì?

Multithread cho phép nhiều thành phần trong một chương trình được thực thi đồng thời trong một chương trình. Multithread cho phép ứng dụng của bạn tận dụng hết chức năng xử lý của bộ xử lý trung tâm (CPU).

Hiện tại multithread được hỗ trợ trên các ngôn ngữ hay nền tảng như Java, .Net, v.v....Trong khi đó khái niệm này vẫn chưa thật sự phổ biến trong môi trường của ngôn ngữ PHP. Nguyên nhân của những vấn đề này, cũng như các vấn đề phức tạp hơn mình sẽ thảo luận kỹ hơn vào các bài viết ở các kỳ sau( nếu rảnh)

Hướng dẫn php multi thread foreach
Cài PHP multi thread thôi!

Cài thử

Để chạy được các chương trình có hỗ trợ multithread trong php thì những gì chúng ta cần 2 thứ:

  • PHP phải hỗ trợ ZTS (Zend thread safe), mặc định là bản download về là không có cái này.
  • pthreads extension được load vào PHP

Với điều kiện 1 thì chúng ta cần phải compile là ngôn ngữ PHP  và điều kiện thứ 2 thì các bạn có thể tham khảo tại php.net. Tuy nhiên theo mình thì để cài đặt 2 thứ này khá tốn thời gian và công sức. Do đó mình đề nghị các bạn cài đặt thông qua sử dụng Docker với thời gian cài đặt nhanh và hiệu quả. Do mình đã quên cái xài windows nên các bài viết của mình sẽ chỉ giới thiệu các bạn trên môi trường linux nói chung (thật ra là Ubuntu:14.04 LTS).

  1. Cài docker và pull image có PHP + pthread
//Cài đặt docker

$ sudo curl -fsSL https://get.docker.com | sh
$ sudo usermod -aG docker $USER
$ docker pull wyrihaximus/php70-pthreads

2. Test thử coi chạy dc PHP hok nhé!

$ mkdir multithread && cd multithread
$ echo "<?php echo 'PHP is very nice'.PHP_EOL; " > main.php
$ docker run -it --rm --name multithread -v $(pwd):/multithread wyrihaximus/php70-pthreads /multithread/main.php

Hình bên dưới là kết quả khi thực hiện theo các bước như trên.

Hướng dẫn php multi thread foreach
Run PHP with docker

Bạn nào đang dùng Windows 10 và PHP7 có thể tham khảo bài viết cách cài đặt pthreads trên windows 10 để chiến multithreading.

Hướng dẫn cài đặt pthreads để 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ể thaotá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ìnhcũng vậy. Bài viết nằm trong loạt bài viết về PHP Multithread…

Ricky Nguyễn

Hướng dẫn php multi thread foreach

Lập trình thử multi-thread trong PHP

Để chạy đoạn code trên thì mình chạy thử theo hình bên dưới nhé.

Hướng dẫn php multi thread foreach

Bài này khá đơn giản, do mình đang chạy dự án nên không có viết chi tiết dc.

PS. Bạn nào gặp khó khăn gì về php và multithread có thể comment bên dưới để mình chỉnh sửa thêm nhé.

Sắp tới mình sẽ ra loạt bài về PHP multithreading, hi vọng được sự ủng hộ của các bạn.

Hướng dẫn php multi thread foreach

Đã đăng vào thg 12 28, 2015 4:33 CH 3 phút đọc

PHP Multithreading

PHP tiếp tục phát triển kể từ khi nó được ra đời vào những ngày các web đầu tiên ra đời. Tại thời điểm khởi đầu các nguyên tắc cốt lõi và chức năng của nó, máy tính cá nhân không mạnh mẽ như một số các thiết bị di động hiện đại. Máy Server cũng khá chậm.

Tuy nhiên, với công nghệ ngày nay, tất cả mọi thứ ngày hôm nay đều có một bộ xử lý đa lõi. Điện thoại, máy tính, máy tính xách tay, máy tính bảng và các thiết bị của tất cả các loại và cấu hình bây giờ có thể tận dụng tốt đa luồng. Vậy tại sao không nên cho máy chủ của bạn tận dụng nó một cách hiệu quả? Vâng, bây giờ luồng đã được giới thiệu với PHP 7, nó có thể sử dụng đa luồng.

Multi-Threading cho phép bạn sử dụng hết tài nguyên của máy thông minh. Thay vì chạy tất cả mọi thứ trong cơ chế thực hiện liên tục từ trên xuống dưới, bạn có thể chạy các tác vụ song song. Các API cho phép bạn thực hiện hầu hết các loại đa luồng trong mã PHP của bạn - pthreads là những gì bạn đang tìm kiếm.

Một ví dụ cơ bản:

<?php
class PThread extends Thread {
    $id = ""; //ThreadID
    public function __construct($idThread) {
        $this->id = $idThread;
    }
    public function run() {
        if ($this->id) {
            $sleep = mt_rand(1, 10);
            printf('Thread: %s  has started, sleeping for %d' . "\n", $this->id, $sleep);
            sleep($sleep);
            printf('Thread: %s  has finished' . "\n", $this->id);
        }
    }
}
// Creating the pool of threads(stored as array)
$poolArr = array();
//Initiating the threads
foreach (range("0", "3") as $i) {
    $poolArr[] = new PThread($i);
}
//Start each Thread
foreach ($stackArr as $t) {
    $t->start();
}
//Wait all thread to finish
foreach (range(0, 3) as $i) {
    $poolArr[$i]->join();
}
//Next... other sentences with all threads finished.

?>

Và đầu ra sẽ là:

<?php
//The output will show...
//Thread 0 has started, sleeping for 6
//Thread 1 has started, sleeping for 4
//Thread 2 has started, sleeping for 10
//Thread 3 has started, sleeping for 3
//Thread 3 has finished
//Thread 1 has finished
//Thread 0 has finished
//Thread 2 has finished

?>

Bạn có thể thấy rằng bạn có thể khai báo thread của riêng bạn bằng cách extend "Thead" class mà pthreads cung cấp cho bạn. Từ đó nó là một vấn đề khá đơn giản xây dựng class của bạn.

Chúng ta tạo mảng thread ($ stackArr), chúng tôi cũng khởi tạo các thread được truyền một đối số để "run" chức năng của chúng.

Cuối cùng, tất cả thread được bắt đầu đồng thời (run () là một chức năng mà thuộc về "Thead" class).

Mặc dù thời gian và trình tự hoàn thiện sẽ khác nhau trong mỗi lần chạy, điều này sẽ cho bạn thấy rằng bây giờ bạn không cần phải chờ đợi cho đến khi một thread đã thực hiện xong thì thread khác đã hoàn thành. Chạy mẩu mã theo cách như vậy được áp dụng cho rất nhiều trường hợp trong thế giới thực. Hãy giả sử bạn muốn đọc một số lượng lớn các dữ liệu mà bạn không muốn giữ toàn bộ kịch bản của bạn lên trong khi nó đang được đọc. Bạn có thể để lại các mã xử lý việc đọc dữ liệu trong một thread và thực hiện một thread khác làm bất cứ điều gì kmà bạn có thể cần phải chạy song song.

Thead class :

Thread extends Threaded implements Countable , Traversable , ArrayAccess {
/* Methods */
public void detach ( void )
public integer getCreatorId ( void )
public static Thread getCurrentThread ( void )
public static integer getCurrentThreadId ( void )
public integer getThreadId ( void )
public static mixed globally ( void )
public boolean isJoined ( void )
public boolean isStarted ( void )
public boolean join ( void )
public void kill ( void )
public boolean start ([ integer $options ] )
/* Inherited methods */
public array Threaded::chunk ( integer $size , boolean $preserve )
public integer Threaded::count ( void )
public bool Threaded::extend ( string $class )
public Threaded Threaded::from ( Closure $run [, Closure $construct [, array $args ]] )
public array Threaded::getTerminationInfo ( void )
public boolean Threaded::isRunning ( void )
public boolean Threaded::isTerminated ( void )
public boolean Threaded::isWaiting ( void )
public boolean Threaded::lock ( void )
public boolean Threaded::merge ( mixed $from [, bool $overwrite ] )
public boolean Threaded::notify ( void )
public boolean Threaded::pop ( void )
public void Threaded::run ( void )
public mixed Threaded::shift ( void )
public mixed Threaded::synchronized ( Closure $block [, mixed $... ] )
public boolean Threaded::unlock ( void )
public boolean Threaded::wait ([ integer $timeout ] )
}

Tham khảo : http://php.net/manual/en/book.pthreads.php

All rights reserved