Curl_multi_exec hoạt động như thế nào?

Bài đăng này giải thích cách lấy dữ liệu khỏi tay cầm


3. Một thời gian trước, tôi đã đăng đoạn mã này bên trong một mẫu mã lớn hơn


Tôi đã không thực sự tài liệu hoặc giải thích nó. Và do đó, có vẻ như đoạn mã này đã gây ra một số nhầm lẫn. Hãy để tôi giải thích những gì nó làm. Đầu tiên, đây là cấp độ cao. Có hai vòng ngoài. Người đầu tiên chịu trách nhiệm xóa bộ đệm cuộn tròn ngay bây giờ. Người thứ hai chịu trách nhiệm chờ thêm thông tin và sau đó lấy thông tin đó. Đây là một ví dụ về những gì được gọi là chặn I/O. Chúng tôi chặn thực thi phần còn lại của chương trình cho đến khi hoàn thành I/O mạng. Mặc dù nói chung đây không phải là cách thích hợp nhất để xử lý I/O mạng, nhưng đây thực sự là lựa chọn duy nhất của chúng tôi trong PHP đơn luồng, đồng bộ

Vì vậy, hãy xem xét vòng lặp đầu tiên



4 cố gắng tải một số dữ liệu từ trình xử lý đa năng.

5 là điều khiển được tạo bởi một số cuộc gọi trước đó tới

6.

7 và

8 đều là các giá trị nguyên.

0 đặt

7 thành số lượng tay cầm riêng lẻ mà nó hiện đang làm việc với. Nói cách khác, nếu bạn đang truy cập 5 URL bằng trình xử lý này, thì

4 sẽ trả về

3 khi nó hoạt động trên tất cả 5 URL và sau đó khi mỗi URL kết thúc, con số đó sẽ giảm đi một cho đến khi nó ở mức

4


8 là một trong những điều sau đây

  • 
    
    6 [-1]. Điều này có nghĩa là bạn nên gọi lại
    
    
    0 vì vẫn còn dữ liệu để xử lý
  • 
    
    8 [0]. Theo lời của các tài liệu. "Mọi thứ vẫn ổn. "Chà, thật tuyệt. Điều đó có nghĩa là có nhiều dữ liệu hơn, nhưng nó vẫn chưa đến
  • Một trong những mã lỗi.
    
    
    9,
    
    
    0,
    
    
    1, hoặc
    
    
    2. Tất cả những điều này chỉ ra rằng chúng ta cần ngừng xử lý

Vì vậy, khi chúng tôi đang xử lý vòng lặp, vòng lặp đầu tiên, điều kiện duy nhất giúp chúng tôi tiếp tục lặp lại là


6

Bây giờ, đối với kết quả nhỏ, một lần đi qua vòng lặp có thể là tất cả những gì bạn cần. Tuy nhiên, thường thì vòng lặp đầu tiên sẽ trả về


4 để cho biết rằng dường như có nhiều dữ liệu hơn, nhưng dữ liệu đó chưa đến mạng

chúng ta cần đợi

Đó là nơi vòng lặp thứ hai xuất hiện


Vòng lặp này cho biết…


5

Vì vậy, vòng lặp thứ hai chịu trách nhiệm kiểm tra ổ cắm cho đến khi hoàn tất

Hướng dẫn sử dụng PHP cung cấp một chút thông tin chi tiết về nội dung này, nhưng tài liệu libcurl C thì đầy đủ hơn nhiều

Giả sử rằng bạn phải viết một tập lệnh để tải xuống thông tin thông qua các yêu cầu HTTP. Cũng giả sử rằng vì lý do gì bạn phải viết nó trên PHP. [Có thể vì giá lưu trữ rẻ hoặc bạn đang làm việc với một số mã kế thừa hoặc có thể bạn thích nó, tôi sẽ không phán xét]. Cũng giả sử rằng bạn phải gửi một số yêu cầu HTTP trên mỗi lần chạy tập lệnh của mình. Cuối cùng, hãy giả sử rằng bạn không thể chuyển tiếp các triển khai của bên thứ ba như Guzzle [nếu có thể, bằng mọi cách hãy làm]. Với tất cả những giả định đó, về cơ bản bạn đang bị mắc kẹt với cURL. Tôi nói bị mắc kẹt bởi vì, mặc dù nó có hiệu suất tuyệt vời và đã vượt qua thử thách của thời gian, nhưng giao diện của nó hơi lộn xộn

Cách tiếp cận ngây thơ

Trong trường hợp bạn chưa sử dụng cURL, hãy xem nó hoạt động như thế nào. Thực hiện một yêu cầu HTTP khá đơn giản, bạn chỉ cần một vài chức năng

  • 
    
    2 để tạo tay cầm
  • 
    
    3 để đặt thông số cho cuộc gọi
  • 
    
    4 để thực sự kích hoạt yêu cầu
  • 
    
    5 để nhả tay cầm

