2012-04-27 57 views
0

我試圖創建一個腳本來創建唯一代碼並將它們寫入文本文件。 我已經設法生成代碼,並將它們寫入文件。PHP重置變量

現在我的問題是,我的循環保持運行,導致超過92 000個代碼被寫入文件,在服務器超時之前。

我已經做了一些日誌記錄,似乎一切正常,只是在一定的時間後,我的所有變量都重置,一切從頭開始。發生這種情況的時間間隔因時而異。

我已經在腳本的頂部設置了ini_set('memory_limit', '200M'); ini_set('max_execution_time',0);。也許有一個我失蹤的PHP超時設置?

腳本是控制器中的函數。我在這個函數的開頭設置了ini_set。這是循環我經歷:

public function generateAction() { 
    ini_set('memory_limit', '200M'); 
    ini_set('max_execution_time',0); 

    $codeArray = array(); 
    $numberOfCodes = 78000; 
    $codeLength = 8; 

    $totaalAantal = 0; 

    $file = fopen("codes.txt","a+"); 

    while(count($codeArray)<$numberOfCodes){ 
     $code = self::newCode($codeLength); 
     if(!in_array($code,$codeArray)) 
     { 
      $totaalAantal++; 
      $codeArray[] = $code; 
      fwrite($file,'total: '.$totaalAantal."\r\n"); 
     } 
    } 
    fclose($file); 
} 

在該文件中,這將讓這樣的事情:

total: 1 
total: 2 
total: ... 
total: 41999 
total: 42000 
total: 1 
total: 2 
total: ... 
total: 41999 
total: 42000 

感謝。

編輯:到目前爲止,我們已經確定generateAction()在腳本結束之前被調用了2次或3次,而它只應該被調用一次。

+0

請問您可以發佈更多的代碼。關於你如何設置它,是在一個實際的循環?或者你只是給腳本一個時間限制。 – 2012-04-27 13:19:05

+0

要禁用時間限制,請使用'set_time_limit(0);' – ThiefMaster 2012-04-27 13:38:08

+0

@ThiefMaster這沒有什麼區別。 – 2012-04-27 13:43:06

回答

1

我已經找到了解決這個問題的方法。 主機的腳本限制設置爲90秒,並且由於此腳本必須運行更長時間,所以我必須通過命令行運行它。

0

考慮到uniqid()的測試,我們可以說變量沒有被重置,但是方法generateAction()被多次調用。

由於您的代碼可能是同步的,我們可能會說因爲多次調用主腳本而多次調用generateAction()。

詳細情況如何?

由於算法的本質,循環中的每個遍都比前一個更慢。所以執行generateAction()的持續時間可能會很長。

您可能不會等待結束,並且您停止該進程,甚至從新頁面開始該進程。儘管如此,這個過程並沒有真正停止,並且一直在後端運行。我在本地的WAMP/LAMP安裝中觀察到了這樣的行爲:即使停止頁面,如果關閉頁面,即使關閉導航器或重新啓動Apache,腳本也不會實際停止。

因此碰巧你在codes.txt文件中同時寫入了幾個腳本進程。

爲了避免這種情況,您可以使用函數flock()在循環中鎖定文件。

+0

你絕對對 !它不止一次被調用。我在generateAction()的第一行添加了'fwrite($ file,'generateAction called!'。「\ r \ n」);並且它不止一次被寫入文件。但鎖定它並沒有幫助。什麼會導致這種情況?這是一個只在打開頁面時被調用的控制器,因爲某些PHP設置,頁面是否會自動刷新? – 2012-04-27 14:54:38

+0

它可能有很多解釋。例如,你的代碼是同步的,還是你有一些代碼在某個定時器上觸發?它也可能是一些不情願的過程,當你認爲它不會停止時。它也可以是一些JavaScript重新加載頁面,或在後端加載一些Ajax調用。你可以避免使用Javascript來檢查這種可能性。它也可以是HTTP刷新。這可以檢查HTTP標頭(例如,使用Firefox插件「Live HTTP Headers」)。 – Skrol29 2012-04-27 21:36:55

+0

我已經找到了解決這個問題的方法。主機的腳本限制被設置爲90秒,並且由於該腳本必須運行更長時間,所以我必須通過命令行運行它。 – 2012-04-30 09:54:07