PHP:一次只能执行特定脚本的单个实例



我有一个简单的小脚本,可以打印当前时间,休眠十秒钟,然后再次打印当前时间:

<?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。

最新更新