ブラウザ+apache + php + mysql 環境において、mysqlの同時接続可能数には余裕があるのに、ブラウザで同時接続できない!ということが起こり、原因を調べてみましたので紹介します。
これは実はブラウザのクッキーが原因であって、ブラウザを介せずmysqlやapacheを叩いてみると同時接続できるのでした。
同時接続できるかのテストコード
次のようなmysqliで mysqlへ接続するfoo.phpプログラムを設置し、ブラウザで5秒以内に数回アクセスしてみます。
<?php
$config = parse_ini_file('./shared/config.ini');
$mysqli = mysqli_connect($config['host'], $config['username'], $config['password'],
$config['dbname'], $config['port']);
sleep(5);
$mysqli->close();
echo date(DATE_RSS);
すると、5秒間隔で応答が返ってきてしまい、同時接続できていないことがわかります。
また、同様にこのプログラムが走っている間は、mysqladminにアクセスしても読み込みが止まってしまいアクセスできません。
apacheやmysqlの同時接続数は1よりもずっと多くしてあってもこれが起こります。(IntelliJ IDEAのbuilt-in serverを使っている場合は、その同時接続数が1であるせいかもしれませんが。)
なぜでしょうか。
php+mysqlのみでテスト
原因を切り分けるために、まずターミナルから、php foo.php & をやはり5秒以内に数回実行してみます。これにより、apacheを通さずにmysqlへ接続することができます。
すると、5秒以内に応答が返ってきました。
このことから、mysqlへは同時接続可能であり、それが原因で読み込みがブロックされているわけではないということが分かります。
curl+apache+php+mysqlでテスト
では、apacheのせいなのでしょうか。ブラウザのせいかもしれません。では、ターミナルから、curlを使って curl http://localhost/foo.php へ5秒以内に数回アクセスしてみます。これにより、ブラウザの影響を排除してアクセスすることが出来ます。
すると、5秒以内に応答が返ってきました。
このことから、apacheも同時接続可能であることがわかります。
まとめ
つまり、ブラウザが原因だとわかりました。
stackoverflowでも議論がなされていました。
ブラウザのクッキーが原因であるということです。
自分のプログラムを走らせているときにphpmyadminを見ることができない、というときには、別のブラウザでアクセスしてみると良いかもしれません。
以上、apache + php + mysql で同時接続数には余裕があるはずなのに同時接続できない?でした。