2011-01-20 3 views
2

나는 하나의 AJAX 호출을 통해 시간 소모적 인 작업을 수행해야하는 응용 프로그램에서 CakePHP를 작업하고 있으며, 보조 정기 AJAX 호출은 작업 진행 상황을 확인합니다.CakePHP 동시 AJAX 요청 블로킹

문제점

은 CakePHP의에 AJAX 요청의를 통해 (> 30 초 소요) 시간이 걸리는 작업이 실행되는 동안은 보조 진행 AJAX 요청 "차단"할 수없는 것 같다.

2 차 진행 AJAX 요청은 오류를 반환하지 않으며 원래 시간이 많이 소요되는 요청이 완료 될 때까지 응답을 반환하지 않습니다.

원래 AJAX 요청이 완료되면 보조 진행 AJAX 요청이 예상대로 반환됩니다.

반환 된 진행률이 100 %이므로 진행 요청의 실행이 첫 번째 AJAX 호출이 완료 될 때까지 대기중인 것으로 보입니다. - 수정 프로그램

  • 을 설정

    • 는 core.php에 '케이크'로 세션 핸들러를 변경하지 : 나는 등의 여러 제안 된 솔루션을 시도

      내가 무엇을 시도했다

      core.php에서 보안 수준을 'medium'으로 설정 - no fix

    • core.php에서 사용자 에이전트 검사를 사용하지 않음 - 수정 없음
    • mul 동일한 서버에서 평범한 PHP 스크립트를 여러 번 호출 - 예상대로 작동합니다.

    모든 아이디어?

    그래서 문제는 CakePHP에 의해 발생한 것 같습니다. 누구나 자신의 CakePHP 앱에서이 경험이 있습니까?

    감사합니다.

  • 답변

    0

    몇 가지 설명을 위해 기본 제공 AJAX 도우미 (프로토 타입) 또는 jQuery와 같은 외부 라이브러리를 사용하고 있습니까?

    보통 자바 스크립트 라이브러리는 {async: true}이며 동시성을 강요합니다. 이 예제 참조 : CakePHP의 내장 AJAX 도우미를 들어

    $.ajax({ 
        type: 'GET', 
        url: '/fetch.php', 
        async: true, 
        success: function(data, status) { 
         $('#status').html(status); 
        } 
    }); 
    

    을,이 옵션은 트릭을 수행해야합니다 $options['type']. 더 많은 정보 here. AJAX 도우미는 버전 1.3에서 더 이상 사용되지 않으며 jsHelper는 인계 할 수 있어야합니다 (예 : 이라는 옵션이 있음) request() 메소드 here을 참조하십시오.

    +0

    안녕하세요, 난 프로토 타입을 사용하고 있지만 JS 프레임 워크가 문제라고 생각하지 않습니다. 프로토 타입을 통해 CakePHP가 아닌 다른 서버에 동시 AJAX 호출을 할 수있었습니다. CakePHP 어딘가에서 "블로킹"이 일어나고있는 것처럼 보입니다. – Ben

    +0

    안녕하세요. 문제를 발견했습니다. 내 CakePHP 앱은 파일 기반 세션을 사용하고 있었기 때문에 핵심 CakePHP 파일은 한 번에 하나의 요청으로 만 액세스 할 수있었습니다. memcache 세션으로 전환하면이 문제가 해결됩니다. – Ben

    +0

    여러 요청을 차단하는 세션이 있습니까? 그걸 보지 못했어요 :) 당신이 문제를 발견하게 된 것을 기쁘게 생각합니다. ' – laander

    3

    세션 처리는이 사용자 당 세션 인스턴스를 두 개 이상 실행 PHP를 방지 php.ini의

    [Session] 
    ; Handler used to store/retrieve data. 
    ; http://php.net/session.save-handler 
    session.save_handler = files 
    

    에서 PHP

    에 파일에 설정되어 있습니다.

    는 PHP 코드에서 이것을이 실행을 허용하지 않습니다 :

    session_write_close(); 
    

    그냥 알고 세션이 지금 너무 세션에 쓰기 폐쇄하는 것은 더 이상 옵션입니다.