2014-02-21 3 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 минут. поэтому я не мог этого достичь.

есть какой-либо процесс или многопоточность или соответствие, чтобы я мог запускать каждый cron1.php каждые 5 секунд задержки. то я установлю 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

Причина, по которой вам приходится использовать слова и фразы, подобные, вероятно, и в значительной степени, потому что вы на самом деле не знаете _know_. Пожалуйста, прочтите документ выше. –

Смежные вопросы