บ่อยครั้งในเว็บแอปพลิเคชัน เราอาจมีคำขอไปยังระบบแบ็กเอนด์ซึ่งอาจทำให้เกิดกระบวนการทำงานที่ใช้เวลานาน เช่น การค้นหาข้อมูลจำนวนมหาศาลหรือกระบวนการฐานข้อมูลที่ใช้เวลานาน จากนั้นเว็บเพจฝั่งหน้าอาจหยุดทำงานและรอให้กระบวนการเสร็จสิ้น ในระหว่างกระบวนการนี้ หากเราสามารถให้ข้อมูลบางอย่างแก่ผู้ใช้เกี่ยวกับความคืบหน้าของกระบวนการแบ็กเอนด์ ก็อาจช่วยปรับปรุงประสบการณ์ของผู้ใช้ได้ น่าเสียดายที่ในเว็บแอปพลิเคชัน สิ่งนี้ดูเหมือนจะเป็นงานที่ไม่ง่ายนัก เนื่องจากภาษาสคริปต์เว็บไม่รองรับการทำงานแบบมัลติเธรดและ HTTP เป็นแบบไร้สถานะ ตอนนี้เราสามารถใช้ AJAX เพื่อจำลองกระบวนการแบบเรียลไทม์ได้ วันนี้เราจะใช้ PHP+jQuery เพื่อจำลองกระบวนการในการรับความคืบหน้าของกระบวนการทำงานที่ใช้เวลานานแบบไดนามิก
เราต้องการไฟล์สามไฟล์:
<?php
//long_process.php
for($i=1;$i<=10;$i++){
session_start();
$_SESSION["progress"]=$i;
session_write_close();
sleep(1);
}
?>
โค้ดข้างต้นคือ long_process.php ซึ่งจำลองกระบวนการทำงานที่ใช้เวลานาน จริงๆ แล้วมันมีลูป for ซึ่งจะวนลูปจาก 1 ถึง 10 และจะหยุดทำงานหนึ่งวินาทีหลังจากแต่ละลูป สิ่งสำคัญที่สุดที่นี่คือเราใช้ตัวแปรเซสชัน $_SESSION["progress"] เพื่อเก็บความคืบหน้า และอย่าลืมใช้ session_write_close() หลังจากแต่ละลูป เนื่องจากข้อมูลเซสชันมักจะถูกเก็บไว้หลังจากสคริปต์ของคุณสิ้นสุดลงโดยไม่จำเป็นต้องเรียกใช้ session_write_close() แต่เนื่องจากข้อมูลเซสชันถูกล็อกเพื่อป้องกันการเขียนพร้อมกัน สคริปต์เพียงสคริปต์เดียวเท่านั้นที่สามารถทำงานกับเซสชันได้ในแต่ละครั้ง เมื่อใช้เฟรมเซ็ตพร้อมกับเซสชัน คุณจะพบว่าเฟรมโหลดทีละเฟรมเนื่องจากการล็อกนี้ คุณสามารถลดเวลาที่ใช้ในการโหลดเฟรมทั้งหมดได้โดยการสิ้นสุดเซสชันทันทีที่การเปลี่ยนแปลงตัวแปรเซสชันทั้งหมดเสร็จสิ้น
ไฟล์อีกไฟล์หนึ่งคือ progress.php
<?php
//progress.php
session_start();
echo $_SESSION["progress"];
?>
สิ่งที่มันทำนั้นง่ายมาก เพียงแค่แสดงความคืบหน้าไปยังไคลเอนต์ ตัวแปรความคืบหน้านี้คือตัวแปรเซสชันที่อัปเดตใน long_process.php
ไฟล์ PHP ไฟล์สุดท้าย:
<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>
โค้ดข้างต้นมีเพียงโค้ดที่อยู่ภายใน (ฉันละเว้นโค้ดที่เหลือ) และจริงๆ แล้วเป็นจุดเริ่มต้นของการจำลอง มันใช้ AJAX เพื่อส่งคำขอสองคำขอไปยังเซิร์ฟเวอร์ คำขอหนึ่งคือการเริ่มต้นกระบวนการทำงานที่ใช้เวลานาน และอีกคำขอหนึ่งคือการสอบถามเซิร์ฟเวอร์เพื่อรับความคืบหน้า และหลังจากได้รับความคืบหน้าแล้ว มันจะอัปเดตความคืบหน้าบนหน้าเว็บ
แน่นอนว่ามีวิธีอื่นๆ ในการจัดเก็บตัวแปรความคืบหน้า เช่น ฐานข้อมูลหรือไฟล์ xml เป็นต้น คุณสามารถเลือกวิธีที่คุณต้องการหรือวิธีที่คุณคิดว่ามีประสิทธิภาพที่สุด นอกจากนี้ นอกเหนือจากโค้ด PHP บริสุทธิ์แล้ว คุณยังสามารถใช้แฟลชหรือแอปเพล็ต Java เพื่อประมวลผลและสอบถามกระบวนการทำงานที่ใช้เวลานานผ่าน TCP หรือ UDP ซึ่งเว็บไซต์จำนวนมากใช้
หากคุณมีวิธีที่ดีกว่านี้ คุณสามารถแบ่งปันกับเราได้
Thank you,this's very helpful to me!