###前提・実現したいこと
NginxでPHPを、PHP-FPMにて動かしています。そのPHPにて、同じブラウザからほぼ同時に送られた複数のリクエストを、並列で処理しようとしています。
最終的に行いたいのは、一つのブラウザから送信された複数のAjax通信を、PHPを使い並列で同時に処理していくことですが、その前段階で躓いています。
###発生している問題
同じブラウザからの複数のリクエストを受けつけ、並列で処理しようとしていますが、なぜかうまく並列で処理してくれません。
curlで複数のリクエストを送ると並列で処理してくれますが、Chromeなどで複数のタブを開き、ほぼ同時にリクエストを送ると、並列で処理されず、リクエストが送られた順に、一つずつ処理が行われてしまいます。
###確認した方法など
Nginxから最初に読み込まれる、index.php の記載は
php
1<?php 2error_log('index.php start' . "\n", 3, '/xxx/log.txt'); 3sleep(5); 4error_log('index.php end' . "\n", 3, '/xxx/log.txt');
という、log.txt にログを吐き出すだけの非常にシンプルなものです。
同一ブラウザから3つのリクエストをほぼ同時に送信した場合は、log.txtへの出力は下記のようになり、各リクエストが順番に処理されてしまっているのがわかりました。
index.php start index.php end index.php start index.php end index.php start index.php end
curlから3つのリクエストをほぼ同時に送信した場合は、log.txtへの出力は下記のようになり、各リクエストが並列で処理できていることがわかりました。
index.php start index.php start index.php start index.php end index.php end index.php end
同じChromeでも、シークレットモードからと通常のモードからほぼ同時にリクエストを送ると、その2つのリクエストは並列で処理してくれています。
並列で処理できる場合があるので、Nginxのworker数やコネクション数などは問題ないと思うのですが、同一ブラウザから送られた場合に、並列で処理できないのは何が問題なのでしょうか。
もし分かる方がいましたら、是非ご教授いただければ幸いです。
###補足情報(言語/FW/ツール等のバージョンなど)
nginx 1.9.9
PHP 5.6.30 (fpm-fcgi)
nginxの設定ファイルの一部
user nginx; worker_processes auto; worker_rlimit_nofile 10240; events { worker_connections 4096; use epoll; multi_accept on; }
location / { try_files $uri /index.php$is_args$args; } location ~ \.php$ { fastcgi_buffer_size 64K; fastcgi_buffers 16 64K; fastcgi_busy_buffers_size 256K; fastcgi_temp_file_write_size 256k; try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。