Hướng dẫn php multithreading curl - php multithreading curl

Làm thế nào tôi có thể làm cho tập lệnh này hoạt động với nhiều chủ đề? Đã thử tất cả các hướng dẫn nhưng không thành công :( và các luồng số tối đa tôi có thể sử dụng với Curl PHP là gì?

 $line) {
$line = trim($line);
print ("$nr - check :" . $line . "\r\n");

$check = ia_continutul($line); 

if (strpos($check,'wordpress') !== false) {

  $SaveFile = fopen($output, "a");
  fwrite($SaveFile, "$line\r\n");
  fclose($SaveFile);
  }
}
print "The END !\r\n";

function ia_continutul($url) {  
    $ch = curl_init();  
    $timeout = 3;  
    curl_setopt($ch,CURLOPT_URL,$url);  
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);  
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
  curl_setopt($ch, CURLOPT_TIMEOUT, 5);  
    $data = curl_exec($ch);  
    curl_close($ch);  
    return $data;  
}
?>

Hướng dẫn php multithreading curl - php multithreading curl

Andy Hayden

339K96 Huy hiệu vàng604 Huy hiệu bạc523 Huy hiệu Đồng96 gold badges604 silver badges523 bronze badges

Đã hỏi ngày 13 tháng 9 năm 2012 lúc 14:31Sep 13, 2012 at 14:31

2

Bạn có thể đa luồng trong PHP ...

class Check extends Thread {
    public function __construct($url, $check){
        $this->url = trim($url);
        $this->check = $check;
    }
    public function run(){
        if (($data = file_get_contents($this->url))) {
            if (strpos($data, "wordpress") !== false) {
                return $this->url;
            }
        }
    }
}
$output = fopen("output.file", "w+");
$threads = array();
foreach( file("input.file") as $index => $line ){
    $threads[$index]=new Check($line, "wordpress");
    $threads[$index]->start();
}
foreach( $threads as $index => $thread ){
    if( ($url = $threads[$index]->join()) ){
    fprintf($output, "%s\n", $url);
    }
}

https://github.com/krakjoe/pthreads

Đã trả lời ngày 13 tháng 9 năm 2012 lúc 18:03Sep 13, 2012 at 18:03

Hướng dẫn php multithreading curl - php multithreading curl

Joe Watkinsjoe WatkinsJoe Watkins

16.8K5 Huy hiệu vàng41 Huy hiệu bạc62 Huy hiệu Đồng5 gold badges41 silver badges62 bronze badges

Bạn không thể đa luồng PHP. Đó là ngôn ngữ kịch bản, vì vậy tập lệnh được chạy theo một thứ tự nhất định và nếu bạn phải chờ một lọn tóc để hoàn thành, nó sẽ tiếp tục tải trong khi điều đó xảy ra, nó giống như đặt hàm ngủ (1) trong mã của bạn.

Có một số điều cơ bản bạn có thể làm để giúp tăng tốc mã của mình. Không thực hiện yêu cầu MySQL (tôi không thấy bất kỳ) bên trong một vòng lặp, thay vào đó xây dựng một truy vấn sau đó thực hiện sau khi vòng lặp kết thúc. Nhìn vào việc tái cấu trúc mã của bạn để bạn có thể thực hiện số lượng lọn tóc tối thiểu để nó đi nhanh. Cố gắng tìm cách để làm lọn tóc bên ngoài vòng lặp.

Đã trả lời ngày 13 tháng 9 năm 2012 lúc 15:34Sep 13, 2012 at 15:34

PhilPhilPhil

4103 Huy hiệu bạc12 Huy hiệu Đồng3 silver badges12 bronze badges

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 multithreading curl - php multithreading curl
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 " 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 multithreading curl - php multithreading curl
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.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 multithreading curl - php multithreading curl

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 multithreading curl - php multithreading curl

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.