2012-01-23 37 views
1

我正試圖創建一個使用php發送應用程序的簡單通訊。我想知道是否可以在PHP中創建一個腳本,即使瀏覽器已關閉,腳本也可以繼續運行。我怎樣才能在PHP中創建循環並跟蹤其完整性

我已經寫代碼

<?php 
     include "db.php"; 
     $newsletterid=$_GET['id']; 
     $t="select * from tbl_newsletters where newsletterid='".$newsletterid."'"; 
     $q=mysql_query($t); 
     $r=mysql_fetch_array($q); 
     $Subject=$r['subject']; 
     $Message=$r['message']; 
     $headers = 'MIME-Version: 1.0' . "\r\n"; 
     $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
     $headers .= 'To: '.$_SESSION['login_name'].'<'.$email.'>' . "\r\n"; 
     $headers .= 'From: My Newsletter Manager <[email protected]>' . "\r\n"; 

     $t="select email from tbl_subscribers where status='SUBSCRIBED'"; 
     $q=mysql_query($t); 
     while($r=mysql_fetch_array($q)) 
     { 
      $addresses[]=$r['email']; 
     } 
     foreach($addresses as $address) 
     { 
      mail($address,$Subject,$Message,$headers) or die("Cannot Send Email"); 
      $t="insert into tbl_activities set 
       username='".$_SESSION['login_name']."', 
       activity='Sent News Letter [$Subject] to $address', 
       date='".date("Y-m-d H:i:s")."', 
       status='SUCCESS'     
       "; 
      mysql_query($t) or die("Error Saving to Database"); 
     } 

?> 

我有點相信這個腳本的時候,發送簡訊給所有用戶,但如果通訊運營商關閉瀏覽器會發生什麼作品。這個腳本會在foreach循環完成之前不斷髮送新聞稿嗎?

即使此腳本正常工作,我願意爲每個發送的郵件顯示一個進度條,操作員可以隨時查看他/她希望的任何時間。

同時我希望我可以防止操作員重新發送通訊,直到前一個完成?

我不是專家,沒有OOP和Class實例的高級知識嗎?

回答

0

PHP解釋器對腳本施加時間限制,並且會終止運行時間過長的腳本。我認爲默認的時間限制是30秒,儘管它可以在服務器的配置中進行更改。

據我所知,PHP腳本只響應來自客戶端(例如瀏覽器)的請求而運行,而腳本的目的只是響應該特定請求。您不能進行後臺處理,不受任何請求的限制。

1

您應該閱讀PHP's Connection Handling。本文檔的這一部分討論了關於ignore_user_abort()的一個函數,該函數告訴PHP解釋器在瀏覽器斷開與PHP腳本的連接後繼續執行。它還會告訴您關於set_time_limit()的一個函數,用於設置腳本的超時持續時間。

例如,您可能希望這樣的代碼添加到您的腳本:當你的代碼運行在使用瀏覽器在連接之外

set_time_limit(0); // 0 means never timeout 
ignore_user_abort(true); // continue running when browser closes 

,例如錯誤處理,內存管理和事件問題日誌記錄成爲更重要。知道您的代碼在瀏覽器離開後運行很久,是否成功以及它實際做了什麼會很有幫助。

而不是在瀏覽器連接斷開後運行PHP代碼,另一個需要考慮的選擇是將長時間運行的代碼編寫爲服務器端進程,並讓PHP腳本僅調用此服務器進程。這意味着錯誤處理,內存管理和事件日誌記錄的所有問題都可以在服務器端應用程序編程環境中進行處理,如Java,它可能比PHP具有更好的功能。

+0

如何使用php創建服務器端進程?你能建議我學習任何鏈接或有一個簡單的代碼片段嗎? – Prajwal

+0

PHP代碼確實在服務器上運行,所以在用戶中止後運行的PHP腳本是「服務器端進程」。我的建議是,你用不同的語言和環境編寫長期運行的代碼,更適合這項工作。使用哪些語言和框架是一個很大的問題,超出了你的問題範圍。 –

1

腳本在用戶關閉客戶端時的功能取決於您如何處理PHP的connection handling。您可以中止腳本,也可以繼續。

如果您決定中止腳本,您可以實現一個功能,可以保存通訊發送到的最後一個電子郵件地址。或者,您可以在循環內寫入日誌文件,如果腳本中止,您將知道所有已通知的電子郵件。

0

我寫了一個簡單的測試代碼:

<?php 

set_time_limit(0); //set time limit = unlimited 

ini_set('memory_limit','900M'); //memory max 900MB 


for($i=0;$i<=30000;$i++) 
{ 
    file_put_contents('temp/'.$i.'.txt','Some data...'); 
} 

?> 

後在瀏覽器中打開,然後我再關閉瀏覽器,PHP仍在處理我的教訓,成功編寫所有TXT文件(0-30000)。也許你可以使用mail()函數創建你自己的測試。希望這個簡單的測試給你更多的想法。

也許你想看看PHP連接狀態如何維護:PHP Connection handling

+1

我會嘗試這個代碼,並會寫更多關於我得到的輸出 – Prajwal

+0

我嘗試了與您提供的相同的代碼,它的工作,但有另一個問題,直到此過程完成後,服務器沒有響應其他請求。 – Prajwal

+0

您可以在運行此過程時檢查服務器資源嗎? –