2013-01-18 89 views
2

有沒有什麼辦法讓PHP等到函數返回之前繼續?讓PHP等到函數完成?

這是我的代碼:

<?php 

    set_time_limit(0); 

    function waitforchange($nof) { 
     $lfilemod=filemtime($nof); 
     while(filemtime($nof) == $lfilemod) { 
      clearstatcache(); 
      usleep(10000); 
     } 
    } 

    waitforchange('./blahblah.txt') 
    sleep(5); 
    echo 'done'; 

?> 

它應該等到blahblah.txt變化,等待之後再過五秒鐘,然後打印出「完成」,但是,它打印出的「完成」五秒鐘後,而不管文件是否真的改變了。

+0

相關螺紋[腓回調](http://stackoverflow.com/questions/48947/how-do-i-implement-a-callback-in-php) –

+2

顯然該文件已經改變。否則,該功能不會退出。 – webbiedave

+0

你有調試過嗎?添加'echo「$ lfilemod \ n」。 filemtime($ nof)。 「\ n」;'while'陳述後。 –

回答

3

PHP是單線程的,這意味着它在繼續前一次執行一條指令。換句話說,PHP自然會等待函數在繼續執行下一條語句之前完成執行。

我試着在我的機器上執行你的代碼,它正確地等待並等待,直到我在完成函數並顯示消息之前修改了文件。

我什至不能在你的代碼中看到任何可能失敗的東西。由於$lfilemod的創建方式與while循環中的檢查方式相同,因此該循環的條件將返回TRUE,並且即使文件出現問題也會執行(filemtime將返回FALSE兩個錯誤,所以條件將顯示(FALSE == FALSE,這顯然是TRUE)。

運行該循環之前,您的PHP腳本是否修改了該文件?如果是,則filemtime返回的初始值可能是腳本最初啓動時的修改時間。當您在循環中運行clearstatcache時,您將在腳本的前面選擇由您的更改引起的新修改時間。

我的建議是:

  • 嘗試設置的$lfilemod值,讓你知道該值是乾淨運行前clearstatcache,那你是比較蘋果對蘋果與在正在檢查什麼循環。

  • 確保文件確實沒有被修改。嘗試在代碼的開始和結尾放置一對調試行,打印出文件的最後修改時間,然後自己比較兩者,以查看PHP是否報告修改時間發生變化。

  • 這應該不用說了,但是您應該確保PHP被配置爲在開發過程中顯示所有錯誤,以便在出現錯誤時立即顯示您的錯誤。確保display_errors設置在php.ini文件打開On(或使用ini_set()如果不能修改該文件本身),並且您的error_reporting()設置爲E_ALL | E_STRICT爲PHP < = 5.3,或E_ALL爲PHP 5.4(E_STRICT是作爲該版本的部分E_ALL)。更好的方法是將錯誤報告設置爲-1,無論PHP版本如何,它都可以有效地打開所有錯誤報告。

嘗試通過這些修改再次運行您的代碼。如果你看到文件真的被修改,那麼你知道你的代碼有效。如果文件不是被修改,那麼您至少應該有一個可以查找的錯誤,或者在這裏問我們。

+0

謝謝!在腳本開始之後但在waitforchange()被調用之前該文件已被修改,所以我將clearstatcache()添加到waitforchange的開頭並且它可以工作!我也php.ini設置設置不正確。這不是問題的原因,但它可能對未來有所幫助。 – Markasoftware

+0

@Markasoftware樂意幫忙! – AgentConundrum

+0

怎麼樣寫文件?我將一個大的CSV文件分成幾個較小的版本,但是我的代碼試圖在創建之前打開較小的文件。文件寫作不適合嗎? – Radmation

0

嘗試將函數調用分配給變量。我認爲它不會等待其他回報。

0

該代碼看起來不錯;在waitforchange行之後保存缺少的分號(;)。我測試了將(;)放在那裏,腳本按照預期行事。也許這是罪魁禍首?儘管我解釋瞭如何讓你的代碼在那裏執行任何錯誤,但我很遺憾。

+0

不能。我在那裏輸入的代碼並沒有從我的真實代碼中複製,而是非常相似。我真正的代碼有分號。 – Markasoftware

+0

如果實際腳本中沒有分號,代碼根本無法運行。 PHP會報告一個分析錯誤,這是一個致命的錯誤,會在開始運行之前中止腳本。 – AgentConundrum