一个 GraphQL API ,耗时长达 7 秒的排查分析(Windows PHP-FPM 可以同时处理多个请求吗?)
1、一个 GraphQL API ,耗时长达 7 秒。如图1
2、在 Laravel Telescope 中查询此请求的时间,1345 ms。如图2
3、不在页面中请求 GraphQL API,而是使用 Altair GraphQL Client 单独请求,耗时 1.87 秒。与在 Laravel Telescope 中的时间大致相当。如图3
4、现在的运行环境:Windows 10、Nginx 和 PHP FastCGI。这种环境下受到限制,即一次只能服务一个 HTTP 请求。进而导致 GraphQL API 的等待时间长达 7 秒。
5、现在的 Nginx 配置如下
http { ## PHP-FPM Servers ## upstream php-fpm { server 127.0.0.1:9000; } server { location ~ \.php$ { # fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } } }
6、参考:https://stackoverflow.com/questions/15819351/can-windows-php-fpm-serve-multiple-simultaneous-requests 。
7、调整 Nginx 配置如下
http { ## PHP-FPM Servers ## upstream php-fpm { server 127.0.0.1:9000; } upstream php_farm { server 127.0.0.1:9003 weight=1; server 127.0.0.1:9004 weight=1; server 127.0.0.1:9005 weight=1; server 127.0.0.1:9006 weight=1; } server { location ~ \.php$ { # fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # fastcgi_pass 127.0.0.1:9000; fastcgi_pass php_farm; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } } }
8、需启动几个 php-cgi 进程并将它们绑定到不同的端口:9003、9004、9005、9006。如图4
9、重启 Nginx 后。如图5
10、再次在浏览器中刷新页面,查看 GraphQL API 请求时间。已经缩短至 2 秒左右。符合预期。如图6
近期评论