在我们的开发服务器上,我点击了/bigreport.php
,它连接到 MySQL 并运行报告。这需要几分钟。
在另一个浏览器选项卡中,我导航到/smallreport.php
,它连接到 MySQL 并运行一个较小的报告(但仍需要一分钟)。第二个查询甚至smallreport.php
直到完成才开始bigreport.php
。这是同一个开发服务器。
第二个窗口:浏览器旋转器旋转,页面上什么也没有显示。在 MySQL 中,SHOW PROCESSLIST
只显示第一个窗口(来自bigreport.php
)。似乎 PHP 甚至没有为第二个请求运行。
当第一个请求正在运行时(bigreport.php
),我可以加载,test.html
并且它会立即加载。但是,如果我打开一个示例 PHP 页面,phpinfo.php
连接就会挂起,直到完成才会启动bigreport.php
。此页面中没有数据库连接phpinfo.php
。为了确保万无一失,我编写了一个简单的测试 PHP 页面,sleep(10);
结果相同。
我检查了 MySQL SHOW VARIABLES LIKE 'max%connections'
,一切都是默认/正常的。每个用户的连接数没有限制,所有连接的默认连接数都是 151。这似乎不是 MySQL 的问题。
我搜索了 PHP 限制连接,但它似乎甚至没有这种机制。PHP 由 Web 服务器运行,无论是 Apache、IIS 还是其他。
因此,这似乎是 IIS 7.5 中的一个问题(或配置)。我尝试搜索“IIS7 每个浏览器/用户多个连接”,但我找到的只是有关为每个 IP 配置多个网站(或虚拟主机)的 IIS 的帮助。
我可以bigreport.php
从我的浏览器点击,然后从另一台机器拉起smallreport.php
,它同时运行。速度会慢一点,但服务器不会有压力。我可以从任务管理器观察 CPU 活动和内存使用情况,在这两个报告运行时看不到任何事情发生。但如果我尝试从同一个浏览器同时加载两者bigreport.php
,smallreport.php
则一次只能加载一个。一旦一个完全完成,下一个就会开始。顺序无关紧要。
我可以在运行.html
时同时加载多个页面。这些标准页面几乎可以立即加载。也许是 FastCGI 的问题/配置问题?bigreport.php
.html
bigreport.php
我可以从 Firefox加载,然后smallreport.php
从 Chrome 点击,它确实同时运行!相同的 IP,相同的机器(我的)。但不能从 Firefox 中的另一个选项卡加载。
在 appPool 中,我尝试改变最大工作进程数从默认1到2没有效果。
Windows Server 2008 R2 标准版,IIS 7.5.7600.16385。
任何帮助,将不胜感激。
更新时间 2019-05-03:
我编写了一个 PHP 脚本来循环十秒,每秒回显一次数字(使用flush()
),这样我就能知道它计数了多少。我在 Firefox 窗口 #1 中加载此页面,然后在窗口 #2 中加载:窗口 #2 等待 #1 完成后才开始。
我在 Chrome 中为同一个计数页面打开了两个窗口:窗口 #1 运行正常,窗口 #2 等待 #1 完成。
然后我重新加载它们:Firefox 窗口 #1 启动,但 Firefox #2 挂起,等待 Firefox #1。Chrome 窗口 #1 启动,但 Chrome #2 等待 Chrome #1 完成。
每个浏览器的连接限制似乎为 (1)。
答案1
这与 IIS 的配置方式或 FastCGI 无关。这是 Windows 文件系统和存储在文件中的 PHP 会话信息的问题。在一个浏览器中,PHP 会话文件被打开并锁定,直到该请求完成。第二个请求(来自同一个浏览器)只是等待会话信息文件锁定释放。但另一个浏览器是不同的会话。
如果会话未配置为自动启动,我可能不会在简单的 PHP 页面上注意到这一点,例如我编写的计数器脚本。但我会注意到它在运行bigreport.php
,然后smallreport.php
紧接着运行,因为它们依赖于会话进行登录等。
解决方案很简单:session_write_close()
在运行报告查询之前调用。就我而言,此后不需要任何会话信息。如果是的话,我可以将该会话信息保存到自定义数组中,例如:$mysession = $_SESSION;
就在之前session_write_close();
,然后$mysession
稍后引用。