2013-04-13 30 views
0

,我不得不做一些像「cron作業」,因爲我沒有訪問的cPanel呼叫cron的兩倍或三倍有時

我這個cron作業類的邏輯是,當有人打從網站上的東西,驗證時間並致電課程。

...所以....

這裏是我班的cronjob,並我的問題是,有時它會調用類的兩倍或三倍 ..(也許從兩個或多個當前時間用戶是相同的... ...

<?php 
class cronJob extends Core { 
    public function execute() { 
     include("interfaces/cronJob.php"); 
     $items = $this->query("SELECT `id`, `class`, `interval`, `time` FROM `cron_job`"); 
     while($item = $this->fetch($items)) 
     { 
      if($this->getTime() > $item['time']) { 
       $this->query("UPDATE `cron_job` SET `time` = '".($this->getTime() + $item['interval'])."' WHERE `id` = '".$item['id']."'"); 
       $this->getLog("cronJob: ".$this->getTime()." Class: ".$item['class']); 

       include_once("cron/".$item['class'].".php"); 
       $job = new $item['class']; 
       $job->run(); 
      } 
     } 
    } 
} 
?> 

......然後......這裏是時間的函數(我不認爲這是必要的:P)

public function getTime() { 
    return time() + 305; 
} 

日誌:

2013-04-14 12:59:02 - cronJob: 1365890342 Class: updateFiles 
2013-04-14 12:59:37 - cronJob: 1365890377 Class: updateTrivia 
2013-04-14 01:00:13 - cronJob: 1365890413 Class: updateTrivia 
2013-04-14 01:00:49 - cronJob: 1365890449 Class: updateTrivia 
2013-04-14 01:01:25 - cronJob: 1365890485 Class: updateTrivia 
2013-04-14 01:02:01 - cronJob: 1365890521 Class: updateTrivia 
2013-04-14 01:02:37 - cronJob: 1365890557 Class: updateTrivia 
2013-04-14 01:03:13 - cronJob: 1365890593 Class: updateTrivia 
2013-04-14 01:03:49 - cronJob: 1365890629 Class: updateTrivia 
2013-04-14 01:04:25 - cronJob: 1365890665 Class: updateTrivia 
2013-04-14 **01:05:01** - cronJob: 1365890701 Class: updateTrivia 
2013-04-14 **01:05:01** - cronJob: 1365890701 Class: updateTrivia 

表:

enter image description here

所以......沒有任何人有任何想法解決它?

+1

爲什麼要讀取所有cron作業?您可以限制只讀取應該運行的作業,例如'SELECT ... WHERE time> $ this-> getTime()'。 –

+0

@MarcB我必須提取所有這些數據,然後驗證「if($ this-> getTime()> $ item ['time'])」 –

+0

是這樣嗎?爲什麼數據庫無法做到這一點? $ item ['time']來自數據庫,因此只需在您的選擇查詢中發送$ this-> getTime(),並節省您不必執行的所有作業。例如你開車去商店買東西,然後扔掉你想要的糖果吧裏的一切。 –

回答

0

你可以嘗試:

  • 塊是用數據庫的:例如,LOCK TABLES /啓動交易(小心,選擇對MyISAM引擎不繳費)。
  • 從文件中讀寫。如果文件內容!=「x」,則跳過更新。
0

你需要的是通常被稱爲一個exclusive lock功能。

Another question on SO可能會給你一些啓發,如何在你的情況下實現一個鎖。
請注意,上述APC功能是一個可選的PHP模塊,未附帶大多數標準分發(並且不存在於許多Web主機上)

+0

謝謝,我會閱讀有關它 –