Hướng dẫn dùng parallal trong PHP

answer

21

tôi sử dụng exec(). Nó dễ dàng và sạch sẽ. Về cơ bản, bạn cần phải xây dựng một trình quản lý luồng và các tập lệnh luồng, sẽ thực hiện những gì bạn cần.

Tôi không thích fsockopen()vì nó sẽ mở một kết nối máy chủ, kết nối đó sẽ tích tụ và có thể đạt đến giới hạn kết nối của apache

Tôi không thích các curlchức năng vì lý do tương tự

Tôi không thích pnctlvì nó cần có phần mở rộng pnctl và bạn phải theo dõi các mối quan hệ cha / con.

chưa bao giờ chơi với gearman ...

21 hữu ích 5 bình luận chia sẻ

answer

14

Tôi đoán chúng ta có 3 lựa chọn ở đó:

A. Đa luồng:

PHP không hỗ trợ đa luồng nguyên bản. Nhưng có một phần mở rộng PHP (thử nghiệm) được gọi là pthreads ( https://github.com/krakjoe/pthreads ) cho phép bạn làm điều đó.

B. Đa quy trình:

Điều này có thể được thực hiện theo 3 cách:

  • Forking
  • Thực thi lệnh
  • Đường ống

C. Xử lý song song phân tán:

Làm thế nào nó hoạt động:

  1. Các Clientứng dụng gửi dữ liệu (AKA message) “có thể là JSON định dạng” vào Engine (MQ Engine) “có thể là một dịch vụ web địa phương hoặc bên ngoài”
  2. Các MQ Enginecửa hàng dữ liệu “chủ yếu trong bộ nhớ, và tùy chọn trong cơ sở dữ liệu” bên trong một hàng đợi (bạn có thể xác định tên hàng đợi)
  3. Các Clientứng dụng yêu cầu Engine MQ cho một dữ liệu (tin nhắn) để được xử lý chúng theo thứ tự (FIFO hoặc dựa trên ưu tiên) “, bạn cũng có thể yêu cầu dữ liệu từ hàng đợi cụ thể".

Một số động cơ MQ:

  • ZeroMQ (tùy chọn tốt, khó sử dụng) Thư viện IPC định hướng thông báo, là Máy chủ hàng đợi thông báo ở Erlang, lưu trữ các công việc trong bộ nhớ. Nó là một thư viện socket hoạt động như một khuôn khổ đồng thời. Nhanh hơn TCP cho các sản phẩm phân cụm và siêu máy tính.
  • RabbitMQ (tùy chọn tốt, dễ sử dụng) tự lưu trữ, Hàng đợi tin nhắn doanh nghiệp, Không thực sự là hàng đợi công việc - mà là hàng đợi tin nhắn có thể được sử dụng như hàng đợi công việc nhưng yêu cầu bổ sung ngữ nghĩa.
  • Beanstalkd (tùy chọn tốt nhất, dễ sử dụng) (hỗ trợ Laravel được tích hợp sẵn, được xây dựng bởi facebook, dành cho hàng đợi công việc) - có một công cụ "Beanstalkd console" rất hay
  • Gearman (vấn đề: hệ thống môi giới tập trung để xử lý phân tán)
  • Apache ActiveMQ là nhà môi giới tin nhắn mã nguồn mở phổ biến nhất trong Java, (vấn đề: rất nhiều lỗi và sự cố)
  • Amazon SQS (Hỗ trợ Laravel được tích hợp sẵn, Được lưu trữ - vì vậy không cần quản trị. Không thực sự là một hàng đợi công việc, do đó sẽ yêu cầu thêm công việc để xử lý ngữ nghĩa chẳng hạn như chôn một công việc)
  • IronMQ (Hỗ trợ Laravel, Viết bằng Go, Có sẵn cả dưới dạng phiên bản đám mây và tại chỗ)
  • Redis (Laravel được xây dựng trong hỗ trợ, không nhanh như nó không được thiết kế cho điều đó)
  • Sparrow (viết bằng Ruby dựa trên memcache)
  • Starling (được viết bằng Ruby dựa trên memcache, được tích hợp trong twitter)
  • Kestrel (chỉ là một QM khác)
  • Kafka (Viết tại LinkedIn ở Scala)
  • EagleMQ nguồn mở, hiệu suất cao và trình quản lý hàng đợi nhẹ (Viết bằng C)

Có thể tìm thấy nhiều hơn trong số chúng tại đây: http://queues.io

14 hữu ích 3 bình luận chia sẻ

answer

4

Nếu ứng dụng của bạn sẽ chạy trong môi trường unix / linux, tôi khuyên bạn nên sử dụng tùy chọn forking. Về cơ bản, trẻ em chơi để làm cho nó hoạt động. Tôi đã sử dụng nó cho trình quản lý Cron và có mã để nó hoàn nguyên về đường dẫn mã thân thiện với Windows nếu fork không phải là một tùy chọn.

Các tùy chọn chạy toàn bộ tập lệnh nhiều lần, như bạn đã nêu, làm tăng thêm khá nhiều chi phí. Nếu tập lệnh của bạn nhỏ, nó có thể không thành vấn đề. Nhưng bạn có thể sẽ quen với việc xử lý song song trong PHP theo cách bạn chọn. Và lần tới khi bạn có một công việc sử dụng 200mb dữ liệu thì đó rất có thể là một vấn đề. Vì vậy, tốt hơn hết bạn nên học một cách mà bạn có thể gắn bó.

Tôi cũng đã thử nghiệm Gearman và tôi rất thích nó. Có một vài điều cần phải suy nghĩ nhưng về tổng thể, nó cung cấp một cách rất tốt để phân phối các tác phẩm đến các máy chủ khác nhau chạy các ứng dụng khác nhau được viết bằng các ngôn ngữ khác nhau. Bên cạnh việc thiết lập nó, thực sự sử dụng nó từ bên trong PHP, hoặc bất kỳ ngôn ngữ nào khác cho vấn đề đó, ... một lần nữa ... trẻ em lại chơi.

Nó rất có thể là quá mức cần thiết cho những gì bạn cần làm. Nhưng nó sẽ mở ra cho bạn những khả năng mới khi nói đến việc xử lý dữ liệu và công việc, vì vậy tôi khuyên bạn nên thử Gearman vì thực tế đó một mình.

4 hữu ích 0 bình luận chia sẻ

answer

3

Dưới đây là tóm tắt về một số tùy chọn để xử lý song song trong PHP.

AMP

Checkout Amp - Đồng thời không đồng bộ được thực hiện đơn giản - đây có vẻ là thư viện PHP hoàn thiện nhất mà tôi từng thấy để xử lý song song.

Lớp quy trình của Peec

Lớp này đã được đăng trong các bình luận của hàm execute () của PHP và cung cấp một điểm khởi đầu đơn giản thực sự để tạo các quy trình mới và theo dõi chúng.

Thí dụ:

// You may use status(), start(), and stop(). notice that start() method gets called automatically one time.
$process = new Process('ls -al');

// or if you got the pid, however here only the status() metod will work.
$process = new Process();
$process.setPid(my_pid);

// Then you can start/stop/check status of the job.
$process.stop();
$process.start();
if ($process.status()) {
    echo "The process is currently running";
} else {
    echo "The process is not running.";
}

Các tùy chọn khác được so sánh

Ngoài ra còn có một bài viết tuyệt vời về Xử lý không đồng bộ hoặc đa nhiệm trong PHP giải thích những ưu và nhược điểm của các phương pháp tiếp cận khác nhau:

  • phần mở rộng pthreads (xem thêm bài viết SitePoint này )
  • Amp \ Thư viện Chủ đề
  • hack's async (yêu cầu chạy HHVM của Facebook)
  • pcntl_fork
  • bật ra
  • fopen / curl / fsockopen

Người gác cửa

Sau đó, cũng có hướng dẫn đơn giản này được gói gọn trong một thư viện nhỏ có tên là Doorman .

Hy vọng những liên kết này cung cấp một điểm khởi đầu hữu ích để nghiên cứu thêm.

3 hữu ích 0 bình luận chia sẻ

answer

3

Trước hết, câu trả lời này dựa trên hệ điều hành linux env. Tuy nhiên, một phần mở rộng pecl khác cũng song song, bạn có thể cài đặt nó bằng cách phát hành pecl install parallel, nhưng nó có một số điều kiện tiên quyết :

  1. Cài đặt ZTS (Zend Thread an toàn) Build PHP 7.2+ phiên bản
  2. nếu bạn xây dựng tiện ích mở rộng này bằng nguồn, bạn nên kiểm tra tệp cấu hình php.ini như tệp, sau đó thêm extension=parallel.sovào nó

sau đó xem đầy đủ ý chính của ví dụ: https://gist.github.com/krakjoe/0ee02b887288720d9b785c9f947f3a0a hoặc url trang web chính thức của php: https://www.php.net/manual/vi/book.parallel.php

3 hữu ích 1 bình luận chia sẻ

answer

2

Tôi thích executive () và gearman hơn. execute () dễ dàng và không có kết nối và ít tốn bộ nhớ hơn. gearman cần một kết nối ổ cắm và nhân viên nên nhớ một số bộ nhớ. Nhưng gearman linh hoạt hơn và nhanh hơn thi hành (). Và điều quan trọng nhất là nó có thể triển khai worker trong máy chủ khác. Nếu công việc tốn nhiều thời gian và tài nguyên. Tôi đang sử dụng gearman trong dự án hiện tại của mình.

2 hữu ích 0 bình luận chia sẻ

answer

2

Tôi sử dụng pnctl của PHP - điều đó là tốt miễn là bạn biết bạn làm gì. Tôi hiểu tình huống của bạn nhưng tôi không nghĩ việc hiểu mã của chúng ta là điều gì đó khó khăn, chúng ta chỉ cần có ý thức hơn bao giờ hết khi triển khai hàng đợi JOB hoặc quy trình song song.

Tôi cảm thấy miễn là bạn viết mã nó một cách hoàn hảo và đảm bảo quy trình hoàn hảo, bạn nên ghi nhớ QUY TRÌNH PARALLEL khi bạn triển khai.

Nơi bạn có thể mắc sai lầm:

  1. Vòng lặp - có thể xử lý bởi các vars TOÀN CẦU.
  2. Xử lý một số tập hợp các giao dịch - một lần nữa, miễn là bạn xác định các tập hợp phù hợp, bạn sẽ có thể hoàn thành nó.

Hãy xem ví dụ này - https://github.com/rakesh-sankar/Tools/blob/master/PHP/fork-parallel-process.php .

Hy vọng nó giúp.

2 hữu ích 0 bình luận chia sẻ

answer

1

Phương pháp được mô tả trong 'Xử lý song song dễ dàng trong PHP' là hết sức đáng sợ - nguyên tắc là OK - nhưng việc triển khai thì sao ??? Như bạn đã chỉ ra, curl_multi_ fns cung cấp một cách tốt hơn nhiều để triển khai phương pháp này.

Nhưng tôi nghĩ 2 cách đó sẽ tăng thêm khá nhiều chi phí

Có, bạn có thể không cần ngăn xếp HTTP máy khách và máy chủ để hoàn thành công việc - nhưng trừ khi bạn đang làm việc cho Google, thời gian phát triển của bạn đắt hơn nhiều so với chi phí phần cứng của bạn - và có rất nhiều công cụ để quản lý HTTP / phân tích hiệu suất - và có một tiêu chuẩn xác định bao gồm những thứ như thông báo trạng thái và xác thực.

Phần lớn cách bạn triển khai giải pháp phụ thuộc vào mức độ toàn vẹn giao dịch mà bạn yêu cầu và liệu bạn có yêu cầu xử lý theo thứ tự hay không.

Trong số các cách tiếp cận bạn đề cập, tôi khuyên bạn nên tập trung vào phương thức yêu cầu HTTP bằng cách sử dụng curl_multi_. Nhưng nếu bạn cần kiểm soát giao dịch tốt / để phân phối đơn hàng thì bạn chắc chắn nên chạy một trình nền môi giới giữa nguồn thông báo và các tác nhân xử lý (có một máy chủ luồng đơn được viết tốt phù hợp để sử dụng làm khung cho nhà môi giới ở đây ). Lưu ý rằng các tác nhân xử lý nên xử lý một thông báo tại một thời điểm.

Nếu bạn cần một giải pháp có khả năng mở rộng cao, thì hãy xem xét một hệ thống xếp hàng tin nhắn thích hợp chẳng hạn như RabbitMQ .

HTH

C.

1 hữu ích 0 bình luận chia sẻ

answer

1

Sử dụng song song PHP gốc (7.2+) , tức là:

use \parallel\Runtime;

$sampleFunc = function($num, $param2, $param3) { 
    echo "[Start: $num]";  
    sleep(rand(1,3) ); 
    echo "[end:$num]";   
};

for($i = 0; $i < 11; $i++) { 
    \parallel\run($sampleFunc,  [$param1=$i, $param2=null, $param3="blabla"] );
}
for ($i = 0; $i < 11; $i++) {
    echo "  ";
    sleep(1);
}

(BTW, bạn sẽ cần phải thực hiện theo đường dẫn cứng để cài đặt PHP với hỗ trợ ZTS, sau đó kích hoạt song song. Tôi khuyên bạn nên làm điều đó bằng phpbrew.)

1 hữu ích 0 bình luận chia sẻ