接到一个需求,两个项目之间需要以接口形式通讯。我心想curl轻松解决,Easy!
啪嗒啪嗒啪嗒……代码撸完了,本地测试一下
浏览器一直转圈圈直到超时……
Why!?
没有任何错误提示信息,日志也没有任何新记录
用POSTMAN
调试了一下刚写出的接口,没问题啊?
再试一次结果依旧,重启环境后再试也依旧
经过一番测试,我怀疑是不是我本地环境无法并发?
我访问项目A是一个请求,项目A访问项目B的接口则是第二个请求。在无法并发只能排队请求的情况下,第一个请求依赖于第二个请求的结果;第二个请求却排在后面一直等待第一个请求执行完毕。这就导致互相依赖产生死循环,也就说得通了
怎么解决?
nginx以高并发闻名,怎么偏偏默认不支持并发?
谷歌找了很多关于nginx并发的文章,挨个儿尝试设置,全都以失败告终
WTF!?这是闹哪样?该加该改的都弄了,理论上并发能力爆棚了啊
又是一番呕心沥血的谷歌,终于让我找到了答案——
Windows下PHP_FCGI_CHILDREN
无效
(具体参见PHP BUG#49859)
一般情况下Windows下Nginx的配置都是fastcgi_pass 127.0.0.1:9000;
也就是说cgi根本不会自动产生新进程去处理并发请求,只能排队
那要怎么办?既然不能自动生成,那就只好手动咯
动手解决
@echo off
REM Windows 下无效
REM set PHP_FCGI_CHILDREN=5
REM 每个进程处理的最大请求数,或设置为 Windows 环境变量
set PHP_FCGI_MAX_REQUESTS=1000
echo Starting PHP FastCGI...
RunHiddenConsole E:/wamp64/bin/php/php7.2.18/php-cgi.exe -b 127.0.0.1:9000 -c E:/wamp64/bin/apache/apache2.4.39/bin/php.ini
RunHiddenConsole E:/wamp64/bin/php/php7.2.18/php-cgi.exe -b 127.0.0.1:9001 -c E:/wamp64/bin/apache/apache2.4.39/bin/php.ini
echo Starting nginx...
RunHiddenConsole E:/wamp64/bin/nginx/nginx.exe -p E:/wamp64/bin/nginx
netstat -a
也能够看到9001 9002端口被监听了
server {
listen 80;
server_name admin.com;
root E:/GADMIN/admin_game/public;
location / {
index index.html index.htm index.php;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
error_log E:/wamp64/bin/nginx/logs/error.log;
#access_log E:/wamp64/bin/nginx/logs/access.log;
}
server {
listen 80;
server_name demo.apitest;
root E:/GADMIN/apitest/public;
location / {
index index.html index.htm index.php;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
error_log E:/wamp64/bin/nginx/logs/error.log;
#access_log E:/wamp64/bin/nginx/logs/access.log;
}