Sử dụng ajax hay sử dụng reload file js (jsonp)

vd: mình có 2 pages doctor.php, insert_patient.php

doctor1 doctor2 đang trên trang doctor.php

nurse1 trên trang insert_patient.php insert bệnh nhân cho doctor1 and doctor2,

cách1. sử dụng Ajax

trang doctor.php mỗi 15 giây send ajax để check data bệnh nhân nào là của mình,

cách2. sử dụng reload file JS kết hợp Ajax

khi mà nurse1 insert bệnh nhân thì sẽ ghi ra file js

file_put_contents('js/checkDataServer.js', 'checkPatient('. time() .')') // trigger change data

common.js được sử dụng cho trang doctor.php

// file js/common.js
var time = '';
function checkPatient(t) {
    if (time == '') {
        time = t;
    } else {
        if (time != t) {
           // send ajax to server check patient and get data
        }
    }
}
setInterval(function(){
    $('body').find('.scriptReload').remove();
    $('body').append('<script class="scriptReload" src="/js/checkDataServer.js?a='
                    + (new Date).getTime() +'"></script>');
}, 250);

cách nào thì tốt hơn, nhanh hơn giảm tải server hơn, nếu có nhiều bác sĩ cứ 15 giây gửi 1 lần.

9 Likes

Gửi request để check thông tin mỗi 15 giây thì mình nghĩ là không cần lo lắng về tải của server đâu. Cứ cái nào đơn giản (hoặc thấy tiện) hơn thì chọn thôi.

10 Likes

sao lại không cần bạn, có những ca bệnh nhân trường hợp khẩn cấp thì, khoảng 5 giây 1 lần, để bác sĩ còn phản ứng kịp, sau này khách hàng muốn 5 thì sao, mà trang có nhiều người dùng thì sao, server chịu sao nổi

9 Likes

Cách dễ nhất để xác định cách nào tiêu tốn tài nguyên server nhiều hơn, bạn dùng Developer Tools của Browser, phần networks để kiểm tra xem mỗi request nó nặng bao nhiêu, …

Về phần tải server, nếu mỗi request không quá lớn, thì dù có gửi request mỗi 5 giây thì mình nghĩ không không thành vấn đề lắm, và nếu cần thiết thì nâng cấp server lên thôi. Giá server giờ cũng không mắc.

Hơn nữa, ban viết phần mềm quản lý như trên, thì số người dùng cũng không quá nhiều như một trang tin tức hay tương tự.

9 Likes

cái request nó trả về json, phần tải server thì thành vấn đề đó, còn chuyện server là của người ta, đâu phải mình biểu người ta nâng cấp là nâng cấp. test perfoment thì cần phải có nhiều máy test thì mới biết nó nặng hay nhẹ. mình hỏi là cách nào tốt hơn thôi? ít tốn tài nguyên server hơn thôi, sau này họ muốn 1s 1 lần thì sao, mình cũng nghĩ đến chuyện dùng server websocket, cái này cũng cần tạo server riêng nên hơi phiền, focus vào câu hỏi giúp mình.

9 Likes

Khi user sử dụng, tải 1 page về, sau đó cứ 5 giây nó request lên server 1 lần để update thông tin.
Khi server nhận request, thì nó sẽ xử lý, search từ database, và gửi response về clients.
Với cả 2 cách gửi, thì response từ server đều như nhau (là kết quả json), vì vấn đề là cách server xử lý chứ đâu phải client gửi thế nào?

9 Likes

cách thứ nhất là nó không biết khi nào có bệnh nhân mới, có 5s là nó gửi về get patient,
còn cách 2 thì nó không gửi ajax mà nó reload lại file js, file js này khi load thì nó sẽ tự động chạy function checkPatient để check thời gian có giống nhau hay không nếu giống thì không có bệnh nhân nào, còn khác thời gian thì có bệnh nhân mới thì lúc đó mới gửi ajax lấy thông itn bệnh nhân

