Windows Server 2022 Datacenter
nginx 1.22
php ts 8.3
session用的是redis 5.0.14.1,
代碼框架用的是thinkphp5.0
具體的現(xiàn)象是同一個會話請求時, 前面的請求處理會阻塞,下一個異步進(jìn)來的請求,
不同會話之間不會相互阻塞
php API 測試的代碼很簡單
{
function test(){
echo "hello world";
}
function sleep1(){
//單存輸出 <pre> 標(biāo)簽方便測試
pre();
//直接關(guān)閉session
session_write_close();
if (session_status() === PHP_SESSION_ACTIVE) {
echo_ln("session 開啟了");
} else {
echo_ln("session 沒啟動");
}
// 在需要的地方檢查session_write_close()是否被調(diào)用
if (session_status() === PHP_SESSION_ACTIVE && !headers_sent()) {
// 如果沒有輸出到瀏覽器并且Session處于活動狀態(tài),則調(diào)用session_write_close()
// session_write_close();
echo_ln("session 沒關(guān)閉");
}
// echo_ln 單存的在 輸出語句后面補上換行符
echo_ln( "strat:" . time() );
sleep(10);
echo_ln( "end:" . time() );
}
}
同一個瀏覽器開兩個標(biāo)簽頁,手動的,幾乎同時刷新,會發(fā)現(xiàn)第二個被刷新的頁面一定比前一個慢10秒才開始執(zhí)行
已經(jīng)配置過 php.ini , nginx.conf
nginx.conf
#user nobody;
worker_processes 8;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
multi_accept on;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format detailed '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'upstream: $upstream_addr';
# access_log logs/access.log main;
access_log logs/access.log detailed;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#為了讓nginx在windows系統(tǒng)下支持高并發(fā)處理fastcgi
#手動添加多個監(jiān)聽ip
#加多少個監(jiān)聽ip就表示加多少監(jiān)聽進(jìn)程協(xié)助處理請求
#直接加32個
upstream phpfastcgi_proxy{
#最少連接數(shù)負(fù)載均衡
least_conn;
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
server 127.0.0.1:9003;
# server 127.0.0.1:9004;
# server 127.0.0.1:9005;
# server 127.0.0.1:9006;
# server 127.0.0.1:9007;
# server 127.0.0.1:9008;
# server 127.0.0.1:9009;
# server 127.0.0.1:9010;
# server 127.0.0.1:9011;
# server 127.0.0.1:9012;
# server 127.0.0.1:9013;
# server 127.0.0.1:9014;
# server 127.0.0.1:9015;
# server 127.0.0.1:9016;
# server 127.0.0.1:9017;
# server 127.0.0.1:9018;
# server 127.0.0.1:9019;
# server 127.0.0.1:9020;
# server 127.0.0.1:9021;
# server 127.0.0.1:9022;
# server 127.0.0.1:9023;
# server 127.0.0.1:9024;
# server 127.0.0.1:9025;
# server 127.0.0.1:9026;
# server 127.0.0.1:9027;
# server 127.0.0.1:9028;
# server 127.0.0.1:9029;
# server 127.0.0.1:9030;
# server 127.0.0.1:9031;
}
#開發(fā)
server {
listen 8000;
server_name location;
index index.php;
root D:\webapp\development\public;
location / {
if (!-e $request_filename){
rewrite ^/(.*)$ /index.php/$1 last;
}
}
location ~ .*\.php {
if (!-e $document_root$fastcgi_script_name) {
##此處直接返回404錯誤
##你也可以rewrite 到新地址去,然后break;
return 404;
}
#修改監(jiān)聽ip 為 phpfastcgi_proxy
fastcgi_pass phpfastcgi_proxy;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#charset koi8-r;
#access_log logs/host.access.log main;
# location / {
# root html;
# index index.html index.htm;
# }
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 8001;
server_name location;
index index.php;
root D:\webapp\development2\public;
location / {
if (!-e $request_filename){
rewrite ^/(.*)$ /index.php/$1 last;
}
}
location ~ .*\.php {
if (!-e $document_root$fastcgi_script_name) {
##此處直接返回404錯誤
##你也可以rewrite 到新地址去,然后break;
return 404;
}
fastcgi_pass phpfastcgi_proxy;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#charset koi8-r;
#access_log logs/host.access.log main;
# location / {
# root html;
# index index.html index.htm;
# }
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#生產(chǎn)
server {
listen 88;
server_name location;
index index.php;
root D:\webapp\production\public;
location / {
if (!-e $request_filename){
rewrite ^/(.*)$ /index.php/$1 last;
}
}
location ~ .*\.php {
if (!-e $document_root$fastcgi_script_name) {
##此處直接返回404錯誤
##你也可以rewrite 到新地址去,然后break;
return 404;
}
fastcgi_pass phpfastcgi_proxy;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#charset koi8-r;
#access_log logs/host.access.log main;
# location / {
# root html;
# index index.html index.htm;
# }
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
目前尚不知是php-cgi在windows系統(tǒng)下的根本性特性還是我配置哪里寫錯
有查到一個說法,windows下只有apache才能讓php不阻塞執(zhí)行,但是尚未驗證,
請有經(jīng)驗的同行幫忙解答問題
結(jié)論如一樓評論,需要精確控制每次session變量的啟動和關(guān)閉
然后我的php舉例并不能模擬實際場景
一般情況下的阻塞場景,基本是請求數(shù)據(jù)庫或其他應(yīng)用程序,比較耗時
而 sleep函數(shù) 比較特殊,是真的直接阻塞整個進(jìn)程或線程,原理不深究