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一起工作。我需要弄清楚如何将队列支持添加到我的类中