web-dev-qa-db-ja.com

ブラウザごとに複数のIIS接続を許可するようにPHP 7.5を構成するにはどうすればよいですか?

開発サーバーで、_/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)のようです。

1
wtftech

IISの構成方法やFastCGIとは関係ありません。これは、WindowsファイルシステムとPHPセッション情報がファイルに保存されていることの問題でした。 1つのブラウザーで、PHPセッションファイルが開かれ、その要求が完了するまでロックされます。(同じブラウザーからの)2番目の要求は、セッション情報ファイルのロックが解除されるのを単に待っていました。しかし、別のブラウザー別のセッションでした。

セッションが自動的に開始されるように構成されていなかった場合、私が書いたカウンタースクリプトのように、単純なPHPページでこれに気付かなかったかもしれません。しかし、bigreport.php、次にsmallreport.phpを実行していることに気づいたでしょう。それらはログインのためのセッションに依存しているので、その直後。

解決策は簡単です。レポートクエリを実行する直前にsession_write_close()を呼び出します。私の場合、それ以降はセッション情報は必要ありませんでした。もしそうなら、そのセッション情報をsession_write_close();の直前に$mysession = $_SESSION;のようなカスタム配列に保存し、後で$mysessionを参照することができたでしょう。

1
wtftech