setInterval(function(){
    $('body').find('.scriptReload').remove();
    $('body').append('<script class="scriptReload" src="/js/checkDataServer.js?a='
                    + (new Date).getTime() +'"></script>');
}, 250);
9 Likes

Nếu dữ liệu về bệnh nhân quá lớn, thì cách 2 của bạn sẽ tốt
Nếu không, thì sẽ không có sự khác biệt đáng kể nào giữa 2 cách request cả, thậm chí có khi file js bạn reload lại còn tiêu tốn tài nguyên server nhiều hơn cả request theo cách 1.

9 Likes

file js ‘js/checkDataServer.js’ này chỉ chứa 1 dòng này thôi, checkPatient(578984562)
nó được thay đổi mỗi khi nuser insert_patient mới dùng hàm này của php để nghi lại file

file_put_contents('js/checkDataServer.js', 'checkPatient('. time() .')') // trigger change data

còn cách 1 ajax gửi về get thông tin bệnh nhân mới, nếu không có thì ra json rỗng thôi, vậy thì data bệnh nhân quá lớn thì cả hai cách đều như nhau cả bạn

8 Likes

Cách 1 có lẽ tiết kiệm hơn. Tuy nhiên ở phía server nên check ít thôi, có 1 cờ với giá trị thật nhỏ, khi cờ đó thay đổi mới làm gì tiếp theo. Chứ đừng có query cả đống dữ liệu, server sẽ sớm quá tải.

Ví dụ khi nurse1 thực hiện insert_patient.php cho doctor1 thì xuất hiện một file id.txt chứa ID của bệnh nhân và ID cho doctor1, và trang doctor.php chỉ cần check xem có tồn tại file này hay không. Nếu tồn tại thì đọc và query vào DB lấy dữ liệu ra, không tồn tại không làm gì hết. Khi lấy dữ liệu ra, xóa luôn file id.txt kia để lặp lại chu trình khác.

Mình đã từng làm thử, file đó mình đặt ở ramdisk, khi test thử có đến hàng vạn lượt vẫn không hề hấn gì với server bởi thao tác PHP đọc 1 file có 10 byte trên ramdisk và gửi cái đó về client là rất nhẹ.

11 Likes

nếu bạn xóa luôn file đó thì mấy doctor khác sao nhận biết được có bệnh nhân mới, gửi cho nhiều doctor không phải riêng 1 doctor, còn việc bậc cờ ok thì việc bậc cờ trong db cũng được, để tránh việc query nhiều lần, nhưng mà bạn test ‘hàng vạn lượt’ bằng cách nào vậy?
mình cứ nghỉ là load file js tĩnh thì sẽ giảm tải server tốt hơn là gửi ajax?

9 Likes

Cho em hỏi là mỗi lần database có cập nhật dữ liệu mới thì khi muốn biết nó có gì thay đổi không thì mình phải quét từ đầu tới cuối record luôn hay sao ạ ? mà anh đang dùng database gì vậy ?

Có giải thích ở đây nè

9 Likes

vấn đề của bạn là một bài tập, một idea để làm chơi
hay là bạn làm product thương mại và sử dụng thực tế

  1. nếu làm bài tập hay làm chơi thì khỏi cần suy nghĩ chi cho mệt, không khác mấy
  2. nếu là production thì cả 2 các đều không nên, bạn đặt ra giả thuyết tải lớn, nhưng với ứng dụng như bạn mô tải cao lắm chỉ tầm chục người nhập liệu bệnh nhân thôi, còn bác sĩ không lẽ hàng trăm nguời, mà đã là bv lớn vậy thì chắc chắn có sự đầu tư nhất định chứ không sử dụng giải pháp như làm bài tập của bạn đâu
11 Likes

Mình cũng nghĩ chắc là bạn đang làm bài tập, hay dang demo project. nếu app thực tế mình nghĩ quy mô và phức tạp hơn nhiều :slight_smile:

