2016-11-25 37 views
1

我試圖實現一個「窮人的cron的」運行我的PHP腳本只每10分鐘(如果沒有人訪問它不運行,直到有人做的頁面)如何在PHP中使用「窮人的cron」?

以下是我有:

$current_time = time(); 

if($current_time >= $last_run + (60 * 10)) { 
    echo 'foo'; 
    $last_run = time(); 
} else { 
    echo 'bar'; 
} 

我期望得到的是「富」在屏幕上,當我刷新頁面,我想看到「酒吧」。如果我在10分鐘後刷新頁面,它應該再次「foo」一次,然後「bar」直到再過10分鐘。

目前它一直打印出「foo」。

+1

HTTP請求超時大約是30秒。如果你想定期刷新頁面,可以在客戶端執行(通過javascript或'' –

回答

2

變量在執行完成後不保留它們的值。所有內存在PHP腳本結束時都會被清除,這意味着下次腳本運行時,PHP將不知道$last_run是什麼。您需要以某種方式存儲$last_run,可能使用文件系統或數據庫。

使用的文件系統,你可以這樣做:

$last_run = file_get_contents('lastrun.txt'); 
if (!$last_run || $current_time >= $last_run + (60 * 10)) { 
    echo 'foo'; 
    file_put_contents('lastrun.txt', time()); 
} else { 
    echo 'bar'; 
} 
+2

這樣做的竅門!我必須混合其他語言當我嘗試將值直接存儲到變量中時,長時間未使用PHP需要等待5分鐘,直到我可以接受這個答案爲止謝謝 – user1589375

1

這是不幸的是PHP不是如何工作的。當你訪問Web服務器時,PHP開始一個新的過程,然後死亡。您需要一直運行的腳本,使用類似:

while (true) { 
    // Check if we should do anything, or just keep spinning 
} 

然而,PHP不是爲這些類型的任務,而這個腳本將最有可能的兩種最大的執行時間,內存限制遲早會死或者是其他東西。

功能性的「窮人cronjob」會改爲要求您檢查當前的時間戳,並在繼續之前執行上次訪問後應該執行的操作。這會「僞造」運行cron作業的錯覺。

+1

您確定while(true)將不會超載服務器並返回一個500錯誤代碼? –

+0

@AniketSahrawat你很可能需要某種睡眠或某種東西在這個循環中,它的意思是「這就是你必須這樣做,但它將無法正常工作「。給定正確的php設置,構建一個」while(true)「將會起作用,但腳本會在一段時間後死亡。 – OptimusCrime