在PHP中以并行/多线程方式执行文件

在PHP中以并行/多线程方式执行文件,php,multithreading,cron,Php,Multithreading,Cron,我有一个cron文件cron/cron1.php。我已经为cron设置了1分钟的运行时间 因此,对于下一个进程,将需要1分钟来执行 现在我想在一分钟内并行运行这个文件三次。此文件的执行时间超过2分钟 我可以像这样在单个文件中并行运行此文件吗 file1.php <?php include("cron/cron1.php"); // run seperately sleep(5); include("cron/cron1.php"); // run sep

我有一个cron文件
cron/cron1.php
。我已经为cron设置了1分钟的运行时间

因此,对于下一个进程,将需要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作业。

您可以同时运行多个进程,如下所示:

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
调用都将在后台运行,因此您可以根据需要调用任意多个调用。

PHP确实支持多线程

以下是所需逻辑类型的多线程示例:

<?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);
?>

@SatishSharma,是的,您可以将上述内容放在“maincron.php”中,然后将其添加到crontab-
php/path/to/maincron.php
@returnthis.lau~好的,谢谢,我理解这一点。你能给我解释一下这个命令吗?@N.B.你还有别的方法吗?请提供给我。@returnthis.lau uu非常感谢!!。我尝试了你的答案,它对我来说非常有效。因此+1和接受在许多共享主机上,这可能是唯一的解决方案,也是一个有效的解决方案。我通过@returnthis.lau找到了我的答案,但我会感谢任何人有其他类型的过程或方法来实现这一点。这不是一个使用PHP的解决方案,但它将允许您并行运行PHP脚本实例,如果/当它们失败时进行处理,如果需要,甚至可以将它们作为守护进程运行。安装简单,处理所有困难的事情,这样你就可以专注于业务逻辑了。在他的特定示例中,他可能无法仅要求来自多个线程的文件并希望它能够正常工作。他必须在所有地方添加互斥体才能使其正常工作,即使这样,他可能仍然会有一些随机的、难以调试的竞争条件。你不得不使用诸如“可能”和“几乎”之类的词语和短语的原因是,你实际上并不知道。请阅读上面的文档。是的,我实际上不知道OP提到的cron1.php文件中的代码,但是对于任何非平凡的php代码,我确信它没有启动多个进程那么简单(这就是php的设计目的)。如果pthread模块完全没有任何可能的竞态条件,那么考虑到PHP从来不是为并发编程而设计的。您提到的文章是由模块作者撰写的,他不是讨论这种方法利弊的最中立的人。在提供的示例代码中使用互斥只能使输出可读,也许我应该提到这一点。pthreads是一个高级API,因此所有操作的安全性都是隐式的、受管理的。这里没有足够的空间很好地解释这些事情,如果这读起来不好,我道歉。正如本文所提到的,在PHP扩展的意义上,不是模块不安全,而是底层区域设置库不可重入(它操纵进程全局状态)。这不再是一个常见的问题,大多数库都是可重入的。。当人们对他们不知道、也没有测试过的东西做出假设,并试图以“聪明”的洞察力来回应这个问题时,他们一定会喜欢的。。。。Op:“我需要这个”。。。回答:“不行”。。。Op:“为什么不呢?”。。。回答:“因为它可能不会,我不太理解它来回答为什么是和为什么不是,这很难,所以这是有道理的,这是不可能的。”。。