2014-07-27 3 views
1

나는 AJAX가있는 PHP 페이지에 casperJS 스크립트가 있으며, 버튼 클릭으로 트리거되고 이후 60 초마다 실행됩니다.브라우저 창을 닫은 후에도 setTimeout을 사용하여 AJAX를 계속 실행합니다.

브라우저 창을 닫을 수는 있지만 정지 버튼을 누를 때까지 계속 AJAX 요청을 계속 실행하고 싶습니다.

나는이 주제

  1. Will a script continue to run even after closing a page?
  2. How can I make setInterval also work when a tab is inactive in Chrome?

  • Scripting events no longer fire when a user leaves site or closes browser even though app is still active
  • 그들은 PHP ignore_user_abort() 언급하지만, 이들은 주로 자신의 스크립트를 가지고 있다는 사실에 초점에 게시물의 일부를 보았다 실행하는 데 오랜 시간이 걸리며 브라우저 창을 닫아 조기 종료를 막으려 고합니다.

    현재 casperJS 스크립트를 사용하는 PHP 사이트가 설정되는 방식으로 .txt 파일에 대한 로그 업데이트와 오류 발생시 이메일을 수신하므로 스크립트가 있는지 확인할 수 있습니다. 실행 여부.

    AJAX 요청을 시작하고 브라우저 창을 빨리 닫으면 해당 AJAX 요청이 완료되고 .txt 파일에 로그인되지만 후속 setTimeout은 무시됩니다.

    닫힌 창으로 돌아가서 AJAX 반환의 현재 상태를 볼 수 있고 그 시간에 스크립트를 중지 할 수 있기를 원합니다 (마치 한번도 떠나지 않은 것처럼/닫았습니다. 브라우저 창). 이것이 가능한가?

    내 현재 PHP 내 AJAX 요청 코드 :

    <!DOCTYPE html> 
    <html> 
        <head> 
        <link rel="stylesheet" href="style.css" type="text/css" media="screen, projection"/> 
        <script src="jquery-2.1.1.min.js" type="text/javascript"></script> 
        <script type="text/javascript" language="javascript" src="jquery.dropdownPlain.js"></script> 
        <title>CasperJS Automated Testing Unit</title> 
        </head> 
        <center> 
        <body> 
        <div id="mainContent"> 
    <p>Welcome to the CasperJS Automated Testing Unit</p> 
        <button id="button_AJAX">Run CasperJS</button> 
        <button id="button_STOP" onclick="myStopFunction()">Stop CasperJS</button> 
        </div> 
        <br> 
        <div id="loading"></div> 
    <script type="text/javascript"> 
        $('#button_AJAX').click(function executecasperJS() { 
        $('#loading').html('<img src="rays.gif"><br><i>Web harvesting in progress; please wait for test results.</i>'); 
         $.ajax({ 
          type: "GET", 
          dataType: "text", 
          url: "phpwithCasperJS.php", 
         success: function (data) {   
            $('#loading').html(data); 
          } 
         }); 
    timeout = setTimeout(executecasperJS,60000); 
    }); 
        $("#button_AJAX").click(function() {$("#button_AJAX").text("CasperJS Executed");}); 
        $("#button_STOP").click(function() {$("#button_AJAX").text("Run CasperJS");}); 
        function myStopFunction() { 
         clearTimeout(timeout); 
        } 
    </script> 
    </div> 
        <div id="page-wrap"> 
          <ul class="dropdown"> 
          <li><a href="#">CasperJS Logs</a> 
          <ul class="sub_menu"> 
           <li><a href="casperjs_log.txt" target="_blank">Testing Log</a></li> 
           <li><a href="casperjs_error.txt" target="_blank">Error Log</a></li> 
    
         </ul> 
    
        </div> 
    </center> 
        </body> 
    </html> 
    

    그리고 내 casperJS 스크립트 수용하지 않는 PHP : 브라우저가 더 이상 현재 페이지의 컨텍스트에서 실행되면

    <?php 
    date_default_timezone_set('America/Managua'); 
    $date = date('m/d/Y h:i:s a', time()); 
        $time_start = microtime(true); 
        $output = exec("/usr/local/bin/casperjs /path/to/script/casperJScript.js"); 
         if (strpos($output, 'Check for fail message') === FALSE) { 
          require_once('../class.phpmailer.php'); 
        $mail    = new PHPMailer(); 
        $mail->IsSMTP();  
        $mail->SMTPDebug = 1;     
        $mail->SMTPAuth = true;     
        $mail->SMTPSecure = "ssl";     
        $mail->Host  = "smtp.gmail.com";  
        $mail->Port  = 465;     
        $mail->IsHTML(true);  
        $mail->Username = "emailaddress"; 
        $mail->Password = "password";    
        $mail->SetFrom('emailaddress'); 
        $mail->AddReplyTo("emailaddress"); 
        $mail->Subject = "casperJS: Server failure occured on $date"; 
        $mail->Body = "Body"; 
        $mail->AddAddress("emailaddress"); 
          if(!$mail->Send()) { 
          } else { 
          echo '<span style="color:#FF0000">The server has gone 100% failure and an email with the error has been sent.</span>'; 
          $myfile = fopen("../casperjs_error.txt", "a") or die("Unable to open file!"); 
          $txt = "ERROR log: $output on $date" . PHP_EOL ; 
          fwrite($myfile, $txt); 
          fclose($myfile); 
           echo "<br />"; 
           echo "<br />"; 
          } 
         } 
         echo "Test Results: $output"; 
         $time_end = microtime(true); 
         $time = $time_end - $time_start; 
         echo "<br />"; 
         echo "<br />"; 
         echo "Test completed in $time seconds\n on $date"; 
         $myfile = fopen("../casperjs_log.txt", "a") or die("Unable to open file!"); 
         $txt = "Log: $output on $date" . PHP_EOL ; 
         fwrite($myfile, $txt); 
         fclose($myfile); 
        ?> 
    
    +3

    "브라우저 창이 닫힌 후"--- 꺼져있는 시스템에서 JS를 실행하는 것과 같습니다. – zerkms

    +0

    다른 언어로 된 유사한 질문 : http://stackoverflow.com/questions/23573393/how-to-manage-server-side-processes-using-mysql/23577751#23577751 –

    답변

    0

    을, 어떤 실행중인 JavaScript는 해지 될 수 있습니다. 일반적으로 사용자가 중지 버튼을 누르거나 창을 닫았거나 다른 페이지로 이동했기 때문에 이러한 동작이 발생합니다. 예를 들어 스택 오버플로 및 관련 사이트에 투표 할 때 즉시 투표 (위 또는 아래로) 한 다음 제목 표시 줄을 클릭하면 목록에 돌아갑니다. 질문. 서버는 대개 요청을 마치지 만, 질문 목록에 다시 올 때까지는 오류에도 불구하고 투표가 반영 되었기 때문입니다.

    짧은 요청의 경우 서버가 전체 HTTP 페이로드를 수신하는 동안 사용자가 그 사실을 결코 알지 못할 수도 있지만 완료 요청을 실행한다는 점에 유의하십시오. 일반적으로 페이지를 언로드하면 모든 "onload"또는 유사한 이벤트가 시작되고 인터넷 연결이 종료 된 것처럼 기존 AJAX 요청이 자동으로 실패합니다 (예 : WiFi 또는 네트워크 어댑터 끄기). 특히 "onclick", "onkeypress"등과 같이 "setloadout"및 "setInterval"이벤트를 포함하여 "언로드"와 관련된 이벤트가 종료됩니다. 무언가가 발생했음을 알아야만하는 경우 팝업 창을 시도 할 수 있지만 사용자 팝업 설정 또는 팝업 차단기가이 최종 갬윗이 페이지가 언로드된다는 것을 알지 못하게 할 수 있습니다.

    요약하면 클라이언트는 서버에 대한 최종 알림을 거의 존중하지 않으며 서버는 일반적으로 클라이언트의 실종을 알리지 않습니다.서버가 페이지의 최종 사라짐을 "보장"할 수있는 가장 가까운 연결 닫기 이벤트를 서버에 적어도 알릴 수있는 롱 폴링 방법 인 Comet을 사용하면이 효과를 줄일 수 있습니다 . 그러나 Comet에는 서버 측 리소스의 사용량 증가와 인터넷 연결이 끊어지는 것을 포함하여 여러 유형의 이벤트에 대한 민감성을 포함하여 사용자가 알고 자하는 자체 제한이 있습니다 (즉, 검색 할 방법이 없습니다 사용자가 페이지를 닫는 것과 연결이 완전히 끊어지는 것과의 차이는 소켓에서 연결이 끊어지는 것입니다.)

    2

    브라우저 창을 닫은 후 AJAX 요청을 실행할 수 없습니다.

    어떤 경우에도 서버 측 프로세스를 계속하기 위해주기적인 AJAX (HTTP) 요청에 의존하는 이유는 무엇입니까? 그러지 마.

    대신 (클라이언트 측 요청에 대한 응답으로) 서버 측에서 시작되는 장기 실행 프로세스를 구성하십시오. 그런 다음 클라이언트 측에서 HTTP (AJAX 또는 기타) 요청 만하면 서버 측 작업의 "진행률"을 확인할 수 있습니다.

    +0

    안녕하세요, 답장을 보내 주셔서 감사합니다. 그래서 당신은 PHP'GearmanWorker :: setTimeout'을 사용할 것을 제안하고 있습니까? 그렇다면 브라우저 창을 닫으면 어떻게 멈출 수 있습니까? 페이지를 다시 열면 Stop 버튼을 누르면 더 이상 AJAX (HTTP) 요청이 없으므로 도움이되지 않습니다. – gothamgator

    +0

    나는 GearmanWorker 또는 다른 특정 모듈을 제안하지 않고 접근 방법 만 제시한다. 어떤 요청이 어떤 서버 측 프로세스에 속하는지 추적하려면 브라우저 (세션, 인증 또는 localStorage 등)를 추적해야합니다. –

    관련 문제