1 Like

đây là một bài toán thực tế, production đã release, mà khách hàng chỉ yêu cầu 30s 1 lần, nên mình đã đưa ra giải pháp gửi ajax. nhưng sau này mình ngẫm lại thì mình muốn làm nó được tối ưu hơn thôi?
@TaoLaoBidaoBanBanhBa thực tế thì họ ít khi tạo file lắm bạn, check thì thêm data_change timestap vào là được rồi cái check data change thì ok rồi không có gì để bàn.

5 Likes

Vấn đề là “ý tưởng tối ưu” của bạn có bám sát nhu cầu thực tế hay không.
Không bàn tới cách làm chi tiết, mà xét đến hoàn cảnh sử dụng thực tế. Một ứng dụng có 100 users dùng cùng lúc sẽ cần giải pháp khác với 10000 người dùng cùng lúc, nên giải pháp cần bám sát hoàn cảnh.

5 Likes

lâu lâu mới thấy diễn đàn mình sôi nổi như này :grin::grin: thấy ai nói cũng đều có lí :))

1 Like

cái này mình nghĩ kết hợp firebase cũng khá ổn :smiley:
https://vimeo.com/381960010#t=15s

4 Likes

Có lẽ bạn chưa hiểu bản chất của ứng dụng dạng client - server, stateless, giao thức HTTP. Đừng đi quá nhanh khi chưa nắm được nền tảng của WWW.

Một số người vọc Ajax cứ “ốp lưng” dùng XML, JSON các kiểu. Trong khi ta cần đó là gửi request để nhận 1 mẩu bé xíu thông tin trả về để làm gì đó, file .txt là đủ xài.

Như ví dụ mình nói ở trên, mình cần đúng có 10 byte thì mình chỉ dùng JavaScript gửi request kiểu Ajax đọc đúng 10 byte đó mà thôi.

Ý tưởng của mình như sau:

  1. Điều dưỡng nhập 1 bệnh nhân mới, tại insert_patient.php click nút save sẽ tạo file id.txt có mabenhnhanh,mabacsi (10 bytes là tha hồ, nếu DEC là quá 10 byte, ta dùng HEX). Tất nhiên 10 byte đó phải liên quan dòng insert dữ liệu vào database mà không phải bàn cãi.
  2. doctor.php trong N giây sẽ gọi Ajax 1 lần xem có tồn tại file id.txt (đặt luôn trên ramdisk cho máu) không. Nếu có, đọc dòng duy nhất 10 byte rồi thảy qua cho PHP xử lý tiếp việc đọc DB và làm gì đó tiếp theo, nhớ xóa luôn id.txt. Nếu không tồn tại id.txt (tức lúc này chả có bệnh nhân mới nào - hoặc họ đã chết), không làm gì.
  3. Lặp lại các bước trên

Trong trường hợp cách trên lúc nào đó làm quá tải server thì các bước cần làm rõ: server quá tải là do đâu? (vd: do có quá nhiều bệnh nhân, bác sỹ hay các câu query vào database server - giả định rằng nằm cùng server với web server quá nặng, web server tối ưu chưa, có dùng proxy gì không, tinh chỉnh gì chưa, có cache kiếc gì không, PHP phiên bản nào, bật opcode hay máy ảo gì đó để cho tốc độ ổn hơn, phần cứng server/ hạ tầng mạng có đáp ứng yêu cầu không)

Túm lại, chuyện hệ thống phát triển đến lúc nào đó đập đi xây lại là xảy ra như cơm bữa trong nghề IT hoặc loay hoay tối ưu hóa các kiểu. Cứ đi, đường sẽ mở ra trước mắt, và đến nơi nào đó, nếu mà không đến thì… mất việc, đó là khẩu hiệu của dân IT dám chơi dám chịu :smiley:

9 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?