php一一或同时请求

时间:2019-02-15 12:05:49

标签: php http load-balancing

我对php以及请求如何在后台工作有一些疑问。我将在这里列出所有问题,如果您能回答这些问题,我将非常感谢您的帮助。

1)假设我编写了php应用程序并将其上传到服务器。现在有一个我编写的函数,如果用户转到执行该函数的那条路线,就会发生某些事情。问题是:如果一个用户提出了请求,而另一个用户也提出了请求,那么第二个用户是否必须等到解雇用户的请求完成之后? (通过说请求已完成,我的意思是直到我写的函数一直执行到最后)。这是正确的猜测还是执行哪个函数都没有关系。直到请求未完成,第二个请求才开始执行?如果您能给我一些解释,那就太好了。

2)我有我的php应用程序。想象一下,两个人同时发出将数据写入数据库的请求(不是写入,而是更新)。假设我使用了负载平衡器。如果一个用户向balancer1发出请求,而另一个用户向balancer2发出请求,我想做的是,如果第一个用户的呼叫更新了数据库,则第二个用户的请求必须立即停止(不应更新)。场景是我的数据库中有jwt令牌,该令牌用于在第3方工具上进行请求。有效期为1小时。假设已经过去了1个小时。如果一个用户打电话来更新令牌,而第二个用户也打电话来更新令牌,那么将发生第二个用户将更新令牌而第一个用户的令牌无效的情况。不好我希望你能够明白。如果您要问,我会更好地解释。

谢谢。这对我来说真的很重要(两个问题)。

3 个答案:

答案 0 :(得分:1)

PHP将同时处理请求。处理一个请求不会为不同用户锁定另一个请求。但是,如果PHP会话被第一个请求锁定,则PHP可以逐个执行同一用户的请求。当会话关闭时,将继续处理第二个请求。

尝试在第一个浏览器标签上使用sleep(30)运行PHP脚本:

<?
session_start();

sleep(30);

以及另一个浏览器标签上的另一个脚本:

<?
session_start();

echo 'hello';

第2个脚本要等到第一个完成后才能执行。

这很重要,因为您在每个应用程序中都使用会话。

答案 1 :(得分:0)

  1. 如果您有一个由控制器功能提供服务的路由,则对于每个请求,都有一个单独的控制器实例化。例如:用户A和用户B请求相同的路由@,则控制器准备好响应每个请求,而与同时请求多少用户无关。您可以将相似视为任何服务流程的原则。例如,Laravel我们在laravel.com/stackoverflow上运行。因此,每当我们需要PHP处理任何脚本时,php都会使进程成为线程。同样,Laravel为每个请求实例化控制器。
  2. 对于同一用户发送多个请求,仍将像第1点一样进行处理。
  3. 如果要一个一个地处理特定请求,则可以queue个作业。例如,假设您要处理付款。您有5个请求正在发生。因此,控制器将同时处理所有请求,但控制器功能可以调度已排队的作业,并逐个处理这些请求。
  4. 考虑到两个人试图请求具有数据库更新功能的同一条路由,您可以阅读有关乐观锁定和悲观锁定的不错的文章here

答案 2 :(得分:0)

我应该投票决定关闭这一点-范围太广....但是我会尝试一下。

如果请求依赖于一次只能执行一项任务的资源,则它们不能同时“运行”。您很有可能拥有单个CPU内核或单个磁盘-但是,在HTTP请求级别(在没有应用互斥锁的代码的情况下),它们似乎会同时运行-这就是任务就是全部。执行线程通常会延迟等待其他事件发生,这时OS任务计划程序将检查是否还有其他任务在等待运行。您可以自己轻松地对此进行测试:

 <?php

 $started=time();
 sleep(20);
 print "Ran for " . (time() - $started) " seconds";

(尝试在同一时间在不同的浏览器窗口中或在同一窗口的2个iframe中访问此

将此与以下内容进行比较:

 <?php

 $started=time();
 $fh=fopen("/tmp/concurency_test", "w");
 flock($fh, LOCK_EX);
 sleep(20);
 flock($fh, LOCK_UN);
 print "Ran for " . (time() - $started) " seconds";

这也说明了不应该使用平面文件在服务器上存储数据的原因之一。请注意,PHP中的默认会话处理程序在脚本打开会话数据的持续时间内使用基于文件的锁定。

数据库采用各种策略来避免恢复到单个操作队列-最常见的版本控制。但这不能解决您描述的问题:2个客户端永远不应使用相同的会话令牌-这就是为什么会话令牌与设计良好的系统中的凭据分开的原因。