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