2011-11-11 25 views
5

Tôi đang làm việc trên một trang web hiển thị một số dữ liệu từ DB thay đổi thường xuyên (Trạng thái của hàng đợi và cuộc trò chuyện). Thiết lập hiện tại của tôi là Apache/PHP/MySQL. Đương nhiên tôi muốn tránh bỏ phiếu cho máy chủ mỗi x giây vì điều này không có quy mô tốt. Tôi muốn làm ngược lại ajax dài bỏ phiếu, tuy nhiên, tôi đã đọc rằng Apache không hoạt động tốt với điều này vì nó nhanh chóng chạy ra khỏi chủ đề công nhân. Có rất nhiều máy chủ web khác ra khỏi đó mà có được xung quanh vấn đề này: nginx, lốc xoáy, vv Tuy nhiên, vấn đề của tôi là, PHP là ngôn ngữ kịch bản phía máy chủ ONLY tôi biết. Ngoài ra tôi đã viết một số tập lệnh PHP nên tôi muốn giữ chúng nếu có thể. Tôi ổn với máy chủ chuyển đổi miễn là tôi vẫn có thể sử dụng PHP. Nhưng sau khi thực hiện một số nghiên cứu, tôi đã đọc rằng mọi người nói PHP (PHP-FPM?) Cũng tạo ra một quy trình cho mọi yêu cầu được thực hiện, có nghĩa là nếu tôi có hàng trăm nghìn kết nối mở, sẽ có hàng trăm/hàng ngàn quy trình, cũng sẽ là vấn đề.Có phải php có thể mở rộng với tính năng bỏ phiếu dài ajax ngược không?

Tôi có thể kết luận rằng không có cách nào có thể mở rộng tốt để tạo trang web bỏ phiếu dài bằng PHP? Tôi có nên từ bỏ PHP và học một ngôn ngữ kịch bản máy chủ khác không? Tôi có thể tiếp tục phát triển việc bỏ phiếu dài bằng cách sử dụng thiết lập hiện tại của tôi (Apache/PHP) bây giờ nhưng tôi không muốn lựa chọn ngôn ngữ kịch bản để đặt ra bất kỳ giới hạn nào về khả năng mở rộng của hệ thống của tôi khi triển khai. Vậy tôi nên làm gì đây? Tôi không có kinh nghiệm với lập trình web, vì vậy nếu có rất nhiều chuyên gia có thể cho tôi một số gợi ý, tôi sẽ đánh giá cao nó! Cảm ơn bạn!

+1

Không tự làm điều này nhưng sẽ sử dụng ổ cắm js là một tùy chọn? có lẽ cũng sử dụng node.js. Hỗ trợ gốc cho websockets trong trình duyệt là iproving nhưng tôi đoán rằng plugin jquery xử lý điều đó? –

+0

Tôi không thực sự xem xét websocket vì nó không được hỗ trợ trên tất cả các trình duyệt chính. Tôi đã nhìn vào node.js thực sự, nhưng từ những gì tôi nghe nó vẫn còn tương đối mới để hỗ trợ khung được giới hạn hơn. Tôi hiện đang xem xét Django, có nghĩa là tôi phải nhận trên python. Tôi nghe những điều tốt đẹp về khuôn khổ, nhưng tôi vẫn muốn ở lại với php, nếu có cách để có được xung quanh hiệu suất hit. – pinghsien422

+0

tôi chắc chắn sẽ xem xét lại node.js - một yêu cầu ajax đơn giản đến node server.js đang chạy trên có thể chỉ là thủ thuật. –

Trả lời

7

PHP được chạy trong chế độ php-fpm sẽ vẫn có giới hạn, đặc biệt nếu mã của bạn đang ăn nhiều bộ nhớ. Bạn sẽ không thể chạy hàng ngàn quy trình song song mà không có một số bộ nhớ có sẵn. Nhưng nó thường hoạt động nhanh hơn mod_php và ít nhất yêu cầu HTTP không cần PHP được xử lý bởi máy chủ web và nếu máy chủ web đó là nginx, bạn sẽ nhận được nhiều yêu cầu HTTP hơn song song.

Với php-fpm, bạn cũng sẽ có hàng đợi yêu cầu chờ đợi, có thể hữu ích trong trường hợp lưu lượng truy cập tạm thời lớn, vì ít nhất yêu cầu được xếp hàng đợi, không bị từ chối.

Bây giờ các hoạt động bỏ phiếu dài được chấp nhận với nginx (hoặc các ví dụ khác, đó là một ví dụ), nhưng không phải với PHP. PHP không được xây dựng để trở thành một máy chủ chạy dài, mỗi yêu cầu là một quy trình mới, nó thực sự không phải là lựa chọn đúng đắn cho một điều KeepAlive. Nhưng "Chia nhỏ ut regnes" (chia và quy tắc). Nhiệm vụ bỏ phiếu dài của bạn có thể chạy gần ứng dụng PHP của bạn, nhưng không có ứng dụng PHP của bạn.

Ví dụ: xem jappix project, đây là dự án PHP. Nhưng bạn cần đặt một máy chủ XMPP (như ejabberd) và máy chủ BOSH với nginx làm proxy trên cổng 80 đến máy chủ BOSH đó (vì vậy bạn có giao thức trò chuyện xmpp trên cổng 80, qua nginx và ejabberd, và không có gì trên phía PHP cho điều đó). Vấn đề là sau đó kết nối xác thực ứng dụng của bạn, xác định, và như vậy, và điều này sẽ phải được thực hiện bằng cách mở rộng cấu hình máy chủ XMPP (để nó sử dụng cùng một máy chủ LDAP như ứng dụng PHP của bạn chẳng hạn).

Vấn đề bỏ phiếu dài thứ hai của bạn là trạng thái của hàng đợi. Bạn có thể tìm thấy một số phần mở rộng XMPP cho điều đó, có thể. Hoặc bạn có thể thực hiện các truy vấn ajax thông thường trên hàng đợi. Một trong những kỹ thuật hữu ích để tránh số lượng lớn các yêu cầu ajax trên ứng dụng PHP của bạn là lên lịch lại kiểm tra ajax tiếp theo trên ajax callback của kiểm tra, dựa trên các số Fibonacci (đó là một ví dụ). Vì vậy, lần đầu tiên cuộc gọi ajax tiếp theo sẽ được lên lịch 1 phút sau, thời gian tới 2 phút, sau đó 3m, 5m, 8m, 13m, 21m, 34m, 55m, 89m, 144m, v.v. Ý tưởng là có thể quan trọng để kiểm tra tin nhắn mới đến 1 phút sau khi tải trang. Vì người dùng vẫn đọc cùng một trang (hoặc uống cà phê, nói chuyện với một người bạn, đi nghỉ mà không tắt máy tính của mình, vv), chúng tôi có thể trì hoãn ngày càng nhiều lần kiểm tra tiếp theo.Là một cách giả định người dùng không thực sự hoạt động. Lưu ý rằng bạn có thể phát hiện hoạt động của người dùng bằng các phương tiện khác và thay đổi thời gian lên lịch lại.

-1

PHP cũng không phù hợp với việc bỏ phiếu dài, Sao chổi và công nghệ ajax ngược. Bạn nên sử dụng Node.js

+1

vui lòng đưa ra một số lý do thay vì trả lời trong một dòng. – pascalhein