データベース接続における超常現象について議論しています。経験豊富な専門家が緊急の支援を求めてください。 SAAS モデルの ERP システムを構築しました。現在の方法では、企業ごとにデータベースを構築しますが、共通の PHP スクリプトを使用します。たとえば、私の SAAS 顧客には 50 社の企業があり、これは MYSQL で 50 の DB を構築したことを意味しますが、データ構造はすべて同じです。この場合、PHP スクリプトは 1 セットしかないため、1 か所を変更することは 50 台のシステムをアップグレードすることに相当し、より便利です。 各企業が最初のページにログインするときに、データベースに接続するための PHP スクリプトに SESSION['db'] を保存します。接続された DB の名前は SESSION['db'] です。この会社 データベースを追加、削除、変更し、チェックインするだけです。 今起こっている奇妙なことは、シリアル番号が時折発生することです。たとえば、A 社は最初のページでログインするときに SESSION['DB'] = 'A' を設定し、再度ログインするときに A という名前のデータベース内のユーザー名とパスワードを確認します。データベース内のテーブルを追加、削除、および変更します。しかし、A社がログインして更新すると突然B社のデータになり、その後C社のデータが表示されるということがたまに起こります。この接続では DB が A に固定されているのに、なぜ他のデータベースのデータがエイリアス化されるのか疑問に思いました。 私の最初の分析は、スクリプトがすべて同じであるということは、URL がすべて同じであることを意味します。理論的には、SESSION['db']はページを開くたびに自動的に接続されるので問題ありません。シリアル番号が表示されるので、キャッシュが原因であると思われます。後でインターネットで調べてみると、360 Browser がユーザーのプライバシーとチェーン COOKIE をアップロードしたことが報告されているようで、その時は 360 Browser の動作が原因なのかと疑問に思っていました。 最初の対策として、ドメイン名の汎解決を使用して、各社の URL を異なるものに変更しました。つまり、A 社の URL は A.xxx.com、B 社の URL はb.xxx.com ですが、全体的なフレームワークは同じであり、PHP スクリプトも同じです。この場合、360 が COOKIE をサーバー キャッシュにアップロードしたとしても、URL が異なるため、エイリアスは存在しませんよね。しかし、私はまた間違っていたことが分かりました。午後、別の顧客から電話があり、自社のシステムで他社のデータをどうやって見ることができるかについて問い合わせがありました。私は完全に狂っています。 2 回目の分析ですが、mysql_pconnect() 接続が原因なのでしょうか?企業 A がデータベースへの永続的な接続を確立したと考えています。企業 B のログインも mysql_pconnect() です。APACHE は企業 A によって確立された接続を企業 B で使用するために直接使用しますか?そこで、すぐに pconnect を夜間接続に変更しました。しかし、このデータのシリアル番号が商用ソフトウェアに与える影響はそれほど単純ではないと私は感じています。力を入れすぎて、力が及ばないかもしれません。 もう一度、この奇妙な現象がなぜ起こるのか、専門家に分析を手伝ってもらいます。キャッシュの原因を何度も疑ったのですが、キャッシュされたページが表示されても相互に変更できないはずなので、やはりデータベース接続に問題が発生しているのでしょうか? 私の QQ 番号は 13676987、杭州です。専門家とのコミュニケーションを楽しみにしています。 -----解決策--------- 1.SESSION[ ' db'] は $_SESSION['db'] ですか? 2. dbname をセッションに書き込む必要があるのはなぜですか? 各サイトで構成ファイルを使用して異なる情報を記録しないのはなぜですか? たとえば、各サイトに config.php、 define('DBNAME', 'db1'); 3. dbに保存されているのでしょうか? ------解決策---------------------- そうであれば、仮想ホストは 50 個になるはずです それは違います。 Apache の Env モジュールを使用します。使用方法は以前書いた記事を参照してください: http://blog.csdn.net/fdipzone/article/details/9388959 仮想ホストに
<br /><IfModule mod_env.c> <br />SetEnv DBNAME DB1<br /></IfModule> <br /> ログイン後にコピー
仮想ホストが異なれば、値の設定も異なります。
次に、config で dbname を設定します。
例: $dbname = 'DB1'; は $dbname = $_SERVER['DBNAME'];
に変更されました-----解決策---------- - --------
ヒント: Env を使用して保存されたデータは Web 上でのみ読み取ることができ、php cli モードでは読み取ることができません。特定のニーズに応じて使用してください。
------解決策----------------------
データベースの長い接続はデータベース サーバーに対して再利用されます
システム内の他社のデータを確認する方法について
から開始します。
: 「初動対応策」から開始します。ドメイン名の汎解決を使用する」は、ユーザー認証が独立していることを示します。 SSO は現在非常に人気があり、あなたもそれを使用している可能性を排除しません
複数の企業が同じソフトウェアのセット (インターフェイスを含む) を変更せずに使用できるため、これらの企業が関与していることがわかります同じ業界で。したがって、A社の人間がB社の人間のログインパスワードを知っている可能性は否定できません
マルチタブ ブラウザを使用して、タブ A で会社 A にログインし、タブ B で会社 B にログインします。タブ A に戻ると、企業 B のデータが表示されます
複数のタブが Cookie を共有し、A によって設定されたセッション ID が B によって変更されたため
実際、受信データは無条件に信頼されます。実装の根拠
第2レベルドメイン名方式を使用する場合、ドメイン名が異なるためCookieは共有されません。しかし、まだシングルサインオンである場合、信頼ドメインのせいで状況は変わりません
現在、データベースの機能を信じず、データキャッシュなどを構築することを好む人が多すぎます(恐れ)
データ キャッシュは主にクエリ名によって区別され、システム内のデータの所属を区別するのはライブラリ名です。混同されるのは普通のことです。
-----解決策---------
引用:
データベースの長い接続は、データベース サーバーへの接続を再利用しますが、データベースへの接続は再利用しません より、システム内の他の企業のデータを確認する方法 開始: 「最初の応答では、ドメイン名の汎解決を使用しています」から、ユーザー ID 検証が独立していることがわかります。 SSO は現在非常に人気があり、あなたもそれを使用している可能性を排除しません 複数の企業が同じソフトウェアのセット (インターフェイスを含む) を変更せずに使用できるため、これらの企業が関与していることがわかります同じ業界で。したがって、A社の人がB社の人たちのログインパスワードを知っている可能性は否定できません マルチタブブラウザを使用して、タブAでA社にログインし、タブBでB社にログインします。タブ A に戻ると、企業 B のデータが表示されます 複数のタブが Cookie を共有し、A によって設定されたセッション ID が B によって変更されたため 実際、受信データは無条件に信頼されます。実装の根拠 第2レベルドメイン名方式を使用する場合、ドメイン名が異なるためCookieは共有されません。しかし、まだシングルサインオンである場合、信頼ドメインのせいで状況は変わりません 現在、データベースの機能を信じず、データキャッシュなどを構築することを好む人が多すぎます(恐れ) データ キャッシュは主にクエリ名によって区別され、システム内のデータの所属を区別するのはライブラリ名です。混乱するのは普通のことです。
問題はキャッシュにあるということですか?毎回データベースに接続していれば問題ないのでしょうか?
------解決策---------------------- キャッシュを使用しない場合、問題が解決される可能性があります存在する 1 つの側面
$_SESSION['db'] を信頼するだけでなく、ユーザーのソースを特定する方法が少なくとも 1 つある場合は、問題の考えられる側面を 1 つ取り除くことができます
既知の潜在的な問題は排除されましたが、問題は解決されていません
つまり、未知の潜在的な問題がまだ存在しており、それは議論する必要がある問題です
ポスターも同じ意味です。そして彼は、あなたが知っている考えられる問題をリストアップして、トラブルシューティングできるようにしてほしいと願っています
それらを解決する方法については、別の日の話になります。問題は見つからず、解決策は無駄です
Quote:
問題がキャッシュにあるということですか?毎回データベースに接続していれば問題ないのでしょうか?
-----解決策---------------------------- - データベースリンクも再利用されている可能性はありますか?
絶対に不可能です
特に SESSION['DB'] が何らかの不明な理由でクリアされた場合はどうでしょうか?
SESSION['DB'] がクリアされている場合、mysql_select_db('') を実行するのと同じですが、これは失敗します (データベースが選択されていません)
私が話しているキャッシュはキャッシュを指しますプロジェクトの機能
通常、クエリ結果をキャッシュするために使用され、頻繁なアクセス中にデータベースを読み取りません
第 2 レベルのドメイン名が使用されている場合、第 2 レベルのドメイン名はデータベース名
----- -解決策--------- お気に入り~~~~
-----解決策--------- マーク、通り過ぎる初心者そこから学びましょう
私がこれを作るとしたら、顧客用に個別のテーブルを作成し、各データ テーブルとインデックスに顧客 ID フィールドを追加して、顧客を追加するためのシンプルな一般的な背景を作成します。これは管理に便利です。 ~
xxx で変数をフィルタリングする場所にフロントのモデル層を渡すと、一律に顧客 ID = xxx を追加します~ しかし、この方法のデメリットがよくわかりません
------解決策----------- ----------
引用:
引用: 引用:
ヒント: Env を使用して保存されたデータは Web 上でのみ読み取ることができ、php cli モードでは読み取ることができません。特定のニーズに応じて使用してください。
50 個の仮想ホストは使用せず、ドメイン名の汎解像度を使用したのは 1 つだけです。すべての第 2 レベルのドメイン名が仮想ホストを指すようにします。
当然のことですが、提供される情報はそれほど多くありません。分析するのは難しいですが、上司はすでにより包括的に分析しています。
------解決策---------------------- ドメイン名に基づいています。 $_SERVER[' HOST'] どのデータベース接続を使用するかを決定しますか?
コードリファレンスのその部分を提供していただけますか?
------解決策------------------ 私の現在のアプローチは、会社ごとに 1 つを使用することです 独立
会社 a は http://a.xx.com を使用します
会社 b は http://b.xx.com を使用します
セッションはドメインを越えません。現在、複数の企業間でのデータの文字列の問題は発生していません。