開発サーバーで、_/bigreport.php
_を押します。これは、MySQLに接続してレポートを実行します。数分かかります。
別のブラウザタブで、_/smallreport.php
_に移動します。これは、MySQLに接続し、より小さなレポートを実行します(ただし、まだ1分かかります)。 _smallreport.php
_への2番目のクエリは、_bigreport.php
_が終了するまで開始されません。これは同じ開発サーバーです。
2番目のウィンドウ:ブラウザスピナーが回転し、ページに何も表示されません。 MySQLでは、_SHOW PROCESSLIST
_は最初のもののみを表示します(_bigreport.php
_から)。 PHPは2番目のリクエストでも実行されていないようです。
最初のリクエストの実行中に(_bigreport.php
_)、_test.html
_をロードでき、すぐにロードされます。しかし、代わりにサンプルのPHPページを開くと_phpinfo.php
_、接続がハングし、_bigreport.php
_が終了するまで接続が開始されません。この_phpinfo.php
_ページにはデータベース接続がありません。念のために言っておきますが、私は簡単なテストPHPページを作成しました。このページはsleep(10);
で同じ結果になります。
MySQL _SHOW VARIABLES LIKE 'max%connections'
_を確認しましたが、すべてデフォルト/通常です。ユーザーごとの接続制限はなく、すべての接続のデフォルトは151です。MySQLでは問題がないようです。
PHP制限接続を検索しましたが、そのためのメカニズムすら持っていないようです。 PHPは、ApacheであろうとIISであろうと、Webサーバーによって実行されます。
したがって、これはIIS 7.5の問題(または構成)のようです。 「ブラウザ/ユーザーごとにIIS7の複数の接続」を検索しようとしましたが、IPごとに複数のWebサイト(または仮想ホスト)用にIISを構成するのに役立ちます。
ブラウザから_bigreport.php
_を押してから、別のマシンから_smallreport.php
_をプルアップすると、同時に実行されます。少し遅くなりますが、サーバーにストレスはかかりません。タスクマネージャーからCPUアクティビティとメモリ使用量を監視できますが、これらのレポートの両方が実行されている間は何も起こりません。しかし、同じブラウザから_bigreport.php
_と_smallreport.php
_の両方を同時にロードしようとすると、一度に1つしか機能しません。それが完全に終了すると、次が始まります。順序は関係ありません。
_.html
_の実行中に、複数の_bigreport.php
_ページを同時にロードできます。これらの標準の_.html
_ページはほぼ瞬時に読み込まれます。たぶんそれはFastCGIの問題/構成の問題ですか?
Firefoxから_bigreport.php
_をロードし、Chromeから_smallreport.php
_を押すと、同時に実行されます。同じIP、同じマシン(私のもの)。しかし、Firefoxの別のタブからではありません。
AppPoolで、Maximum worker Processesをデフォルトの1から2に変更しようとしましたが効果はありませんでした。
Windows Server 2008 R2 Standard、IIS7.5.7600.16385。
どんな助けでもいただければ幸いです。
PDATE 2019-05-:
PHPスクリプトを作成して、10秒間ループし、1秒に1回(flush()
を使用して)数値をエコーして、カウントを確認できるようにしました。このページをFirefoxウィンドウ#1にロードし、次にウィンドウ#2をロードします。ウィンドウ#2は、#1が終了するのを待ってから開始します。
同じカウントページに対してChromeで2つのウィンドウを開きます。ウィンドウ#1は正常に実行され、ウィンドウ#2は#1が終了するのを待ちます。
次に、それらをすべてリロードします。Firefoxウィンドウ#1は起動しますが、Firefox#2はFirefox#1を待ってハングします。 Chromeウィンドウ#1が開始されますが、Chrome#2はChrome#1が終了するのを待ちます。
ブラウザごとの接続制限(1)のようです。
IISの構成方法やFastCGIとは関係ありません。これは、WindowsファイルシステムとPHPセッション情報がファイルに保存されていることの問題でした。 1つのブラウザーで、PHPセッションファイルが開かれ、その要求が完了するまでロックされます。(同じブラウザーからの)2番目の要求は、セッション情報ファイルのロックが解除されるのを単に待っていました。しかし、別のブラウザー別のセッションでした。
セッションが自動的に開始されるように構成されていなかった場合、私が書いたカウンタースクリプトのように、単純なPHPページでこれに気付かなかったかもしれません。しかし、bigreport.php
、次にsmallreport.php
を実行していることに気づいたでしょう。それらはログインのためのセッションに依存しているので、その直後。
解決策は簡単です。レポートクエリを実行する直前にsession_write_close()
を呼び出します。私の場合、それ以降はセッション情報は必要ありませんでした。もしそうなら、そのセッション情報をsession_write_close();
の直前に$mysession = $_SESSION;
のようなカスタム配列に保存し、後で$mysession
を参照することができたでしょう。