2010-01-13 32 views
5

Tôi muốn hiển thị cho người dùng một tệp văn bản lớn (100MB Tệp nhật ký cụ thể) qua giao diện web mà không yêu cầu người dùng phải tải xuống toàn bộ tệp. Rõ ràng việc trả lại toàn bộ tệp cho trình duyệt web sẽ không hợp lý, vì vậy lý thuyết của tôi là sử dụng Ajax để tìm nạp các phần của tệp tùy thuộc vào người dùng cuộn qua tệp, tương tự như cách Google Maps cung cấp "cửa sổ" của bản đồ .Hiển thị các tệp văn bản lớn qua Ajax/dojo

Máy chủ ứng dụng của tôi là PHP và tôi khá chắc chắn rằng tôi có thể thực hiện tìm kiếm và đọc thích hợp thông qua tệp và trả kết quả qua XHR cho ứng dụng, nhưng khung Ajax của tôi là dojo và tôi không thể nghĩ ra bất kỳ tiêu chuẩn nào điều đó sẽ hoạt động và tôi đang cố gắng tìm ra cách tốt nhất để cấy ghép một cái gì đó.

Tôi có nên lấy phụ tùng của riêng mình không? Có điều gì đó ngoài kia mà tôi không biết? Nếu tôi xây dựng widget tùy chỉnh của riêng mình, cần phải có loại cấu trúc nào và có tài nguyên nào tốt để phát triển các widget tùy chỉnh cho dojo/dijit không? Bất kỳ suy nghĩ nào khác?

Trả lời

1

This seems to be a tut on what you might need Tôi khuyên bạn nên sử dụng li, vì bạn sẽ muốn thực hiện một số hành động trên mỗi dòng, rất có thể mỗi dòng sẽ có liên quan.

Di chuyển rất đẹp, nhưng bạn cũng có thể chỉ trích giao diện với phân trang, nghĩa là họ nhấp vào trang tiếp theo, trang trước và bạn tìm nạp, sau đó cập nhật chế độ xem. Đó là phương pháp dễ nhất. Với cuộn, bạn sẽ cần phải nhận được nhiều hơn ở trên và dưới các dòng hiển thị hiện tại để cuộn liền mạch. Ví dụ: nếu bạn muốn hiển thị 25 dòng, bạn sẽ cần tìm nạp 25 + đệm dưới cùng trên bước đầu tiên và xác định các dòng hiển thị ở dưới cùng dưới dạng ngưỡng để báo hiệu sự kiện mới để tải xuống thêm 25+ mục dưới cùng.

Với tệp 100MB, sẽ sớm bị chậm chạp, vì vậy bạn sẽ phải xóa các mục trước và xác định bảng điều khiển mới để báo hiệu yêu cầu đảo ngược. Đó là để nói, req 1: lấy 25 + pad dưới cùng, 2 req lấy 25 + pad dưới loại bỏ prev 25 - top pad. Một điều cần lưu ý là, khi bạn làm điều này, trong firefox ít nhất, nó có thể có xu hướng để có được sự kiện sôi nổi và không cháy sau một vài tải, vì vậy bạn có thể muốn unbind/rebind thậm chí nghe của bạn.Tôi chỉ nói điều này bởi vì tôi có một người bạn hiện đang làm việc trên một cái gì đó có chức năng tương tự, và đây là một số vấn đề mà anh ta gặp phải.

Không ai phàn nàn rằng họ phải nhấp vào trang tiếp theo/trang trước đó, nó sẽ nhanh chóng và sạch sẽ, nhưng làm hỏng cuộn của bạn và không ai muốn sử dụng tiện ích của bạn.

Dưới đây là một số tài nguyên khác về chủ đề này: Old Ajax Scrollable Table-Twitter like load more tut - Good scrolling example, read the source-Check out this googlecode project

+0

Suy nghĩ thú vị về phân trang. Tôi thành thật đã không nghĩ về nó (và tôi không biết tại sao). Cảm ơn các tut, và một phác thảo thô về những gì sẽ cần phải được thực hiện và một thay thế khả thi khả thi. – Kitson

+0

Vui mừng được giúp đỡ và đừng lo lắng về các tính năng snazzy, chức năng đầu tiên là phương châm của tôi. Chúc may mắn với dự án của bạn! –

0

Nếu tệp nhật ký là tệp văn bản có dòng nhất quán kết thúc, có thể bạn có thể tìm nạp nó theo số dòng.

