php中pthread的后台处理

php中pthread的后台处理,php,windows,multithreading,pthreads,Php,Windows,Multithreading,Pthreads,我正在尝试用php实现多线程,用于发送电子邮件。这里的基本思想是将电子邮件作为后台工作发送,这样用户就不必等待任务完成 我有一个服务,用户发送电子邮件和它的工作良好。我使用下面的代码来实现多线程 class ThreadWorkerService extends \Thread { private $_runMethod; private $_vars; private $_autoloderPath; function __construct($vars)

我正在尝试用php实现多线程,用于发送电子邮件。这里的基本思想是将电子邮件作为后台工作发送,这样用户就不必等待任务完成

我有一个服务,用户发送电子邮件和它的工作良好。我使用下面的代码来实现多线程

class ThreadWorkerService extends \Thread {

    private $_runMethod;
    private $_vars;
    private $_autoloderPath;

    function __construct($vars) {
        $this->_vars = $vars;

        $reflector = new \ReflectionClass('Composer\Autoload\ClassLoader');
        $dir = dirname($reflector->getFileName());
        $this->_autoloderPath = $dir . "/../autoload.php";
    }

    public function setRunMethod($method) {
        $this->_runMethod = $method;
    }

    public function run() {
        if (!class_exists('Composer\Autoload\ClassLoader')) {
            if (file_exists($this->_autoloderPath )) {
                require_once( $this->_autoloderPath );
            } else {
                echo "autoloder not found";
            }
        }

        $method = $this->_runMethod;
        $results = $method($this->_vars);
    }

}


$storage = new \Threaded();
$storage['emails'] = $emailArray;
$storage['config'] = $config;

$threadWorker = new ThreadWorkerService($storage);

$threadWorker->setRunMethod(function ($vars) {

    $emailArray = $vars['emails'];
    $config = $vars['config'];

    $emailService = new \MyServices\EmailService($config);
    $emailService->sendAllEmails(true, $emailArray);

    }
});

$threadWorker->start(PTHREADS_INHERIT_CONSTANTS);
这里的问题是,如果我不使用

$threadWorker->join();
这就消除了在这种情况下多线程的全部目的,我想知道的是,即使父进程完成,是否有可能使子线程保持活动状态。我甚至尝试过在没有运气的情况下拆线

我熟悉如何使用消息传递服务,例如,但我希望保持应用程序的独立性

这里的问题是,如果我不使用:
$threadWorker->join(),线程就不会执行,这消除了此场景中多线程的全部用途

很可能是主线程的stdout或其他依赖项在线程开始执行之前被关闭或销毁

摘自PHP手册,用于:

警告:依靠引擎来确定线程何时应该加入可能会导致不良行为;在可能的情况下,程序员应该是明确的

您不需要立即加入,但建议显式加入

以下示例代码说明了该问题:

<?php
class Test extends Thread {
    public function run() {
        sleep(1);

        echo "Thread\n";
    }
}

$test = new Test();
$test->start();
echo "End\n";
?>
但是,如果代码更复杂,例如,处理
线程
的构造函数中设置的依赖项的代码,则这些依赖项在使用时可能已经被销毁

(在最新版本的pthreads中)进行了最后一次尝试隐式地加入
join
,但是您不能依赖于销毁顺序是否符合您的期望,因此显式的
join
更可取


值得注意的是:pthreads(PHP7+)的最新版本禁止在CLI之外的任何地方执行;如果这是在web服务器前端执行的代码,则需要重新考虑您的体系结构

谢谢,您是对的,这个问题是由将线程对象传递给构造函数引起的,但是,无论是否加入,请求都需要相同的执行时间。我想在php中使用线程并不是针对这种情况
End
Thread