6

Tốt, chúng tôi có yêu cầu của chúng tôi, tất nhiên bạn có thể cần thiết lập một số tiêu đề yêu cầu và những gì không dành cho điểm cuối mà bạn sẽ sử dụng, nhưng đó không phải là vấn đề quan trọng

Như chúng tôi đã nói, chúng tôi cần thực hiện các yêu cầu tới một số điểm cuối, vì vậy hãy làm điều đó


7

Đủ đơn giản, nó sẽ hoạt động tốt, chúng tôi chạy tập lệnh để kiểm tra và. phải mất mãi mãi, hoặc ít nhất là nhiều hơn chúng ta mong đợi. Điều đó đang xảy ra bởi vì


4 là một chức năng chặn, vì vậy về cơ bản, chúng tôi đang đợi mỗi yêu cầu thành công trước khi kích hoạt yêu cầu tiếp theo. Với cách tiếp cận này, chúng tôi đang lãng phí thời gian, trong hầu hết các trường hợp, phần cứng ở cả hai đầu có thể xử lý nhiều yêu cầu cùng một lúc, vì vậy thật tuyệt nếu có cách để làm như vậy

Nhiều cURL. xấu hơn và nhanh hơn

Thư viện chuẩn cURL đi kèm với các khả năng đa yêu cầu được tích hợp sẵn. Để sử dụng nó, chúng tôi phải giới thiệu một vài chức năng bổ sung

  • 
    
    70 để tạo một nhóm xử lý
  • 
    
    71 để thêm tay cầm vào nhóm
  • 
    
    72 xử lý hành động đang chờ xử lý đối với truy vấn
  • 
    
    73 để chờ các hoạt động trên bất kỳ tay cầm nào
  • 
    
    74 để lấy kết quả xử lý
  • 
    
    75 để giải phóng tài nguyên của nhóm

Hãy xem chúng hoạt động


4

Đó là rất nhiều để nuốt, tin tôi đi, tôi biết, nhưng đó là cách nó được thực hiện. Bạn có thể thắc mắc về tất cả những vòng lặp


76 đó là gì. Vòng lặp bên ngoài

77 về cơ bản nói "trong khi có yêu cầu đang chờ xử lý" và

78 có nghĩa là "trong khi có dữ liệu trên bộ đệm để gửi hoặc nhận". Một điều rất quan trọng cần lưu ý là dấu kiểm

79 yêu cầu chương trình đợi nếu thực sự không có gì để làm. Hàm

73 chặn chương trình cho đến khi có điều gì đó được thực hiện trên bất kỳ kết nối nào. Điều này tốt vì nó giải phóng CPU cho đến khi thực sự cần thiết

Google xung quanh bạn có thể tìm thấy các triển khai mà họ không sử dụng


73, họ làm điều gì đó như thế này


1

2Cảnh báo. Đừng cố gắng ở nhà

Mã đó sẽ hoạt động như một vòng lặp trống vô hạn cho đến khi tất cả các cuộc gọi kết thúc, khiến cho việc sử dụng CPU đạt 100% mà không làm gì cả và điều đó là không tốt, vì vậy mặc dù mã có thể trông đơn giản hơn nhưng bạn không nên sử dụng phương pháp đó

Curl_multi_exec là gì?

Mô tả ¶ . int . Xử lý từng ô điều khiển trong ngăn xếp . Phương thức này có thể được gọi cho dù handle có cần đọc hoặc ghi dữ liệu hay không.

Curl_exec là gì?

curl_exec[CurlHandle $handle ]. chuỗi. bool. Thực thi phiên cURL đã cho . Chức năng này sẽ được gọi sau khi khởi tạo phiên cURL và tất cả các tùy chọn cho phiên được đặt.

Làm cách nào để chạy cURL trong vòng lặp trong PHP?

Yêu cầu cURL đồng thời sử dụng curl_multi_exec trong PHP .
$kết quả=mảng[];
foreach [$ids dưới dạng $id] {
$fetchURL = 'https. //webkul. com&customerId='. $id;
$ch = curl_init[];
curl_setopt[$ch, CURLOPT_URL, $fetchURL];
curl_setopt[$ch, CURLOPT_RETURNTRANSFER, 1];
$result[] = curl_exec[$ch];
curl_close[$ch];

Curl_setopt_array trong PHP là gì?

curl_setopt_array[CurlHandle $handle , mảng $options ]. bool . Đặt nhiều tùy chọn cho phiên cURL . Chức năng này hữu ích để thiết lập một số lượng lớn các tùy chọn cURL mà không cần gọi lặp đi lặp lại curl_setopt[].

Chủ Đề