当多个请求到达服务器时会发生什么

时间:2019-10-10 12:43:29

标签: php operating-system httprequest fpm single-threaded

我不确定这个话题。我将尝试通过示例进行解释。

假设,我在php网络服务器上有一种付款方式。首先,方法检查是否存在未付订单。如果是,则向银行服务器发送请求以从信用卡中收取费用。

现在,客户端向服务器发送了两个连续的请求。当第一个请求等待银行服务器的响应来收取费用时,第二个请求却采用了相同的方法。如果来自相同客户端的请求或来自另一个客户端的第二个请求,Web服务器将如何处理?我认为在相同的客户上,应该将它们整理好,这样才没有问题。但是在不同的客户上?会出现一个错误,该错误会从卡中收取两次费用吗?

此外,在java,go或node.js服务器上会发生什么?该处理程序系统如何在多线程或单线程语言上工作?

不关注付款方式。这只是一个例子。

1 个答案:

答案 0 :(得分:1)

即使同一用户从新选项卡发出请求,Web服务器也会启动新线程。 (通常来说。虽然某些虚拟服务器可以在单个线程中在队列中执行它们,但是通常它们是多线程的,并且不关心用户)。因此,请求是同时执行的。

您有责任注意同步。因此,尽管php是一种单线程语言,但是在编写脚本时,请始终牢记另一个实例,否则您的脚本可以并行运行。

例如,如果脚本正在对文件进行读写操作,则它们应锁定文件。 (请参见flock

执行数据库查询时,必须在事务中完成。 (例如,请参见START TRANSACTION, ROLLBACK, COMMIT,也请参见SELECT ... FOR UPDATE)。

即例如付款可能有点像

  START TRANSACTION; -- starts the transaction
  SELECT needed, data FROM table_with_payments FOR UPDATE; 
  -- any other script selecting these rows will be locked until this one release the transaction
  UPDATE table_with_payments WHERE this = that ... ; -- update 
  COMMIT; -- ends transaction, applying all the changes at once