2017-09-13 33 views
7

Tôi gọi AJAX để kiểm tra DB nếu có thông báo mới cứ 3 hoặc 10 giây với cùng một truy vấn từ 4 trình duyệt khác nhau cùng một lúc. Nhưng tại một số điểm sau vòng lặp 100 trở lên, máy chủ trả về Lỗi 508 (Phát hiện vòng lặp). Đây chỉ là trang web đơn giản vì vậy tôi không nghĩ rằng tôi cần máy chủ VPS.Kích hoạt lặp lại thông báo kích hoạt Lỗi 508 (Phát hiện vòng lặp)

Tôi đã thêm dấu thời gian trong SELECT làm truy vấn phân biệt, bỏ đặt, tuôn ra, mysqli_free_result, tạm dừng, mysqli_kill, mysqli_close, nhưng lỗi vẫn xảy ra. Quá trình nhập cảnh đạt 20/20.

Script

var counter = 1; 
var notiftimer; 

$(document).ready(function() { 
    ajax_loadnotifs(); 
}); 

function ajax_loadnotifs() { 
    $.ajax({ 
     type: "post", 
     url: "service.php", 
     dataType: "json", 
     data: { action:'loadnotifs' }, 
     success: function(data, textStatus, jqXHR){ 
      $("div").append($("<p>").text(counter++ + ": succeeded")); 

      notiftimer = setTimeout(function() { 
       ajax_loadnotifs(); 
      }, 3000); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      console.log(jqXHR.responseText); 
     } 
    }); 
} 

service.php

$link = mysqli_connect('localhost', 'root', 'root', 'testdb'); 
$notifs = array(); 

$query = "SELECT id, message FROM notifs LIMIT 20"; 
if (!$temp_notifs = mysqli_query($link, $query)) { 
    die(json_encode(array("errmsg" => "Selecting notifs."))); 
} 

while($notif = mysqli_fetch_assoc($temp_notifs)) { 
    $notifs[] = $notif; 
} 

mysqli_close($link);   
echo json_encode($notifs); 

cPanel - Resource Cách sử dụng Tổng quan

cPanel - Resource Usage Overview

Khi quá trình nhập đạt 20/20, tôi gặp lỗi 508. Cách duy trì quy trình nhập máy chủ thấp? (Thử nghiệm với 4 trình duyệt khác nhau, chạy chúng tất cả cho đến khi vòng 100 trên chia sẻ lưu trữ. Không có vấn đề trên máy tính cục bộ)

+0

Nếu bạn có thể thêm nhiều mã của mình, nó sẽ giúp chúng tôi tìm ra những gì đang xảy ra. Trên bề mặt, nhấn kịch bản bốn lần ba phút một lần không được vượt quá giới hạn quy trình nhập của bạn. –

+0

@Jeaf Gilbert, vui lòng mở tab mạng trong trình duyệt khi điều này xảy ra và hiển thị cho chúng tôi tiêu đề Phản hồi cho yêu cầu không thành công đó. Sau đó, chúng ta sẽ thấy chính xác chương trình nào trả về lỗi này. Nó có thể là máy chủ web, php hoặc một số proxy. –

+0

@ i-man được cập nhật, vui lòng xem. –

Trả lời

0

Chỉ ra rằng sử dụng https thay vì phương thức http và AJAX 'get' thay vì 'bài đăng' sẽ ngăn lỗi này.

5

gì được xem là một quá trình nhập cảnh?

"Quy trình nhập" là số lượng tập lệnh PHP bạn đã chạy cùng một lúc.

Nguồn: https://billing.stablehost.com/knowledgebase/186/What-is-considered-an-Entry-Processes.html

Vì vậy, vấn đề cơ bản như bạn đã phát hiện ra là cuối cùng bạn đang chạy quá nhiều tiến trình cùng một lúc. Có một vài điều bạn có thể làm để giải quyết vấn đề.

Lựa chọn 1

Tìm một máy chủ web mới. Điều này có lẽ là đơn giản nhất nhưng cũng tốn kém nhất tùy thuộc vào loại sắp xếp tài chính bạn có với máy chủ hiện tại của bạn. Tìm một cái không có giới hạn này.

Lựa chọn 2

Tăng thời gian giữa các yêu cầu ajax. Tại sao bạn cần phải yêu cầu mỗi 3 giây? Đó là một khoảng thời gian rất ngắn. Khoảng 15 giây? Hoặc 30 giây? Hay heck, thậm chí 1 phút? Người dùng của bạn có thể không cần dữ liệu của họ được làm mới thường xuyên như bạn nghĩ.

Lựa chọn 3

Chỉ thực hiện các cuộc gọi ajax nếu tab hiện tại/cửa sổ được lấy nét. Không có lý do gì để tiếp tục bỏ phiếu cho các thông báo nếu người dùng thậm chí không xem trang của bạn.

Check-out Document.hasFocus(): https://developer.mozilla.org/en-US/docs/Web/API/Document/hasFocus

Lựa chọn 4

Thực hiện một lớp bộ nhớ đệm. Nếu bạn cảm thấy như bạn vẫn cần phải yêu cầu dữ liệu rất, rất thường xuyên sau đó cải thiện nhanh như thế nào bạn lấy dữ liệu này. Cách bạn triển khai bộ nhớ đệm tùy thuộc vào bạn nhưng trong một số trường hợp thậm chí việc sử dụng ghi/đọc tệp có thể làm giảm lượng thời gian và tài nguyên cần thiết để đáp ứng yêu cầu.

Sau khi bạn nhận được thông báo từ cơ sở dữ liệu, chỉ cần lưu JSON vào tệp văn bản và có các yêu cầu tiếp theo được gửi từ đó cho đến khi dữ liệu cơ sở dữ liệu thay đổi. Xem liệu điều này có cải thiện hiệu suất hay không.

Nếu bạn muốn tập trung hơn vào bộ nhớ đệm, bạn có thể xem các tùy chọn như Memcached (https://en.wikipedia.org/wiki/Memcached) hoặc Redis (https://en.wikipedia.org/wiki/Redis).

Hãy thử kết hợp nhiều tùy chọn để có hiệu suất tốt hơn nữa!

+0

Tôi thích tùy chọn 3 và 2. Liên quan đến tùy chọn 2, bạn có ý tưởng về cách Facebook không thể truy xuất hoặc công việc trò chuyện trên facebook không? Tôi nghĩ rằng nó thực sự là thời gian thực cả từ điện thoại và máy tính để bàn thông báo cùng một lúc. –

+0

Tôi không biết cụ thể cách thức hoạt động nhưng có trò chuyện sẽ là thời gian thực. Tuy nhiên, Facebook có rất nhiều tài nguyên để thực hiện điều đó. Việc cố gắng tạo lại một ứng dụng trò chuyện trên một máy chủ web có khối lượng thấp có lẽ không lý tưởng. – neuromatter

+0

Đã cập nhật thành 30 giây và sử dụng document.hasFocus. Không có rò rỉ EP/bộ nhớ. Cảm ơn bạn! –

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