2009-08-10 27 views
6

Tôi đã nhận thấy rằng một số trang web nặng của tôi (những trang tôi truy cập, không phải trang web tôi đã tạo), có một số tính năng tự động làm mới nhất định. Ví dụ: trong Gmail, nếu tôi nhận được thư mới, tôi thấy thông báo mới mà không cần tải lại trang. Nó giống với ứng dụng khách IM trên trình duyệt Facebook. Từ những gì tôi có thể nói, không có bất kỳ applet java xử lý ràng buộc trình duyệt máy chủ, vì vậy tôi còn lại để cho rằng nó đang được thực hiện bởi AJAX và có lẽ một số yếu tố tôi không biết. Vì vậy, bằng đoán tốt nhất của tôi, nó được thực hiện theo một trong hai cách sau:Reverse AJAX? Các thay đổi dữ liệu có thể được 'PUSHED' thành tập lệnh không?

  1. Các javascript hiện một "ping" ổn định để một server-side script, kiểm tra đối với bất kỳ bản cập nhật mà có thể có sẵn (mà có thể giải thích tại sao một số của các trang này mang lại bất kỳ trang nhiệm vụ nặng nào khác để thu thập dữ liệu). hoặc

  2. javascript ngồi không đúng và tập lệnh phía máy chủ thực sự "Đẩy" mọi bản cập nhật lên trình duyệt. Nhưng tôi không chắc chắn nếu điều này là có thể. Tôi muốn tưởng tượng có một số loại chức năng AJAX vẫn ping, nhưng tất cả nó chỉ đơn giản là yêu cầu "bất kỳ bản cập nhật?" và máy chủ-kịch bản có một boolean đơn giản mà nói "nope" hoặc "Tôi vui vì bạn đã hỏi." Nhưng nếu trường hợp này xảy ra, bất kỳ thay đổi dữ liệu nào cũng sẽ cần gọi trực tiếp kịch bản để nó có các thay đổi dữ liệu đã sẵn sàng và thực hiện thay đổi đối với hàm boolean đó.

Vì vậy, có thể/khả thi/cách hoạt động? Tôi tưởng tượng một cái gì đó như:

Ai đó gửi email/IM/DB cập nhật lên máy chủ, máy chủ gọi tập lệnh bằng URL của tập lệnh và một số biến GET có liên quan, tập lệnh ghi lại thay đổi và cập nhật biến "cập nhật khả dụng" , AJAX nhận được phản hồi rằng có trong bản cập nhật thực tế, AJAX chạy các chức năng "trang cập nhật" bình thường, thực thi các kịch bản cập nhật bình thường và xuất chúng ra trình duyệt.

Tôi hỏi vì dường như thực sự không hiệu quả khi js chỉ thực hiện kiểm tra liên tục yêu cầu a) máy chủ hoạt động sau 1,5 giây và b) trình duyệt của tôi hoạt động sau 1,5 giây chỉ để kết thúc Tôi có thể nói "Oh boy, tôi có một IM! Giống như một khách hàng IM thực sự!"

Trả lời

6

Đọc về Comet

+0

Chà, tôi thậm chí còn sử dụng cùng một cụm từ. điều đó gần như lúng túng.Nhưng tìm kiếm ban đầu của tôi về cách thực hiện điều này trong PHP đề cập đến các tập lệnh lặp vô hạn. Có một vòng lặp vô hạn phải diễn ra ở đâu đó dọc theo dòng cho loại điều này để làm việc? Tại sao không thể thay đổi nguồn dữ liệu thực tế (máy chủ IMAP, DB, tệp txt, bất kỳ thứ gì) kích hoạt tập lệnh để đánh thức và xử lý mọi thứ? – Anthony

0

Tôi đã thực sự được làm việc trên một nhỏ NET Web App mà sử dụng Ajax với kỹ thuật polling dài mô tả.

Tùy thuộc vào công nghệ bạn đang sử dụng, bạn có thể sử dụng các cơ chế báo hiệu luồng để giữ yêu cầu của mình cho đến khi bản cập nhật được truy xuất. Với ASP.NET Tôi đang chạy máy chủ của tôi trên một máy duy nhất, vì vậy tôi lưu trữ một tham chiếu đến đối tượng Producer của tôi (có chứa một luồng xử lý dữ liệu). Để bắt đầu kéo dữ liệu, phương thức Đăng ký của dịch vụ của tôi được gọi, tạo ra một đối tượng Người tiêu dùng được đăng ký với Nhà sản xuất. Nếu người tiêu dùng là chế độ bỏ phiếu dài, nó có một AutoResetEvent được báo hiệu bất cứ khi nào nó nhận dữ liệu mới, và bất cứ khi nào máy khách web yêu cầu dữ liệu, người tiêu dùng đầu tiên chờ đợi về sự kiện đặt lại và sau đó trả về nó. Nhưng bạn đang đề cập đến một cái gì đó về PHP - theo như tôi biết kiên trì được duy trì thông qua serialization, không thực sự giữ đối tượng trong bộ nhớ, vì vậy tôi không biết làm thế nào bạn có thể tham chiếu một đối tượng Producer sử dụng $ _CACHE [] hoặc $ _SESSION []. Khi tôi phát triển trong PHP tôi không bao giờ thực sự biết bất cứ điều gì về đa luồng vì vậy tôi đã không chơi xung quanh với nó, nhưng tôi đoán bạn có thể nhìn vào đó.

Sử dụng vòng lặp vô hạn sẽ tiêu tốn rất nhiều sức mạnh xử lý của bạn - trước tiên tôi sẽ loại bỏ tất cả các tùy chọn khác.

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