2014-02-21 33 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

你不得不使用单词和短语的原因可能是,因为你实际上并不知道。请阅读上面的文档。 –