如何配置 IIS 7.5 以允许每个浏览器有多个 PHP 连接?

如何配置 IIS 7.5 以允许每个浏览器有多个 PHP 连接?

在我们的开发服务器上,我点击了/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.phpsmallreport.php则一次只能加载一个。一旦一个完全完成,下一个就会开始。顺序无关紧要。

我可以在运行.html时同时加载多个页面。这些标准页面几乎可以立即加载。也许是 FastCGI 的问题/配置问题?bigreport.php.html

bigreport.php我可以从 Firefox加载,然后smallreport.php从 Chrome 点击,它确实同时运行!相同的 IP,相同的机器(我的)。但不能从 Firefox 中的另一个选项卡加载。

在 appPool 中,我尝试改变最大工作进程数从默认12没有效果。

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稍后引用。

相关内容