【问题标题】:Laravel events fired from different HTTP requests sync or async从不同的 HTTP 请求同步或异步触发的 Laravel 事件
【发布时间】:2019-08-04 13:24:02
【问题描述】:

带有使用 Laravel 5.2 的 PHP 应用程序的服务器接收到的两个 HTTP 请求。两者都触发了相同类型的事件。这两个事件都被单个侦听器拦截。

Q1:事件会按照 Listener 接收到的顺序依次处理(同步)还是并发处理?

Q2:有没有办法(或者如果 Q1 的答案是同步,则以另一种方式)在请求之间同步任何功能?我的意思是确保无论同时收到多少个请求,该函数一次只能由一个请求执行

UPD。我要解决的问题:我的应用程序应该在 3d 方服务中进行身份验证。这对于仅建立一个将由应用程序的其他部分使用的会话至关重要。我想在数据库中存储会话的访问令牌。所以这个操作不是原子的: 1.尝试从数据库中获取token。 2.如果token不存在: 2A。验证并接收令牌。 2B。将令牌存储在数据库中。 3.返回令牌

【问题讨论】:

    标签: php laravel concurrency laravel-5.2


    【解决方案1】:

    事件不是串联触发函数的好方法。然而,在 PHP(以及 Javascript)中,事件回调是按照它们的事件被触发的顺序执行的(所以1 -> 2 导致a -> b)。

    您必须详细说明为什么要一次仅通过一个请求执行一项功能。您可能正在寻找一种锁定或事务机制,这是一种 RDBMS/SQL 功能,可防止在记录尚未保存时对其进行编辑。这样,当 2 个请求碰巧同时到达同一个 PHP 函数时,您可以让它们在数据库上等待直到某个事务完成,这样就不会发生读取或写入的重叠。

    有关 Laravel 实现,请参阅 https://laravel.com/docs/5.8/queries#pessimistic-lockinghttps://laravel.com/docs/5.8/database#database-transactions。 MySQL 网站上有更多信息(假设正在使用 InnoDB):

    https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html

    【讨论】:

    • 我不确定 RDBMS 功能是否足够。我更新了一个问题,详细说明了我试图实现的目标。
    • 也许您可以在开始身份验证时设置一个标志,例如$user->update(['authenticating' => true]),然后以某种方式在后续请求中使用该值来检查您是否必须等待它完成。我没有看到一个很好的解决方案,尽管您可以在其中像事务性地发出 http 请求并结合数据库写入。可能与stackoverflow.com/a/28854496/1346367有关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多