2009-04-04 10 views
8

Tôi đang làm việc trên giao diện web PHP sẽ nhận được lưu lượng truy cập lớn. Một số yêu cầu chèn/cập nhật sẽ chứa hình ảnh sẽ phải được thay đổi kích thước thành một số kích thước phổ biến để tăng tốc độ truy xuất thêm.Cách tốt nhất để giảm tải xử lý nặng (như thay đổi kích thước hình ảnh) ra khỏi yêu cầu PHP

Một cách để làm điều đó có lẽ là thiết lập một số hàng đợi không đồng bộ trên máy chủ. Ví dụ. thiết lập một bảng trong một db với một hàng đợi nhiệm vụ sẽ được phổ biến bởi các yêu cầu PHP và cho phép một số quy trình khác trên máy chủ xem bảng và xử lý bất kỳ tác vụ chờ nào. Bạn làm điều đó như thế nào? Điều gì sẽ là môi trường thích hợp cho quá trình chạy dài đó? Java, hoặc có thể một cái gì đó nhẹ hơn sẽ làm gì?

Trả lời

14

Nếu những gì bạn đang làm thực sự là khối lượng lớn thì những gì bạn đang tìm kiếm là một cái gì đó như beanstalkd. Nó là một bộ xử lý hàng đợi công việc phân tán. Bạn chỉ cần đặt một công việc trên hàng đợi và sau đó quên nó đi.

Tất nhiên sau đó bạn cần một cái gì đó ở đầu kia đọc hàng đợi và xử lý công việc. Có nhiều cách để làm điều này.

Cách dễ nhất có thể là có một công việc định kỳ chạy đủ thường xuyên để đọc hàng đợi công việc và xử lý các yêu cầu. Ngoài ra, bạn có thể sử dụng một số loại quá trình daemon dai dẳng được đánh thức bởi công việc trở nên có sẵn.

Lợi thế của kiểu tiếp cận này là bạn có thể điều chỉnh số lượng công nhân cần bao nhiêu công việc và beanstalkd xử lý việc xử lý phân tán (theo nghĩa là người nghe có thể trên các máy khác nhau).

+1

Gần đây, tôi đã triển khai bộ xử lý xếp hàng Beanstalkd/PHP và một phần trong đó, một trình chỉnh sửa hình ảnh. Công việc sau 2 tuần và 950K sau đó (với 3600+ thay đổi kích thước), nó thường hoàn thành việc thay đổi kích thước trong thời gian ít hơn cần để trả lại trang. –

2

Bạn có thể đặt tác vụ cron sẽ kiểm tra bảng xếp hàng. Tập lệnh xử lý các hành động đang chờ trong hàng đợi có thể được viết, ví dụ: trong php, do đó bạn không phải thay đổi ngôn ngữ triển khai.

2

Bạn sẽ muốn tạo một daemon sẽ "ngủ" trong một khoảng thời gian và sau đó kiểm tra cơ sở dữ liệu để xử lý các mục. Một khi nó tìm thấy các mục để xử lý, nó sẽ xử lý chúng và sau đó kiểm tra lại ngay sau khi nó được thực hiện, nếu không có nhiều hơn, sau đó ngủ. Bạn có thể tạo daemon bằng bất kỳ ngôn ngữ nào, kể cả PHP.

Ngoài ra, bạn chỉ có thể thực thi tập lệnh PHP và tiếp tục. Vì vậy, PHP sẽ không chờ đợi cho kịch bản để hoàn thành trước khi tiếp tục, thực hiện nó trong nền.

exec("nohup /usr/bin/php -f /path/to/script/script.php > /dev/null 2>&1 &"); 

Mặc dù bạn có thể có quá nhiều quy trình chạy ngầm vì không có xếp hàng.

2

Tôi sử dụng Perl cho quá trình chạy dài kết hợp với beanstalkd. Điều tốt đẹp là khách hàng Beanstalkd cho Perl có một phương pháp dự trữ chặn. Bằng cách này nó sử dụng hầu như không có thời gian CPU khi không có gì để làm. Nhưng khi nó phải thực hiện công việc của mình, nó sẽ tự động bắt đầu xử lý. Rất hiệu quả.

+0

+1 Beanstalkd Tôi đang làm tương tự với một trang web PHP & khách hàng cây đậu. 1.6M công việc phục vụ cho đến nay (trong 14 ngày) cho tập đầu tiên của nhiệm vụ tôi đã ném vào nó. –

+1

Có một khách hàng beanstalkd không thể dự trữ được không? – Fluffy

1

Bạn có thể sử dụng dịch vụ như IronWorker để thực hiện xử lý hình ảnh trong nền và tải xuống máy chủ của bạn. Vì đó là dịch vụ, bạn sẽ không cần quản lý bất kỳ thứ gì hoặc thiết lập bất kỳ thứ gì khác và nó sẽ mở rộng với bạn khi bạn phát triển, nếu bạn có thể làm một hình ảnh với nó, bạn có thể mở rộng hàng triệu hình ảnh với nỗ lực bằng không.

Dưới đây là một bài viết về cách làm một loạt các biến đổi xử lý hình ảnh:

http://dev.iron.io/solutions/image-processing/

Các ví dụ có trong Ruby, nhưng bạn có thể làm những thứ tương tự với PHP khá dễ dàng.

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