2011-01-23 117 views
8

我正在製作一個php站點,並且我希望有一個腳本(當您單擊按鈕時)向我的mysql數據庫添加一些信息(我可以做到這一點一部分是我自己),並在5分鐘後執行腳本。也許這並不難,但很難谷歌這樣的事情,事先感謝。PHP:在第一個腳本運行5分鐘後執行腳本

+1

這段時間流離失所行爲的目的是什麼?添加哪些信息需要這種位移? – Gumbo

+1

我正在製作基於瀏覽器的遊戲,如果有人想要建造需要*分鐘然後完成的建築物,我希望這樣做。 – Nyohosud

+0

該評論對我們瞭解您要實現的目標以及如何幫助您有所幫助。我建議很多已經給出的答案都試圖實現完全不同的東西。 – Spudley

回答

-3

您是否正在尋找?

sleep php.net

+0

'sleep'會阻塞; OP沒有明確提到它,但這聽起來更像是一個非阻塞解決方案的問題。 – miku

+0

不是,我希望它執行另一個腳本。例如。按鈕調用process.php和process.php必須在5分鐘後執行other.php。 – Nyohosud

+0

有點想象力......當然,你不能在網頁的同一個腳本中做到這一點。但你可以調用scriptOfWebBrowser.php到另一個腳本actionAfter5Minutes.php在服務器運行睡眠功能的後臺,所以你不需要任何cron或任何東西,對用戶來說不是問題... – raultm

6

睡眠是一個非常糟糕的主意。客戶端瀏覽器將不得不等待5分鐘才能完成請求!

在我看來,不可能像你想的那樣做。

您應該創建另一個腳本來查詢數據庫並檢查是否有新數據(並且在成功獲取該作業時)。這個腳本應該每隔N分鐘由cron運行一次。

4

您可以在數據庫中實現一個隊列,在其中添加要執行的「命令」,並在執行此命令時存儲。然後有一個每分鐘運行一次的cron作業,並檢查所述隊列以查看是否應該執行某個命令。

5

非常艱難的一個。 我會去這樣的事情:

  1. 你原來的腳本將記錄添加到數據庫中,包含其執行的時間,
  2. 另一個腳本包含需要在以後採取5分鐘,動作 - 但只有在上面提到的數據庫記錄包含至少5分鐘前的時間戳時纔會啓動它(希望這足夠清楚,我有這種麻煩)
  3. 設置crontab每X分鐘(也許是2)執行第二個腳本。

它不會是5分鐘確切地說,而是介於5和7之間(如果您選擇每2分鐘啓動腳本)。會這樣嗎?

+0

這看起來像個好主意,但是如何計算1條記錄的時間是5分鐘前? – Nyohosud

+0

在第一個腳本中,將'executiontime = NOW()'放入數據庫中。第二,你檢查執行時間 mingos

0

恕我直言,最好的辦法是:在按鈕上單擊將作業保存在數據庫中運行的時間。寫一個小守護進程,每10/5/2秒獲取一個應該執行的新作業並執行它們。

編輯:順便說一句,使用cron檢查新作業執行,更好,但只有當你有一個小網站,你不需要做負載平衡的工作。

0

我會這樣做的方式是在兩個腳本之間運行一個cron作業。

  1. 第一個腳本在數據庫表中設置一個值。
  2. cron作業執行第二個腳本。每一分鐘或什麼不是。
  3. 第二個腳本檢查由腳本1設置的數據庫值以決定是否完全運行。
0

你可以在執行第二個腳本之前分叉進程並在子分叉中執行5分鐘的睡眠。我已經測試過這一點,看起來子進程仍然會在父進程結束後執行。類似於

//initial code 
$pid = pcntl_fork(); //fork the process 
if ($pid==0) // if in the child 
{ 
    exec("sleep 300; php second_process.php"); //sleep for 5 minutes and execute second script 
    return; // or exit 
} 
// rest of initial script... 

「return;」是非常重要的,因爲腳本的其餘部分將會執行第二次(即在小孩中),除非它在那裏。

0

我會建議在Javascript中做計時器而不是PHP。

在用戶的$ _SESSION中放入一個時間戳,以指示它們何時開始事件,然後在5分鐘後讓Javascript回調瀏覽器。

PHP仍然需要知道開始時間(以防止用戶通過調整Javascript超時來攻擊遊戲),但它不需要實際執行任何倒計時或睡眠或類似的事情這本身。

3

如果你在UNIX系統中:

exec("echo 'php script.php' | at now +5 minutes"); 

這將安排php script.php命令5分鐘後才能運行。

+0

儘管如此,這對於很多用戶來說卻相當笨拙。 – ceejayoz

1

我正在製作基於瀏覽器的遊戲,如果有人想要建造需要*分鐘然後完成的建築物,我希望它。

考慮到這是您的實際目標,我建議您只保存原始建築物的時間戳。

我知道你用PHP標記了你的問題,但我不想包含在PHP中處理mysql查詢的所有開銷,特別是因爲我不知道你更喜歡執行查詢或者什麼框架,重新起訴,所以這裏的一些僞代碼來處理這個 「建設大廈」 任務:

build.php

building_type_id = sanitize(POST['id']) 
user_id = current_user['id'] 

query('INSERT INTO buildings (user_id, building_type_id, created_at) 
     VALUES (' + user_id + ', ' + building_type_id + ', CURRENT_TIME)'); 

my_buildings.php

user_id = current_user['id'] 

completed_buildings = query('SELECT * FROM buildings b 
    LEFT OUTER JOIN building_types t ON b.building_type_id = t.id 
    WHERE DATE_ADD(b.created_at, INTERVAL t.construction_time SECOND) < NOW();') 
under_construction = query('SELECT * FROM buildings b 
    LEFT OUTER JOIN building_types t ON b.building_type_id = t.id 
    WHERE DATE_ADD(b.created_at, INTERVAL t.construction_time SECOND) > NOW();') 

希望這有助於!

+0

這是一段很棒的代碼,正是我想要達到的!下一次我會在第一篇文章中添加我想實現的內容。謝謝! – Nyohosud

+0

如果您喜歡,請隨時投票並/或點擊答案左側的複選標記,以便將來的其他人可以更輕鬆地找到答案! –