在PHP(Laravel)中更改单例邮件是否会影响其他用户请求?

时间:2019-06-19 11:35:23

标签: php laravel singleton swiftmailer mailer

根据本文https://laravel-news.com/allowing-users-to-send-email-with-their-own-smtp-settings-in-laravel

,Laravel 5.3 Mailer类被配置为单例

假设用户在请求中将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/

  

在一个请求中创建的Singleton正是为该请求而存在的。一种   在同一时间在另一个请求中创建的Singleton仍会   是一个完全不同的实例。它会占据它自己的   记忆。这些实例没有相互链接。他们是   完全隔离,因为PHP是无共享架构。您   没有一个唯一的实例,但是在   并行过程。

因此,更改单例功能的邮件服务器会更改其他用户的邮件服务器吗?

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

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

2 个答案:

答案 0 :(得分:0)

在传统的php中,每个请求都是不同的实例。从一个实例到另一个实例(从一个请求到另一个实例)的继承(可变)。

在同一情况下,邮件程序在其生命周期内为单例

答案 1 :(得分:0)

看看最简单的Singleton实现:

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是一个Singleton:

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

这意味着每个Swift_SmtpTransport实例都是您刚刚创建的实例(针对此请求)(这并不意味着您无法更改属性-实例可能具有getter和setter创建后将其调用)。

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

  

在一个请求中创建的Singleton恰好可以满足该请求。

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

有关更多信息,请阅读:Simultaneous Requests to PHP Script-对于每个请求,将派生一个新的独立进程,该进程与其他进程无关。唯一的事情是它们可能会互相阻挡。

Laravel的文档说:

  

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