2014-02-21 75 views
3

我有一個cron文件cron/cron1.php。我已經爲cron運行了1分鐘。在PHP中並行/多線程執行文件

因此下一個過程需要1分鐘執行。

現在我想在一分鐘內並行運行這個文件三次。該文件執行時間超過2分鐘。

可以我運行在單個文件中該文件並行這樣

file1.php

<?php 
     include("cron/cron1.php"); // run seperately 
     sleep(5); 
     include("cron/cron1.php"); // run seperately 
     sleep(5); 
     include("cron/cron1.php"); // run seperately 

?> 

在上述文件cron1.php將執行5秒差異,但高於當一個人完成了它的處理。正如我告訴過你的,每個cron1.php需要2分鐘以上才能完成。所以我無法實現它。

是否有任何進程或多線程或接近,使我可以每5秒延遲運行每個cron1.php。那麼我會將file1.php設置爲cron作業。

+0

我發現我的答案@@ returnthis.lau_,但我會很感激任何人有其他類型的過程或接近這樣做。 –

+0

這不是一個使用PHP的解決方案,但[Fat Controller](http://fat-controller.sourceforge.net)將允許您並行運行PHP腳本的實例,處理它們是否/何時失敗,甚至將它們作爲一個守護進程,如果你想。簡單的安裝和照顧所有困難的東西,所以你可以專注於業務邏輯。 – SlappyTheFish

回答

3

你可以做的是在同一時間運行多個進程,像這樣的東西:

exec('php cron/cron1.php > /dev/null 2>&1 &'); 
exec('php cron/cron1.php > /dev/null 2>&1 &'); 
exec('php cron/cron1.php > /dev/null 2>&1 &'); 

每個exec調用將在後臺運行,所以你可以有很多需要。

+0

我可以把這個代碼放在cron文件中嗎 –

+1

PHP確實支持多線程。 –

+0

@SatishSharma,是的,你可以把上面的,例如,在「maincron.php」,然後將此添加到crontab - 「php/path/to/maincron.php」 –

8

PHP不支持多線程

http://php.net/pthreads

這裏是你需要的那種邏輯的多線程例子:

<?php 
define("SECOND", 1000000); 
define("LOG", Mutex::create()); 

/* 
* Log safely to stdout 
* @param string message the format string for log 
* @param ... args  the arguments for sprintf 
* @return void 
*/ 
function slog($message, $args = []) { 
    $args = func_get_args(); 
    if ((count($args) > 0) && 
     ($message = array_shift($args))) { 
     $time = microtime(true); 
     Mutex::lock(LOG); 
     echo vsprintf( 
      "{$time}: {$message}\n", $args); 
     Mutex::unlock(LOG); 
    } 
} 

class MyTask extends Thread { 
    public $id; 
    public $done; 

    public function __construct($id) { 
     $this->id = $id; 
     $this->done = false; 
    } 

    public function run() { 
     slog("%s#%d entered ...", __CLASS__, $this->id); 
     /* don't use sleep in threads */ 
     $this->synchronized(function(){ 
      /* simulate some work */ 
      $this->wait(10 * SECOND); 
     }); 
     slog("%s#%d leaving ...", __CLASS__, $this->id); 
     $this->done = true; 
    } 
} 

$threads = []; 

function get_next_id(&$threads) { 
    foreach ($threads as $id => $thread) { 
     if ($thread->done) { 
      return $id; 
     } 
    } 
    return count($threads); 
} 

do { 
    slog("Main spawning ..."); 
    $id = get_next_id($threads); 
    $threads[$id] = new MyTask($id); 
    $threads[$id]->start(); 
    slog("Main sleeping ..."); 
    usleep(5 * SECOND); 
} while (1); 
?> 

這將產生一個新的線程每5秒鐘,線程需要10秒鐘才能執行。

您應該嘗試找到提高單個任務速度的方法,或許通過共享一些常用的數據集。

+1

隨着「小」的警告,在PHP中幾乎沒有什麼是線程安全的。在他特別的例子中,他可能不能僅僅從多個線程中請求文件,並希望它能夠工作。他將不得不在整個地方添加互斥體來實現這個工作,即使如此,他仍然可能會有一些隨機的,難以調試的競爭條件。 –

+0

https://gist.github.com/krakjoe/6437782 –

+1

你不得不使用單詞和短語的原因可能是,因爲你實際上並不知道。請閱讀上面的文檔。 –