Php 并行执行函数

Php 并行执行函数,php,parallel-processing,Php,Parallel Processing,我有一个函数,需要从一个数组中遍历大约20K行,并对每个行应用一个外部脚本。这是一个缓慢的过程,因为PHP正在等待脚本执行,然后再继续下一行 为了使这个过程更快,我考虑在不同的部分同时运行这个函数。例如,第0行到第2000行作为一个函数,第2001行到第4000行作为另一个函数,依此类推。我怎样才能干净利落地做到这一点?我可以创建不同的cron作业,每个函数有一个不同的参数:myFunction(020000),然后是另一个带有myFunction(20014000)的cron作业,等等。但这看

我有一个函数,需要从一个数组中遍历大约20K行,并对每个行应用一个外部脚本。这是一个缓慢的过程,因为PHP正在等待脚本执行,然后再继续下一行


为了使这个过程更快,我考虑在不同的部分同时运行这个函数。例如,第0行到第2000行作为一个函数,第2001行到第4000行作为另一个函数,依此类推。我怎样才能干净利落地做到这一点?我可以创建不同的cron作业,每个函数有一个不同的参数:
myFunction(020000)
,然后是另一个带有
myFunction(20014000)
的cron作业,等等。但这看起来不太干净。做这件事的好方法是什么?

看看。这允许您生成子进程,然后可以执行所需的单独工作。

< P>如果您想在PHP中执行并行任务,我将考虑使用。另一种方法是使用,但我更喜欢基于任务的实际工作者。

不确定是否有适合您情况的解决方案,但您可以将系统调用的输出重定向到文件,因此PHP不会等到程序完成。尽管这可能会导致服务器过载


-如果使用此功能启动程序,为了使其在后台继续运行,程序的输出必须重定向到文件或其他输出流。否则将导致PHP挂起,直到程序执行结束。

您唯一需要等待的时间是在获取数据和处理数据之间。无论如何,处理数据实际上是完全阻塞的(您只需等待它)。通过将进程数增加到现有的核心数,您可能不会获得任何好处。基本上,我认为这意味着进程的数量很小,所以安排2-8个进程的执行听起来并不可怕。如果您担心在检索数据时无法处理数据,理论上可以从数据库中以小块的形式获取数据,然后在几个进程之间分配处理负载,每个核心一个进程

我认为我更倾向于使用分叉子进程方法来实际运行处理线程。pcntl_fork doc页面上的注释中有一个精彩的演示,展示了一个作业守护进程类的实现

您可以使用“PTHREADS”

非常易于安装,在windows上运行良好

从这里下载->

解压缩zip文件,然后

  • 将文件“php_pthreads.dll”移动到php\ext\目录

  • 将文件“pthreadVC2.dll”移动到php\目录

然后在“php.ini”文件中添加此行:

extension=php_pthreads.dll
保存文件

您刚刚完成:-)

现在让我们看看如何使用它的示例:

class ChildThread extends Thread {
    public $data;

    public function run() {
        /* Do some expensive work */

        $this->data = 'result of expensive work';
    }
}

$thread = new ChildThread();

if ($thread->start()) {     
    /*
     * Do some expensive work, while already doing other
     * work in the child thread.
     */

    // wait until thread is finished
    $thread->join();

    // we can now even access $thread->data
}
有关PTHREADS的更多信息,请阅读以下php文档:

  • 如果您像我一样使用WAMP,那么应该将“pthreadVC2.dll”添加到 \wamp\bin\apache\ApacheX.X.X\bin 还可以编辑“php.ini”文件(相同路径),并添加与前面相同的行

    extension=phppthreads.dll


祝你好运

您需要的是一个简洁的并发API,用于PHP7.2+

$runtime=new\parallel\runtime();
$future=$runtime->run(函数(){
对于($i=0;$i<500;$i++){
回声“*”;
}
返回“容易”;
});
对于($i=0;$i<500;$i++){
“回声”;
}
printf(“\n使用\\parallel\\Runtime为%s\n”,$future->value());
输出

.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*..*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*
Using \parallel\Runtime is easy

我曾经有过类似的情况。我发现在php中分叉是相当痛苦的,所以我在bash中这样做了。为脚本的每个实例传递start和stop参数,并在服务器的后台运行它们。我相信Exec就是你要找的。如果我没有访问php配置(在共享服务器上的Im)的权限,你会建议我怎么做?很遗憾,链接已经死了。
.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*..*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*
Using \parallel\Runtime is easy