2012-03-16 35 views
8

Hy vọng tôi có thể giải thích điều này đủ tốt. Tôi đang làm việc để tạo ra một PHP library to handle ajax requests through PHP theo cách hướng đối tượng. Tôi hiện đang cân nhắc một cách tốt để thực hiện một giải pháp bỏ phiếu dài nhưng tôi tò mò về điều gì đó.Cuộc thăm dò dài với PHP trên Apache

Apache không xử lý việc giữ nhiều kết nối mở rất tốt. Mô hình theo yêu cầu giúp Apache không hiệu quả cao đối với việc bỏ phiếu dài. Sử dụng máy chủ như nginx và lighttpd xử lý các luồng này tốt hơn rất nhiều trong thư viện, tôi dự định triển khai các chức năng khác nhau được tối ưu hóa cho các máy chủ cụ thể có sẵn từ một cuộc gọi hàm đơn. Trong trường hợp của Apache, điều đó xảy ra để giữ một thị phần khổng lồ cho các ứng dụng PHP, tôi cần một giải pháp tốt hơn.

Có cách nào để đặt yêu cầu đến tạm dừng/tạm dừng và tiếp tục xử lý các yêu cầu khác cho đến khi tôi sẵn sàng kích hoạt lại yêu cầu đó không?

Tôi không chắc liệu điều đó có hợp lý không hay liệu tôi có đi đúng hướng hay không. Một giải pháp có thể có mà SO đề xuất cho việc bỏ phiếu dài trong PHP trên một máy chủ Apache là gì?

+0

tại sao bạn tạm dừng xử lý trên máy chủ? điều đó sẽ khiến người dùng của bạn phải chờ đợi rất nhiều? – Joseph

+0

Với Apache, nó sử dụng một mô hình theo yêu cầu để yêu cầu trang ban đầu trong một ứng dụng sử dụng một luồng, và sau đó yêu cầu ajax (được gọi là DOM được tải) sẽ sử dụng một luồng riêng biệt. Vấn đề là cố gắng lưu lượng cao sẽ sinh ra hàng nghìn luồng và cuối cùng là vô hiệu hóa máy chủ. –

+0

Chúng tôi gặp vấn đề tương tự, sau khi bật tải trang ajax/PHP dài bắt đầu một cách ngẫu nhiên (cca mỗi 4-5 lần tải) mất quá nhiều thời gian ... cho bây giờ và chỉ cho các thông báo tôi giải được nó bằng NOT sleep() trong PHP theo bất kỳ cách nào và chuyển chức năng timewait sang javascript, vì vậy bây giờ javascript đang yêu cầu thực thi PHP mới, ví dụ: 10 giây nhưng tải trang dường như là OK ngay bây giờ. –

Trả lời

1

Điều này nghe có vẻ như tiếp tục. Bạn chắc chắn không thể làm điều này trong PHP, theo cách thanh lịch. Nếu bạn muốn làm điều này, cơ hội tốt nhất của bạn là lưu trạng thái hiện tại và viết mã theo cách sao cho bạn có thể tiếp tục từ nơi bạn đã dừng lại khi bạn tải trạng thái.

+0

Tôi bắt đầu đi đến cùng một kết luận. Tôi nghĩ rằng tôi sẽ thực hiện một giải pháp bỏ phiếu dài cơ bản và trong tài liệu/chú thích chú thích rằng nó ít hơn tối ưu trên một số môi trường máy chủ nhất định. Bằng cách đó nếu ai đó muốn thử sử dụng nó, chức năng cơ sở đã có sẵn. –

0

Tôi không nghĩ có giải pháp. Bạn không thể phân biệt yêu cầu bỏ phiếu từ yêu cầu bình thường. Chỉ tránh Apache có thể giúp (ví dụ: chạy nginx trên 80, chuyển tiếp tất cả các yêu cầu tới Apache trên 81, ngoại trừ các yêu cầu bỏ phiếu).

Tôi cũng không nghĩ bạn gặp sự cố. Nginx hoặc máy chủ khác không hiệu quả hơn nhiều so với Apache. Bỏ phiếu là một yêu cầu PHP, Apache với mod_php là ít hoặc nhiều hơn một sự lựa chọn tốt. Nginx sẽ không sử dụng ít tài nguyên hơn Apache trong việc phục vụ PHP.

+4

'Nginx sẽ không sử dụng ít tài nguyên hơn Apache trong việc phục vụ PHP.' bạn có chắc chắn về điều đó không? http://serverfault.com/questions/157520/apache-vs-nginx –

+0

Chắc chắn. Tôi không đọc bất cứ điều gì trong url đó nói ngược lại. "mod_php nhanh hơn nhiều so với php-fpm", "cgi chậm hơn nhiều so với mod_php" vv Tất nhiên, tất cả phụ thuộc vào số lượng bạn bỏ phiếu dài so với các tệp PHP bình thường/tệp tĩnh, nếu bạn có proxy đảo ngược bộ đệm Apache không làm phiền các tệp tĩnh, về số lượng mô-đun bạn đang sử dụng trong Apache ... – jcisio

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