在 PHP 中更改单例邮件程序 (Laravel) 会影响其他用户的请求吗?



根据本文将Laravel 5.3 Mailer类配置为单例 https://laravel-news.com/allowing-users-to-send-email-with-their-own-smtp-settings-in-laravel

假设一个用户在请求中将 Mail::setSwiftMailer 设置为不同的服务器,以便通过他的邮件服务器/帐户发送邮件。

$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl');
$transport->setUsername('your_gmail_username');
$transport->setPassword('your_gmail_password');
$gmail = new Swift_Mailer($transport);
// Set the mailer as gmail
Mail::setSwiftMailer($gmail);

这会影响其他用户吗?据我了解,通常的单例特征不适用于 PHP http://blog.gordon-oheim.biz/2011-01-17-Why-Singletons-have-no-use-in-PHP/

在一个请求中创建的单一实例正好适用于该请求。一个 在另一个同时完成的请求中创建的单例仍将 是一个完全不同的实例。它会占据它自己的 记忆。这些实例彼此不链接。他们是 完全隔离,因为PHP是一个无共享的架构。你 没有一个唯一的实例,而是有许多类似的实例 并行进程。

那么更改单例功能的邮件服务器会更改其他用户的邮件服务器吗?

更改 Laravel 配置会影响其他用户吗?我认为至少在这里答案是肯定的。

Config::set('mail', ['driver' => $mail->driver, 'host' => $mail->host, 'port' => $mail->port, ...]);

看看最简单的单例实现:

class Singleton {
protected static $_instance = null;
public static function newInstance()
{
if (null === self::$_instance)
{
self::$_instance = new self;
}
return self::$_instance;
}
// disallowed
protected function __clone() {}
// disallowed
protected function __construct() {}
}

它确保此请求中仅存在此请求中的一个实例

所以你的Swift_SmtpTransport是单例:

$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl');

这意味着Swift_SmtpTransport 的每个实例都是您刚刚创建的实例(对于此请求)(这并不意味着您不能更改属性 - 也许该实例在创建后具有要调用的 getter 和 setter)。

现在让我们看看你已经发现了什么:

在一个请求中创建的单一实例正好适用于该请求。

因此,它是每个请求,并且该请求也不会影响其他请求。所以不,我认为其他用户不会受到影响。即使您根据单个请求更改配置,也不会

有关更多信息,请阅读:对 PHP 脚本的同时请求 - 对于每个请求,一个新的独立进程被分叉,与其他进程没有任何关系。唯一的问题是他们可能会互相阻止。

拉拉维尔的文件说:

在运行时设置的配置值仅为 当前请求,并且不会结转到后续请求。

在传统的php中,每个请求都是一个不同的实例。 从一个实例到另一个实例(从一个请求到另一个请求)继承(变量明智)中没有任何内容。

在同一实例中,邮件程序在其生命周期内是单例

相关内容

最新更新