2017-10-10 36 views
0

下面是我的控制器。爲什麼我訪問/test後,即使關閉瀏覽器,控制器仍然繼續運行?這是正常的行爲嗎?我沒有使用像ignore_user_abort這樣的配置?爲什麼在用戶關閉瀏覽器後symfony控制器會繼續執行?

爲什麼該控制器持續輸出日誌即使我閉上我的瀏覽器?

/** 
    * @Route("/test") 
    */ 
    public function testAction() { 

     $logger = $this->get('exception.logger'); 

     for ($i = 0; $i < 100; $i++) { 
      $logger->info("[{$i}] ------------------------------- "); 

      sleep(1); 
     } 

     $response = new StreamedResponse(function() use($logger) { 

      for ($i = 0; $i < 100; $i++) { 
       $logger->info("[{$i}] ******************************************* "); 

       sleep(1); 
      } 
     }); 


     $filename = "test.csv"; 

     $response->headers->set('Content-Type', 'application/force-download'); 
     $response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"'); 

     return $response; 
    } 
+1

即使您關閉了瀏覽器(客戶端)服務器繼續執行請求,它也是服務器端代碼 – CodeIsLife

+0

PHP將不會檢測到用戶已中止連接,直到嘗試被做成向客戶發送信息。簡單地使用echo語句並不能保證發送信息,參見flush()。 – CodeIsLife

回答

1

PHP代碼是服務器端。無論您是否關閉瀏覽器,Web服務器日誌記錄都將繼續在服務器上進行。這是正常的行爲。請參閱此計算器問題以獲得更好的解釋:Can closing the browser terminate the PHP script on the server?

+0

那麼ignore_user_abort有什麼用? – PMoubed

+1

如果您的php腳本嘗試輸出某些內容(瀏覽器),它會注意到不再有連接。 'ignore_user_abort'會告訴PHP腳本繼續運行無論如何(這通常會停止,一旦它注意到您已經關閉了瀏覽器,但它不會注意到,直到它嘗試一些類型的輸出發送到瀏覽器)。 – turtlechief

+0

如何在示例控制器中檢測它是否被斷開? – PMoubed

相關問題