2009-05-26 26 views
33

Tôi đang xây dựng một trang web trong CakePHP xử lý các tệp được tải lên mặc dù API XML-RPC và mặc dù một lối vào web. Các tệp cần được quét bởi ClamAV, hình thu nhỏ cần được tạo, v.v. Tất cả công việc chuyên sâu về tài nguyên cần một thời gian mà người dùng không phải đợi. Vì vậy, tôi đang xem xét xử lý không đồng bộ với PHP nói chung và CakePHP nói riêng.Xử lý không đồng bộ hoặc hàng đợi thư trong PHP (CakePHP)

Tôi đã xem qua số MultiTask plugin cho CakePHP có vẻ đầy hứa hẹn. Tôi cũng đã xem các triển khai hàng đợi thông báo khác nhau như droprbeanstalkd. Tất nhiên, tôi cũng sẽ cần một số loại quá trình nền, có thể được thực hiện bằng cách sử dụng một Cake Shell của một số loại. Tôi đã thấy MultiTask sử dụng PHP_Fork để triển khai một trình tiện ích PHP đa luồng.

Tôi cần một số lời khuyên về cách kết hợp tất cả các phần này lại với nhau theo cách tốt nhất.

  • Có một ý tưởng hay để có một daemon chạy dài được viết bằng PHP? Tôi nên theo dõi điều gì?
  • Lợi thế của việc triển khai hàng đợi thư bên ngoài là gì? Plugin MultiTask không sử dụng hàng đợi tin nhắn bên ngoài. Nó cuộn nó bằng cách sử dụng một bảng MySQL để lưu trữ các nhiệm vụ.
  • Tôi nên sử dụng hàng đợi thông báo nào? dropr? beanstalkd? Thứ gì khác?
  • Tôi nên triển khai bộ xử lý phụ trợ như thế nào? Là một daemon PHP forking một ý tưởng tốt hay chỉ yêu cầu cho sự cố?

Gói hiện tại của tôi là sử dụng plugin MultiTask hoặc chỉnh sửa để sử dụng beanstald thay vì triển khai bảng MySQL của chính nó. Công việc trong hàng đợi có thể chỉ đơn giản bao gồm một tên tác vụ và một mảng các tham số. Các daemon PHP sẽ xem cho các công việc đến và chuyển chúng ra cho một trong những chủ đề con của nó. Lệnh này sẽ chỉ thực hiện nhiệm vụ CakePHP với các tham số đã cho.

Bất kỳ ý kiến, lời khuyên, nhận xét, gotchas hoặc ngọn lửa về điều này?

+0

