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

在PHP(Laravel)中更改单例邮件程序是否会影响其他用户请求?,php,laravel,singleton,swiftmailer,mailer,Php,Laravel,Singleton,Swiftmailer,Mailer,根据本文,Laravel5.3Mailer类被配置为单例 让我们假设requests中的一个用户将Mail::setSwiftMailer设置为另一台服务器,以便通过其mailserver/帐户发送邮件 $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl'); $transport->setUsername('your_gmail_username'); $transport->setPa

根据本文,Laravel5.3Mailer类被配置为单例

让我们假设requests中的一个用户将Mail::setSwiftMailer设置为另一台服务器,以便通过其mailserver/帐户发送邮件

$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

在一个请求中创建的单例正好适用于该请求。A. 在同一时间完成的另一个请求中创建的Singleton仍将 这是一个完全不同的例子。它会占据自己的地盘 记忆。这些实例之间没有链接。他们是 完全隔离,因为PHP是一个不共享的体系结构。你 没有一个唯一的实例,但在中有许多类似的实例 并行进程

那么,更改singleton函数的mailserver是否会更改其他用户的mailserver

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

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

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


在同一个实例中,mailer在其生命周期内是一个单实例

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


在同一个实例中,mailer在其生命周期内是一个单例实现

看看最简单的单例实现:

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)

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

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

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

有关更多信息,请阅读:-对于每个请求,将分叉一个新的独立进程,这和其他进程无关。唯一的问题是他们可能会互相阻碍

Laravel的文件说:

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


看看最简单的单例实现:

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)

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

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

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

有关更多信息,请阅读:-对于每个请求,将分叉一个新的独立进程,这和其他进程无关。唯一的问题是他们可能会互相阻碍

Laravel的文件说:

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


似乎您已经找到了答案…在一个请求中创建的一个单例正好适用于该请求。一个独生子女的诞生……好吧,我只需要确定一下,因为这将是一个大问题。实际上,我并不真正理解PHP中的单例概念。在这里,您可以找到一个很好的示例和用例。可能的副本似乎您已经找到了您的答案…在一个请求中创建的一个单例正好适用于该请求。一个独生子女的诞生……好吧,我只需要确定一下,因为这将是一个大问题。实际上,我并不真正理解PHP中的单例概念。在这里,您可以找到一个很好的示例和用例。你所说的传统php到底是什么意思?PHP在总体上是什么?或者是否存在行为可能不同的配置?您可以通过命令启动一个不会死掉(继续侦听)的PHP进程。例如,为websocket端口提供服务。这不是传统的,但可行。你所说的传统php到底是什么意思?PHP在总体上是什么?或者是否存在行为可能不同的配置?您可以通过命令启动一个不会死掉(继续侦听)的PHP进程。例如,为websocket端口提供服务。这不是常规的,但可行。感谢您对配置更改的澄清。我对这一部分非常不确定。唯一的例外是,如果配置在多个独立实例之间共享(例如,如果它是服务器上的文件,由fopen/fclose读取,或者是数据库)。但是laravel动态配置应该存在于它自己的解释器进程中。@Jo42还阅读了以下内容:-配置(正如我们发现的)不会持久化,但如果您想持久化,则使用数据库或环境变量)。感谢您对配置更改的澄清。我对这一部分非常不确定。唯一的例外是,如果配置是跨多个独立实例共享的(例如,如果它是服务器上由fopen/fco读取的文件)