2012-12-21 82 views
0

我運行一個需要大約20分鐘才能完成的過程,我只是想知道PHP是否可以保持連接處於活動狀態,直到過程結束。Php長查詢執行

要清楚,這個頁面會有一個按鈕,當你按下它時會調用一個php頁面來運行一個sql查詢,在主頁面我只等待Http請求完成發送成功消息。

+5

爲什麼你不試試它。不應該超過20分鐘;) –

+1

爲什麼背景操作如此沉重? – veritas

+1

@byoigres你可以爲任何給定的腳本設置一個新的'max_execution_time'。但是你的首要任務應該是問*爲什麼這個查詢需要這麼長時間*? – Sampson

回答

3

對於設置爲需要一段時間的查詢,您應該將一些自動化請求移動到組合中,如果您有權訪問Linux服務器,則最好使用cronjobs。

使用cronjobs,您可以在數據庫中爲與用戶關聯的特定值創建輸入。 cronjob會讓我們說,如果一個掛起的查詢已經完成,每5分鐘執行一次查詢。這將最大限度地減少用戶需要坐在頁面上直到完成的事實。因爲你應該知道,第二個用戶離開活動頁面;所有活動連接,查詢等都將停止。

一旦腳本完成後,在最後發送自定義消息發送給用戶,讓他們知道他們的過程已完成。

你也應該知道,PHP從第1行到最後都遵循腳本,所以,如果你的掛在線40上,該腳本將坐在那條線上,直到查詢完成,然後進行處理。

編輯:這只是爲了舉例說明你的方向,我正在接受,不應該如你所見。這僅僅是一個標記示例

<?php 
    if (isset($_POST['ButtonToExecute'])) 
    { 
     // Query to update a table in your database which an external PHP script will work with 
     // Example Table Structure: 
     /* 
      Username 
      State 

     */ 
     if ($state == 0) 
     { 
      // Then update state to 1 with username to the username for the query to take place on 

     } 
     else 
     { 
      // Warn user that their process will take longer to complete as their already is an active query in process 
      // but add them to a secondry pipeline which will be picked up on the next cronjob interval 
     } 
    } 
?> 

在您的cronjob,可能有:

<?php 

if ($state=='1') 
{ 
    // Execute your script 
    // After query execution update state to 2 

    // if state == 2 then insert custom message/email to send 
} 

?> 

編輯你的crontab:

yourpreferrededitor /etc/crontab 

^如果yourpreferrededitor意味着你的文本編輯器,無論是納米或其他。

和您的cronjob行:

* * * * * root /usr/bin/php /var/www/cron.php 

^這是從當前的cronjob我已經持續運行組,每一天的每一分鐘拍攝

一個cronjob會給用戶導航的能力遠離頁面,因爲正如我上面提到的,第二個用戶從腳本導航離開..所有正在進行的進程停止。 cronjob將繼續運行,不需要任何用戶交互(除了他們提出初始請求)

+0

好點。但許多客戶想要在他們選擇的時候觸發這項工作。所以我們通常必須以允許以cronjob或根據用戶請求運行querry的方式來實現。如果他們只使用命令行,Live將成爲easyer;) –

+0

用戶請求可以通過按下按鈕來完成,然後用它的名字鎖定下一個cronjob;我正在研究一個標記腳本。僅用於舉例目的;並應作爲參考而不用於生產 –

+0

@OliverA。你能瀏覽我的編輯,並告訴我是否應該有更深入的例子嗎?或者讓jist(我明白你不是OP,但其他評論會對OP有利) –

0

在你的PHP INI您可以設置腳本最大執行時間,但你永遠不希望有一個用戶坐在頁面加載屏幕上很長時間。

我可以建議的一件事是將你的最大執行時間增加到大約30分鐘左右,然後在頁面已經被渲染後在javascript中調用它,這樣用戶不會被留在黑暗中不知道劇本正在做什麼。

1

如果您設置超時限制並忽略用戶中止,則可以在普通的php腳本中完成,但這是一個壞主意,因爲如果腳本正常工作,用戶將沒有任何反饋。

在我公司在我們的工作有我們做什麼 同樣的問題:

  1. 運行在一個單獨的腳本查詢。
  2. 啓動腳本,而不必等待結果
  3. 將查詢分爲多個部分(使用限制和偏移量)
  4. 有查詢腳本寫郵件到一個臨時文件
  5. 實現一個狀態屏幕獲取從當前狀態通過AJAX

BTW所有聰明的人問,爲什麼需要這麼長的一個例子日誌:

使用transitive hull可以加速你的應用程序有很多如果你必須處理一個擁有數百萬節點的樹,但構建它可能需要幾個小時。