2016-06-06 102 views
1

我有開始每隔一小時,併發送消息的cron作業。如果它每小時啓動一次,它會每天發送24次消息。用戶可以設置不同的量次的cron作業可能會啓動 - 如果他選擇12倍,cron作業將工作每個奇數(或偶數)小時以下模式:發送消息15週一天24小時時間每小時

  • 10101010 ...等

,其中1小時作業工作,0是空閒小時。問題是我不知道如何使程序鍛鍊這樣一種模式自動執行所有其他時間,例如15或17或其他事情。對於這樣的用戶輸入的圖案將是:

  • 110110110 ...等

與破最後小時(這將是像111或100)。我試圖通過24分15,加1,然後將它與小時自上次發送的量(如果1 < 1.5然後不`噸發送,2> 1.5,那麼發送)進行比較,但我最終每次101010圖案。不幸的是,我不能每分鐘運行一次CRON,它只能按小時啓動。謝謝。

+0

*用戶可以設置一個CRON作業可以開始的不同次數* - 允許用戶只選擇某些麻木ERS - 12 6,4,3.2,1。另一些惡作劇 – splash58

+0

的問題是,用戶被允許選擇從1到24(1,2,3,4,5,6 ... 22,23任何整整數,24)。像2.5,3.2364等數字是不允許的 – Jack

+0

這是什麼飛濺是syaing,不允許。做老闆,說不。 – Andreas

回答

2

基於你正在試圖做什麼,更頻繁的cron作業運行,更準確的時間會。如果它必須每小時一次,那麼用戶在17到24之間選擇的任何內容都將每隔一小時執行一次。因此,即使提供所有這些選項也是沒有意義的。如果您必須讓用戶選擇一個數字並在一天中均勻執行,則必須比呃一小時更頻繁地運行cron作業。

這個例子假設你每分鐘運行一次cron作業,即:

*/1 * * * * <your command>

// How many times per day, get from DB 
$userInput = 17; 

$SecondsPerDay = 60 * 60 * 24; 

$Frequency = (int) ($SecondsPerDay/$userInput) -1; 

$midnight = strtotime('today midnight'); 

// Get an array of times to execute 
$executeTimes = array(); 
for($time=$midnight; $time<=($midnight+$SecondsPerDay); $time+=$Frequency) 
    $executeTimes[] = date("g:i a", $time); 

$currentTime = date("g:i a"); 
$execute = in_array($currentTime, $executeTimes); 

if(!$execute) exit; 

// Cron job codes here 

這裏是一個〔實施例:https://3v4l.org/0PCXh

注:我覺得療法是關閉逐一個錯誤,但你應該從這裏獲得要點。

+0

這是一個好主意,但如何做一個$ runTimes字符串僅基於用戶輸入到文本字段的數字自動生成嗎? – Jack

+0

@Jack - 請參閱編輯。祝你好運。 –

+0

做得很好! +1。但正如我在上面的評論中寫到的,當你睡着時獲得新聞更新沒有任何意義。 – Andreas

0

假設你想要的是用戶如何挑選往往1應該出現,它們均勻地間隔開,以使0和1的模式...

你要24個總位數。假設$n是事件之間的小時數。所以,$n=1意味着每1小時。然後,只需使用1每當小時是小時事件之間的數整除...

$pattern = ''; 
for($h=1; $h<=24; $h++) 
    $pattern.= ($h%$n==0) 1 : 0; 

這會給你111111111111111111111111如果$ N = 1(每小時)。它將是0101010101 ...如果$ n = 2。這將是001001001001,如果$ N = 3,等等

+0

但你怎麼做17「1」? – Andreas

+0

@Andreas So $ n是24小時內的次數,而不是事件之間的小時數?這是一個完全不同的問題。 – kainaw

+0

這就是我讀這個問題的方法。 – Andreas