Thường xuyên trong các ứng dụng web, chúng ta có thể có một yêu cầu đến hệ thống back-end, điều này có thể kích hoạt một tiến trình chạy lâu như tìm kiếm một lượng lớn dữ liệu hoặc một tiến trình cơ sở dữ liệu chạy lâu. Sau đó, trang web front-end có thể bị treo và chờ tiến trình hoàn tất. Trong quá trình này, nếu chúng ta có thể cung cấp cho người dùng một số thông tin về tiến độ của tiến trình back-end, điều đó có thể cải thiện trải nghiệm người dùng. Thật không may, trong các ứng dụng web, điều này dường như không phải là một nhiệm vụ dễ dàng vì các ngôn ngữ kịch bản web không hỗ trợ đa luồng và HTTP là không trạng thái. Bây giờ chúng ta có thể sử dụng AJAX để mô phỏng tiến trình thời gian thực. Hôm nay chúng ta sẽ sử dụng PHP+jQuery để mô phỏng một tiến trình để lấy tiến độ của một tiến trình chạy lâu một cách động.
Chúng ta cần ba tập tin:
<?php //long_process.php for($i=1;$i<=10;$i++){ session_start(); $_SESSION["progress"]=$i; session_write_close(); sleep(1); } ?>
Mã ở trên là long_process.php, mô phỏng tiến trình chạy lâu, nó thực sự có một vòng lặp for sẽ lặp từ 1 đến 10 và sẽ ngủ trong một giây sau mỗi vòng lặp. Điều quan trọng nhất ở đây là chúng ta sử dụng một biến session $_SESSION["progress"] để lưu trữ tiến độ, cũng đừng quên sử dụng session_write_close() sau mỗi vòng lặp vì dữ liệu session thường được lưu trữ sau khi script của bạn kết thúc mà không cần gọi session_write_close(), nhưng vì dữ liệu session bị khóa để ngăn chặn ghi đồng thời nên chỉ có một script có thể hoạt động trên một session tại bất kỳ thời điểm nào. Khi sử dụng frameset cùng với session, bạn sẽ thấy các frame tải lần lượt do việc khóa này. Bạn có thể giảm thời gian cần thiết để tải tất cả các frame bằng cách kết thúc session ngay khi tất cả các thay đổi đối với biến session được thực hiện.
Một tập tin nữa là progress.php
<?php //progress.php session_start(); echo $_SESSION["progress"]; ?>
nó làm việc rất đơn giản, chỉ cần echo tiến độ đến client. Biến tiến độ này là biến session được cập nhật trong long_process.php.
Một tập tin PHP cuối cùng:
<script type="text/javascript"> //Start the long running process $.ajax({ url: 'long_process.php', success: function(data) { } }); //Start receiving progress function getProgress(){ $.ajax({ url: 'progress.php', success: function(data) { $("#progress").html(data); if(data<10){ getProgress(); } } }); } getProgress(); </script> <div id="progress"></div>
Mã ở trên chỉ chứa mã bên trong (tôi bỏ qua phần còn lại của mã) và nó thực sự là mục nhập của mô phỏng, nó sử dụng AJAX để gửi hai yêu cầu đến máy chủ, một là để khởi tạo tiến trình chạy lâu và cái kia là thăm dò máy chủ để lấy tiến độ. Và sau khi lấy được tiến độ, nó cập nhật tiến độ trên trang.
Tất nhiên có những cách khác để lưu trữ biến tiến độ như cơ sở dữ liệu hoặc tập tin xml, v.v. Bạn có thể chọn cách mà bạn thích hoặc cách mà bạn cho là hiệu quả nhất. Ngoài ra, ngoài mã PHP thuần túy, bạn có thể sử dụng flash hoặc applet Java để xử lý và thăm dò một tiến trình chạy lâu thông qua TCP hoặc UDP được nhiều trang web sử dụng.
Nếu bạn có cách nào tốt hơn ngoài cách này, bạn có thể chia sẻ với chúng tôi.
Thank you,this's very helpful to me!