PHP - PTHREAD Worker线程不能并发执行


PHP - PTHREAD Worker Threads not executing concurrently

我正在努力改进php中的一个进程,所以我使用多线程使用Worker来管理我的线程。但是worker中的线程一个接一个地执行,而不是并发的。

这是我的示例代码

namespace App'Engine'Threads'ThreadClass;

class StatePaperAttendancePDFThread extends 'Threaded
{
   private $write_folder_name;
   private $center_code;
   private $paper_id;
   private $title;
   public function __construct($write_folder_name, $center_code, $paper_id, $title)
{
    $this->write_folder_name = $write_folder_name;
    $this->center_code = $center_code;
    $this->paper_id = $paper_id;
    $this->title = $title;
}

public function run(){
    echo " Retrieving paper attendance ".$this->center_code." ".$this->paper_id." ".'Thread::getCurrentThreadId()." ".date("H:i:s:u").PHP_EOL;
    $artisan = 'C:/xampp/htdocs/attendance/artisan';
    $cmd = "php $artisan attendancereport:center $this->write_folder_name $this->center_code $this->paper_id $this->title";
    $return = exec($cmd, $output, $return_var);
    echo $return;
 }
}

 foreach ($centers as $i=>$center){
        $center_code = $center->getCenterCode();
        $thread = new StatePaperAttendancePDFThread($folder_name, $center_code, $paper_id, $title);
        $worker->stack($thread);
    }
 $worker->start(PTHREADS_INHERIT_ALL ^ PTHREADS_INHERIT_CLASSES);
 $worker->shutdown();

,但是当我使用打印的时间从CLI监视它时,我可以看到没有一个线程一起启动。它们都以几秒间隔开始

我错过了什么

我能够通过如下所示创建一个自定义线程池执行器来解决我的问题。我愿意接受建议和改进

class ThreadPoolExecutor{
   private $poolSize;
   private $threadPool;
   private $done = false;
   private $workingThreads;
public function __construct($poolSize, array $threadPool)
{
    $this->poolSize = $poolSize;
    $this->threadPool = $threadPool;
}
public function execute()
{
    $this->parametersOk();
    try {
        while (!empty($this->threadPool)) {
            $this->extractThreads();
            foreach ($this->workingThreads as $thread) {
                $thread->start(PTHREADS_INHERIT_ALL ^ PTHREADS_INHERIT_CLASSES);
            }
            foreach ($this->workingThreads as $thread) {
                $thread->join();
            }
        }
        $this->done = true;
    } catch ('Exception $ex) {
        var_dump($ex->getMessage());
    }
}

private function parametersOk()
{
    if (!is_array($this->threadPool))
        throw new 'RuntimeException("threadPool expected to be an array of threads");
    if (count($this->threadPool) <= 0)
        throw new 'RuntimeException("expected at least an element in threadPool");
    foreach ($this->threadPool as $thread) {
        if (!is_subclass_of($thread, 'Thread::class, false)) {
            throw new 'RuntimeException(" an element of threadPool does not extend class ''Thread");
        }
    }
    if ($this->poolSize > count($this->threadPool)) {
        throw new 'RuntimeException("The number of threads set to execute can not be greater than the threadPool");
    }
    return true;
}
private function extractThreads()
{
    $this->workingThreads = [];
    $this->workingThreads = array_slice($this->threadPool, 0, $this->poolSize);
    for ($i = 0; $i < count($this->workingThreads); $i++) {
        array_shift($this->threadPool);
    }
}
public function isDone()
{
    return $this->done;
}

}