没有不值得去解决的问题,也没有不值得去学习的技术!

一个 GraphQL API ,耗时长达 7 秒的排查分析(Windows PHP-FPM 可以同时处理多个请求吗?)

一个 GraphQL API ,耗时长达 7 秒

1、一个 GraphQL API ,耗时长达 7 秒。如图1

一个 GraphQL API ,耗时长达 7 秒
图1

2、在 Laravel Telescope 中查询此请求的时间,1345 ms。如图2

在 Laravel Telescope 中查询此请求的时间,1345 ms
图2

3、不在页面中请求 GraphQL API,而是使用 Altair GraphQL Client 单独请求,耗时 1.87 秒。与在 Laravel Telescope 中的时间大致相当。如图3

不在页面中请求 GraphQL API,而是使用 Altair GraphQL Client 单独请求,耗时 1.87 秒。与在 Laravel Telescope 中的时间大致相当
图3

4、现在的运行环境:Windows 10、Nginx 和 PHP FastCGI。这种环境下受到限制,即一次只能服务一个 HTTP 请求。进而导致 GraphQL API 的等待时间长达 7 秒。

5、现在的 Nginx 配置如下

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 配置如下

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

需启动几个 php-cgi 进程并将它们绑定到不同的端口:9003、9004、9005、9006
图4

9、重启 Nginx 后。如图5

重启 Nginx 后
图5

10、再次在浏览器中刷新页面,查看 GraphQL API 请求时间。已经缩短至 2 秒左右。符合预期。如图6

再次在浏览器中刷新页面,查看 GraphQL API 请求时间。已经缩短至 2 秒左右。符合预期
图6

关于作者 · 持续学习与技术实践

我是一名拥有 15 年以上开发经验的技术从业者,自 2013 年起持续运营个人技术博客,记录工作与个人项目中遇到的真实问题,以及解决问题过程中的探索、实践和思考。

除了技术写作,我也在持续开发和维护自己的独立项目,探索新技术和新工具在实际场景中的应用。我始终相信,没有不值得去解决的问题,也没有不值得去学习的技术。

如果这篇文章对你有所帮助,欢迎浏览博客中的其他文章,也欢迎交流技术经验与想法。

关于我  ·  GitHub  ·  邮件联系