Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 代替foreach的并行执行_Php_Multithreading_Performance_Foreach_Php 7 - Fatal编程技术网

Php 代替foreach的并行执行

Php 代替foreach的并行执行,php,multithreading,performance,foreach,php-7,Php,Multithreading,Performance,Foreach,Php 7,我目前使用foreach循环按顺序上传文件。每次上传都会一个接一个地处理 <?php foreach ($files_array as $file) { //each image is processed here and upload one after the other } ?> 但是,处理多个图像而不是一次处理一个图像会更有效,因为用户等待的时间会少很多。我如何在php中一次处理多个文件,而不是使用foreach按顺序处理这些文件?您想一次上载多个图像吗 如果是,则使

我目前使用
foreach
循环按顺序上传文件。每次上传都会一个接一个地处理

<?php
foreach ($files_array as $file) {
//each image is processed here and upload one after the other
}
?> 


但是,处理多个图像而不是一次处理一个图像会更有效,因为用户等待的时间会少很多。我如何在php中一次处理多个文件,而不是使用foreach按顺序处理这些文件?您想一次上载多个图像吗

如果是,则使用“分解”方法上载多个图像

选项1-分叉您的流程: 您需要分叉您的进程,并在几个线程中实现这一点。以下是我的例子:

<?php

declare(ticks = 1);

$filesArray = [
    'file-0',
    'file-1',
    'file-2',
    'file-3',
    'file-4',
    'file-5',
    'file-6',
    'file-7',
    'file-8',
    'file-9',
];

$maxThreads = 3;
$child = 0;

pcntl_signal(SIGCHLD, function ($signo) {
    global $child;
    if ($signo === SIGCLD) {
        while (($pid = pcntl_wait($signo, WNOHANG)) > 0) {
            $signal = pcntl_wexitstatus($signo);
            $child--;
        }
    }
});
foreach ($filesArray as $item) {
    while ($child >= $maxThreads) {
        sleep(1);
    }
    $child++;
    $pid = pcntl_fork();
    if ($pid) {
    } else {
        // Here your stuff.
        sleep(2);
        echo posix_getpid()." - $item \n";
        exit(0);
    }
}
while ($child != 0) {
    sleep(3);
}

将文件与各自的请求并行上传。从用户角度上传文件已经很快了。Nginx负责上传,然后传递到后端(php)。我正在尝试加快后端处理速度。我想你不明白结果。PHP是单线程的,如果你想并行处理,你可以安装pthreads,或者简单的解决方案是发出多个请求,这样每个图像都可以自己处理。这取决于处理需要什么。谢谢你的方法。我还读到了关于作业队列的文章……你怎么看,这样做值得吗case@user2650277是的,使用队列也很好!但您必须决定您需要什么:a)快速处理所有文件并立即回复客户;或者b)回复客户,您将作业放入队列,并将很快处理它。我的答案中还添加了选项2。希望它能帮助您。我需要a)在我的例子中,快速处理是关键。我也看到了beanstalkd-->但我不确定它是否能与PHP7一起工作。我需要弄清楚如何将队列支持添加到我的类中