具有使用Laravel 5.2的PHP应用程序的服务器收到的两个HTTP请求。两者都触发了相同类型的事件。这两个事件都由一个侦听器拦截。
问题1:事件是按照监听器(同步)接收事件的顺序一个接一个地处理还是会并行处理?
Q2:是否存在一种方法(或者如果Q1答案是同步的,则以另一种方式进行)在请求之间同步任何功能?我的意思是要确保无论同时收到多少个请求,该功能一次只能由一个请求执行。
UPD。我要解决的问题:我的应用程序应在3d派对服务中进行身份验证。这对于仅建立一个将由应用程序的其他部分使用的会话至关重要。我想在数据库中存储会话的访问令牌。所以这个操作不是原子的: 1.尝试从数据库获取令牌。 2.如果令牌不存在: 2A。验证并接收令牌。 2B。将令牌存储在数据库中。 3.返回令牌
答案 0 :(得分:1)
事件不是连续触发函数的好方法。但是,在PHP(以及Javascript)中,事件回调按触发事件的顺序执行(因此1 -> 2
的结果为a -> b
)。
您将需要详细说明为什么只一次只通过一个请求来执行功能的原因。您可能正在寻找一种锁定或事务处理机制,这是一种RDBMS / SQL功能,可防止在尚未保存记录的情况下对其进行编辑。这样,当两个请求同时到达同一PHP函数时,您可以让它们在数据库上等待,直到某个事务完成为止,这样就不会发生读写重叠。
有关Laravel的实现,请参见https://laravel.com/docs/5.8/queries#pessimistic-locking和https://laravel.com/docs/5.8/database#database-transactions。在MySQL网站上有更多信息(假设正在使用InnoDB):
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html