2013-07-25 26 views
7

Tôi đang cố gắng lập trình chức năng bỏ phiếu dài trong Laravel, nhưng khi tôi sử dụng hàm sleep(), toàn bộ ứng dụng bị đóng băng/khối cho đến khi hàm sleep() hoan thanh. Có ai biết làm thế nào để giải quyết vấn đề này?Bỏ phiếu dài trong Laravel (sleep() làm cho ứng dụng đóng băng)

javascript của tôi trông như thế này:

function startRefresh() { 

longpending = $.ajax({ 
    type: 'POST', 
    url: '/getNewWords', 
    data: { wordid: ""+$('.lastWordId').attr('class').split(' ')[1]+"" }, 
    async: true, 
    cache: false 
}).done(function(data) { 
    $("#words").prepend(data); 
    startRefresh(); 
}); 

} 

Và PHP:

public function longPolling() 
{ 
    $time = time(); 
    $wordid = Input::get('wordid'); 
    session_write_close(); 
    //set_time_limit(0); 

    while((time() - $time) < 15) { 
     $words = Word::take(100)->where('id', '>', $wordid) 
     ->orderBy('created_at', 'desc')->get(); 

     if (!$words->isEmpty()) { 

      $theView = View::make('words.index', ['words' => $words])->render(); 

      if (is_object($words[0])) { 
       $theView .= '<script> 
       $(".lastWordId").removeClass($(".lastWordId").attr("class") 
       .split(" ")[1]).addClass("'.$words[0]->id.'"); 
       </script>'; 
      } 

      return $theView; 

     } else { 
      sleep(2); 
     } 
    } 
} 

Tôi đang sử dụng: PHP 5.5 và Apache 2.2.22

Vấn đề không dường như xảy ra bên ngoài Laravel (không có dự án Laravel nào).

Xin cảm ơn trước.

Trả lời

-6

Bạn nên làm như longpolling trong javascript và kiểm tra mỗi 2 giây

var refreshIntervalId = setInterval(function() { 

    // perform AJAX request every 2 seconds 
    longpending = $.ajax({ 
     type: 'POST', 
     url: '/getNewWords', 
     data: { wordid: ""+$('.lastWordId').attr('class').split(' ')[1]+"" }, 
     async: true, 
     cache: false 
    }).done(function(data) { 
     // process JSON response 
     var obj = jQuery.parseJSON(data); 

     $("#words").prepend(obj.output); 
     if(obj.status) == 'complete' 
     clearInterval(refreshIntervalId); 
     startRefresh(); 
}); 

}, 2000); // end refreshInterval 

Sau đó, trong chương trình PHP

echo json_encode(array('status'=> 'incomplete', 'output'=>$theView)); 

đã không được kiểm tra mã này, nhưng bạn sẽ nhận được các ý tưởng.

+5

Đây không phải là cuộc thăm dò ý kiến ​​dài. Chỉ cần bỏ phiếu của nó. –

+0

Lý do tôi làm như thế này là bởi vì với apache/php, bạn sẽ thường xuyên chạy vào thời gian chờ kết nối bằng cách để lại một kết nối mở. Đặc biệt nếu bạn đang ở phía sau bộ cân bằng tải Amazon, kết nối sẽ hết sau 30 giây. IMO tốt hơn để thăm dò mỗi vài giây. – bonez

+0

Bỏ phiếu dễ dàng. Việc bỏ phiếu dài là khó khăn trong PHP ít nhất. – doncadavona

5

Thực ra nó không phải là bỏ phiếu dài nếu bạn sử dụng mã xương. Bỏ phiếu dài là nếu kết nối vẫn mở (có thể hết thời gian chờ) cho đến khi máy chủ gửi phản hồi. Nếu khách hàng gửi mỗi 2 giây một yêu cầu và nhận được một phản hồi, nó chỉ là bỏ phiếu và bạn nhận được phản hồi của máy chủ trễ 2 giây trong trường hợp xấu nhất. Với việc bỏ phiếu dài, bạn không có sự chậm trễ này.

Vấn đề đóng băng không có lỗi với Laravel. Các khối phiên. Vì vậy, sử dụng session_write_close(); trước khi gọi phương thức bỏ phiếu dài hoặc sử dụng trình điều khiển phiên cookie. Để biết thêm thông tin, vui lòng xem http://konrness.com/php5/how-to-prevent-blocking-php-requests/

+0

'session_write_close()' có hoạt động trong Laravel không ?? Anh ấy đã gọi nó rồi .. – daVe

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