Ngoài ra còn có một số thông tin về Asynch. chế biến @ [xếp hàng-trì hoãn-thi hành-in-cakephp /] (http://www.dereuromark.de/2013/12/22/queue-deferred-execution-in-cakephp/). – mark

Trả lời

25

Tôi đã có kết quả xuất sắc với BeanstalkD và back-end được viết bằng PHP để truy xuất công việc và sau đó hành động với chúng. Tôi bọc công việc thực tế chạy trong một bash-script để tiếp tục chạy nếu ngay cả khi nó thoát (trừ khi tôi làm một 'exit(UNIQNUM);', khi kịch bản kiểm tra nó và thực sự sẽ thoát). Theo cách đó, tập lệnh PHP đã khởi động lại xóa mọi bộ nhớ có thể đã được sử dụng và có thể bắt đầu lại mỗi 25/50/100 công việc mà nó chạy.

Một vài ưu điểm của việc sử dụng nó là bạn có thể đặt mức ưu tiên và độ trễ thành công việc BeanstalkD - "chạy điều này ở mức ưu tiên thấp hơn, nhưng không bắt đầu trong 10 giây". Tôi cũng đã xếp hàng đợi một số công việc vào một thời điểm nào đó (chạy ngay bây giờ, sau 5 giây và sau 30 giây).

Với cấu hình mạng thích hợp (và chạy nó trên địa chỉ IP có thể truy cập vào phần còn lại của mạng), bạn cũng có thể chạy deamon beanstalkd trên một máy chủ và yêu cầu nó từ một số máy khác, vì vậy nếu có một số lượng lớn các tác vụ được tạo, công việc có thể được tách ra giữa các máy chủ. Nếu một tập hợp các nhiệm vụ cụ thể cần được chạy trên một máy cụ thể, tôi đã tạo một 'ống' là tên máy của máy đó, nó phải là duy nhất trong cụm của chúng tôi, nếu không phải trên toàn cầu (hữu ích cho việc tải lên tệp). Tôi thấy nó hoạt động hoàn hảo để thay đổi kích thước hình ảnh, thường trả lại các hình ảnh nhỏ hơn đã hoàn thành cho hệ thống tệp trước khi trang web tự tham chiếu đến nó sẽ đề cập đến URL mà nó sẽ đến. Tôi thực sự sắp bắt đầu viết một loạt bài về chủ đề này cho blog của tôi (bao gồm một số kỹ thuật cho mã mà tôi đã đẩy vài triệu yêu cầu trực tiếp) - URL của tôi được liên kết từ user profile của tôi tại đây , trên Stackoverflow.

(Tôi đã viết một series of articles về chủ đề Beanstalkd và xếp hàng của công việc)

+1

Cảm ơn, điều đó rất hữu ích. Tôi đang làm việc với Beanstalkd vào lúc này. Cho đến nay tôi đã tạo ra một hành vi Mô hình CakePHP đơn giản được gọi là "trì hoãn", đó chỉ là một cuộc gọi phương thức bị trì hoãn trên Mô hình. Các hành vi trì hoãn đặt cuộc gọi trong beanstald và một Cake Shell chạy trong nền thực hiện được các messaged từ beanstalkd và thực hiện các cuộc gọi. Lo lắng duy nhất của tôi cho đến nay là Beanstalkd không tồn tại. Bạn đã có bất kỳ vấn đề với điều đó? Điều gì sẽ xảy ra nếu beanstalkd chết và một số hình ảnh của bạn không bao giờ bị thay đổi kích thước? –

+0

nó chưa bao giờ chết trên tôi, ngay cả khi tôi đặt 100.000 dây vào nó. Ngoài ra, nếu hình ảnh không bị thay đổi kích thước, hình ảnh vẫn còn trong thư mục tải lên và có thể được thực hiện sau. –

+0

chỉ để tham khảo, tôi nghĩ rằng trang web Beanstalkd bạn liên kết đã thay đổi vì nó không có vẻ liên quan đến bất kỳ loại dự án lập trình php nào – Rick

4

Nếu bạn sử dụng hàng đợi thư như beanstalkd, bạn có thể bắt đầu bao nhiêu quy trình tùy thích (ngay cả trên cùng một máy chủ). Mỗi quy trình công nhân sẽ lấy một công việc từ hàng đợi và xử lý nó. Bạn có thể thêm nhiều công nhân và nhiều máy chủ hơn nếu bạn cần thêm dung lượng.

Điều tốt đẹp về việc sử dụng một công nhân có một luồng đơn là bạn không phải đối phó với đồng bộ hóa bên trong một quy trình. Jobqueue sẽ đảm bảo không có công việc nào được xử lý hai lần.

0

Bạn cũng có thể kiểm tra số tiền Amazon SQS để sử dụng cùng với EC2?

+4

Không, cảm ơn. Tôi muốn tự lực. Không phụ thuộc vào các dịch vụ bên ngoài ngoại trừ một ISP với một rack và một đường ống chất béo lớn. –

+0

Tôi hiểu rằng SQS cũng có thể có một số thời gian trễ đáng kể. Không phải là vấn đề nếu bạn chuyển mã video hoặc âm thanh, vì vậy nếu bạn đang tìm nạp thông tin khi mọi người đăng nhập. –

0

gì về gearman? Hỗ trợ tốt và tích hợp trong php và các tính năng như nhiệm vụ song song, mở rộng quy mô, giám sát và ...

Các vấn đề liên quan