我有一个简单的小脚本,可以打印当前时间,休眠十秒钟,然后再次打印当前时间:
<?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的两个不同窗口(在同一台计算机上(发出请求的。 因此,我尝试使用一个Firefox和一个IE,并且两者都在服务器端同时运行。
然后,我再次尝试使用Firefox的两个不同窗口,并观看了网络嗅探器。 第二个窗口甚至没有发送 GET 请求,直到第一个窗口的响应完成。
所以看起来这种行为在 Firefox 上是这样:至少在某些情况下,如果您尝试从 Firefox 向同一 URL 发出两个请求,Firefox 会将它们排队而不是同时处理它们。
您可以执行任意数量的 PHP 脚本实例。当您通过浏览器访问脚本时,您是通过 Web 服务器访问它的。当您通过 Web 服务器访问脚本时,发生的所有情况都是服务器执行脚本的 1 个实例。
从上面看,看起来您的 Web 服务器已设置为对具有上述副作用的传入请求进行排队。
如果您需要访问相同的 PHP 实例,则需要使用线程:示例
。但对于仅仅测试 MySQL 的GET_LOCK来说,这可能太复杂了。
另一方面,可能是你的结果是因为第一次调用阻止了锁名。
GET_LOCK(超时(
尝试使用超时秒数获取具有字符串 str 指定名称的锁。负超时值表示无限超时。锁是排他性的。当由一个会话持有时,其他会话无法获取同名的锁。
如果成功获取锁,则返回 1;如果尝试超时(例如,因为另一个客户端之前锁定了名称(,则返回 NULL;如果发生错误(例如内存不足或线程被 mysqladmin kill 杀死(,则返回 NULL。