同时有多个 php 请求,第二个请求在第一个请求完成后才开始

Multiple php requests simultaneously, second request doesn't start until first finishes

我有一个很长的 运行 php 7.2 脚本正在生成一个 zip 文件。我想使用循环 ajax 调用来检查构建 zip 文件的进度。第二个脚本似乎被锁定并且在第一个脚本完全完成之前不会开始处理。

事实上,直到第一个脚本完全完成后,第二个脚本才在我的 index.php 路由脚本的第一行打印 error_log() 。

我的 index.php 路由器脚本的顶部:

<?
error_log('top of index '.$_SERVER['REQUEST_URI']);

即使我只是请求静态图像资源也是如此。在 long-运行 脚本完全完成之前,第 1 行的 error_log() 甚至不会打印。

起初,我认为我 运行 进入 Session Locking as described here 但他们提供的解决方案似乎不起作用(调用 session_write_close()),我想知道是否有什么else 正在继续,因为第二个脚本在第 1 行之前锁定,而不是在我尝试启动会话时锁定。第二个脚本似乎根本没有开始。我想也许服务器在第 1 行之前自动启动会话,但我检查了一下,我的服务器有 session.auto_start=0。

我需要设置一些服务器配置吗?

我错过了什么?我究竟做错了什么?

我 运行 在本地主机 (Mac) 上使用内置 PHP 服务器。

php -c /usr/local/etc/php/7.2/php.ini -S 127.0.0.1:8080 index.php

内置的网络服务器是一个单线程、单进程、同步的服务器。它仅用于测试目的。它一次只能处理一个请求。它不能同时处理多个并发请求。

这是因为PHP服务器默认只使用一个进程,这会阻止它同时执行多个请求。

从 PHP 7.4 开始,内置服务器支持多个 worker(在 fork() 可用的平台上)。请参阅此提交:https://github.com/php/php-src/commit/82effb3fc7bcab0efcc343b3e03355f5f2f663c9

要使用它,请在启动服务器之前添加 PHP_CLI_SERVER_WORKERS 环境变量。例如:

PHP_CLI_SERVER_WORKERS=10 php7.4 -S 127.0.0.1:7080 index.php

如果您想使用此功能,我建议升级您的 PHP 7.2 安装。