Tôi có ý tưởng với các thuật toán như thế này:

  1. Khi trang web được nạp, lấy 100 dòng đầu tiên từ tệp. đặt nó trong một số thùng chứa, có thể là div, textarea hoặc sử dụng <ul><li>
  2. Đặt trình xử lý sự kiện để biết người dùng đó có di chuyển đến phần cuối cùng của vùng chứa hay không.
  3. Gửi yêu cầu AJAX để nhận 100 dòng tiếp theo từ tệp. Chuyển ithe line offset thành tham số (GET hoặc URI Parameter) để đoạn mã PHP có thể lấy phần bên phải của tập tin
  4. Đặt phản hồi AJAX vào cuối container, cập nhật bù yêu cầu AJAX tiếp theo.
  5. Nếu không còn dòng nào trong tệp, hãy trả về phản hồi trống. Trình xử lý AJAX nên coi đây là phần cuối của tệp, vì vậy sẽ loại bỏ trình xử lý sự kiện trong bước 2 ở trên.

Tôi không biết nhiều về Dojo. Tôi sử dụng jquery tools's scrollable trong đơn đăng ký của mình. Thật dễ dàng để đặt trình xử lý sự kiện khi trình khám phá đến trang cuối cùng, sau đó tìm nạp mục tiếp theo.

+0

Vâng, điều này tương tự như những gì tôi đang nghĩ, nhưng nếu tôi tiếp tục tải và tải các đối tượng vào bộ nhớ của trình duyệt, cuối cùng tôi sẽ phát nổ nó. Tôi nghĩ rằng tôi sẽ cần phải lo lắng về việc dỡ các vật thể. dojo có một đối tượng tương tự được gọi là 'dojox.layout.ScrollPane'. Tôi có thể lấy được thứ gì đó từ đó. – Kitson

1

Tôi khuyên bạn nên bộ nhớ đệm. Cần lưu ý rằng giải pháp cho vấn đề này nên tính đến việc đọc tệp đủ lớn (100mb +) từ đĩa sẽ bị ràng buộc đĩa và có khả năng vượt quá bất kỳ thời gian chờ nào mà máy chủ web của bạn đã đặt để thực thi tập lệnh thời gian. Để tránh làm cho người dùng chờ đợi một lượng thời gian không đủ để tải bất kỳ phần nào của tệp, tôi sẽ tránh các lỗi như thay đổi giới hạn thời gian chờ của máy chủ.

Dưới đây là một giải pháp khả thi mà bạn quan tâm: 1) Cache tệp bằng cách cắt nó thành các tệp riêng biệt. Bạn có thể dễ dàng làm điều này trong một công việc cron hoặc thậm chí kích hoạt nó khi tập tin được viết. Sử dụng readfile_chunked (http://cn2.php.net/manual/en/function.readfile.php#48683) hoặc tương tự.

2) Viết tập lệnh xử lý dịch vụ khi được gọi từ trình duyệt (nói './readfile?chunk=##') trả về đoạn được yêu cầu.

3) Sử dụng tiện ích mở rộng phân trang hoặc trình cuộn theo đề xuất của người đóng góp khác để thực hiện cuộc gọi tới trình xử lý dịch vụ qua AJAX.

Nhược điểm: Điều này chắc chắn sẽ làm tăng lượng dung lượng đĩa. Ưu điểm: Người dùng hạnh phúc khi truy cập đĩa sẽ được tối ưu hóa và do đó sẽ thực thi thời gian thực thi. Ngoài ra, nó vảy tốt. (theo thứ tự của O (n)).

+0

Thú vị mặc dù, đặc biệt là "readfile_chunked", tôi sẽ xem xét nó. Vấn đề là sẽ có khoảng 160.000 tệp nhật ký như vậy mà chỉ có thể 10-20 người mới có thể xem được từ 5-10 người dùng. Tôi đã có một quá trình lập chỉ mục chúng theo cách có ý nghĩa nhưng tôi muốn cung cấp cách xem nhật ký mà không cần phải tải xuống lưu trữ cục bộ và tìm 20 hoặc 30 dòng mà người dùng đang tìm kiếm. – Kitson

1

Bạn đã cân nhắc sử dụng Dojo Grid để xem nhật ký chưa? Nó có hỗ trợ tích hợp cho tải động 'các trang' tức là các hàng dữ liệu.

+0

Tôi coi nó ... Nó hơi phức tạp một chút đối với những gì tôi cần và có một số yếu tố giao diện người dùng không thể tự làm việc theo cách tôi cần, nhưng thật buồn cười là bạn nên đề cập đến nó, bởi vì tôi quyết định tiến lên phía trước với việc viết một widget dojo tùy chỉnh và Datastore làm những gì tôi cần và tôi phát hiện ra 'dojox.grid._Scroller' là một phần của lưới rất giống với những gì tôi cần và đang lấy rất nhiều manh mối từ nó. – Kitson

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