我有一个简单的小脚本打印当前时间,睡眠十秒钟,并再次打印当前时间:
<?php
echo "<html><head><title>title</title></head><body>";
echo "<p>Pre-sleep: " . date("H:i:s") . "</p>";
sleep(10);
echo "<p>Post-sleep: " . date("H:i:s") . "</p>";
echo "</body></html>";
?>
我实际上在两个不同的页面中有完全相同的代码(比如说“blah1.php”和“blah2.php”)。如果我使用两个不同的浏览器同时点击这两个不同的页面(基本上),这两个页面似乎同时运行:
blah1.php输出:
睡前:11:15:26
睡眠后:11:15:36
blah2.php输出:
睡前:11:15:27
睡眠后:11:15:37
但是,如果我改为使用两个不同的浏览器来,那么就可以了 相同的脚本副本,就好像第二个实例在第一个完成之前甚至没有开始执行:
blah1.php实例1输出
睡前:11:09:07
睡眠后:11:09:17
blah1.php实例2输出
睡前:11:09:17
睡眠后:11:09:27
所以看起来像PHP - 或者至少我的特定PHP以其当前配置的方式配置 - 将排队对任何特定脚本的请求,尽管能够同时为单独的脚本提供请求?我误解了吗?
这是预期的吗?这是一般事吗?或者它可能与sleep()
函数,或者实际运行PHP脚本的特定服务器(在我的情况下是Apache),操作系统或类似的东西有关?
我是否可以依赖此行为(对特定页面的请求排队并且从不同时执行)?另一方面,我可以阻止这种行为吗?
提前致谢。
更新:我现在认为这个问题与PHP,Apache或服务器端的任何事情无关。
我突然意识到,当我说“两种不同的浏览器”时,实际上这是不准确的:我实际上已经从Firefox的两个不同的 windows (在同一台计算机上)发出了请求。所以,我尝试使用一个Firefox和一个IE,并且两个都在服务器端同时运行。
然后我又尝试了两个不同的Firefox浏览器,并观看了一个网络嗅探器。在第一个窗口的响应完成之前,第二个窗口甚至没有发送GET请求。
所以看起来这种行为是在Firefox上:至少在某些情况下,如果你试图从Firefox发出两个请求到同一个URL,Firefox会排队,而不是同时处理它们。
答案 0 :(得分:1)
您可以执行任意数量的PHP脚本实例。 当您通过浏览器访问脚本时,您将通过Web服务器访问它。当您通过Web服务器访问脚本时,所发生的一切是服务器执行脚本的1个实例。
从上面看,您似乎已将Web服务器设置为对具有上述副作用的传入请求进行排队。
答案 1 :(得分:0)
如果您需要访问相同的PHP实例,则需要使用线程:example
...但可能对于测试MySQL的GET_LOCK来说太复杂了。
另一方面,可能是你的结果是因为第一次调用阻止了锁名称。
GET_LOCK(STR,超时)
尝试使用超时秒的超时来获取具有字符串str给出的名称的锁。负超时值表示无限超时。锁是独家的。由一个会话持有,其他会话无法获得同名的锁。
如果成功获得锁定,则返回1;如果尝试超时则返回0(例如,,因为另一个客户端先前已锁定名称),如果发生错误则返回NULL(例如用完)内存或线程被mysqladmin杀死)。