0
$a=new FileProcessing($path1);
$b=new FileProcessing($path2); 
$a->doProcessFile();
$b->doProcessFile();

此代码运行doProcessFile()$a然后按顺序运行doProcessFile()。我想 for 与 for 并行运行,这样我可以在parralel中处理不同的文件。我可以在 PHP 中做到这一点吗?$bdoProcessFile()$adoProcessFile()$b

如我所见,PHP 仅按顺序处理脚本。现在我想知道我是否可以在 parralel 中运行同一脚本的多个实例,运行脚本之间的区别是我在调用每个脚本时传递的参数。例如:php myscript.php [path1]然后我用不同的参数第二次调用这个脚本。

4

3 回答 3

0

您可以使用pcntl_fork,但仅当从命令行而不是作为 Web 服务器运行 PHP 时。

或者,您可以使用gearman

于 2013-07-22T21:09:41.053 回答
0

我自己从未尝试过,但理论上应该是可能的:

  1. 将您的doProcessingFile方法转换为将文件作为输入进行处理的独立 PHP 脚本process_file.php

  2. 将要处理的文件放入专门为此目的创建的文件夹中

  3. 创建一个 shell 脚本paralellizer,该脚本将列出包含要处理的文件的文件夹并发送文件以进行并行处理(请注意,它接受要处理的文件数量作为 arg - 作为下面 oneliner 的一部分,这一位可能会做得更好):

     #!/bin/bash
    
     ls special_folder | xargs -P $1 -n 1 php process_file.php
    
  4. 从 php调用parallelizer并确保 process_file 返回处理结果状态:

     $files_to_process = Array($path1, $path2); 
     exec('parallelizer '.count($files_to_process), $output);
     // check output
     // access processed files  
    

免责声明:只是一个粗略丑陋的想法草图。我确信它可以改进

于 2013-07-22T21:42:33.420 回答
0

制作2个文件

1.处理器.php

<?php
if($arc < 1) user_error('needs a argument');
$a=new FileProcessing($argv[1]);
$a->doProcessFile();

2.调用者.php

<?php
function process($path,$name){
  $a = array();
  $descriptorspec = array(
    1 => array("file", "/tmp/$name-output.txt", "a"),  // stdout is a pipe that the child will write to
    2 => array("file", "/tmp/$name-error.txt", "a") // stderr is a file to write to
  );
  return proc_open(PHP_BINARY.' processor.php '.escapeshellarg($path), $descriptorspec, $a);
}
$proc1 = process($path1,'path1');
$proc2 = process($path2,'path2');
//now wait for them to complete
if(proc_close($proc1))user_error('proc1 returned non 0');
if(proc_close($proc2))user_error('proc2 returned non 0');
echo 'All done!!';

请务必阅读proc_open的文档以获取更多信息,还请注意,您需要在处理器中包含类(以及它需要的任何东西),因为它是一个新的 php 环境

于 2013-07-22T21:44:28.383 回答