2

私はいくつかの PHP コードを書いており、MySQL データベースに頻繁にアクセスしてフィールドの読み取りと更新を行っています。

現在のコードには dbconnnect というクラスが含まれており、次のように使用します。

class edit_data extends dbconnect {
//<some php code>
parent::connect();
//<get info from database>
parent::disconnect();
//<evaluate data>

私の質問 - これは、MySQL データベースに接続および切断する最も効率的な方法ですか? (覚えておいてください、私はほぼ常に同じデータベースに接続しているので、毎回接続パラメーターを再定義する必要はありません)。

コンストラクターで接続を実行することを検討していたので、次のように書くことができました

$connector = new dbconnect();

しかし、これを行っても実際にはあまり節約できないことに気付きました。

ありがとう。

4

8 に答える 8

1

使用することで

$connector = new dbconnect();

そしてそうではない

parent::connect();

基本的に、edit_data クラスを dbconnect クラスと切り離しています。あなたにとっての意味は次のとおりです。

  1. edit_data クラスは、複数の dbconnect オブジェクトを使用して複数の接続を持つことができるようになりました (接続プーリング)
  2. edit_data クラスは (将来) dbconnect 以外のものを使用でき、他のコードを変更する必要はありません。parent::connect() を使用して、別のクラスを拡張するように変更した場合は、新しいクラスが既存のセマンティクスをサポートすることを確認する必要があります
于 2009-04-06T04:21:06.803 に答える
1

データベース接続/切断のコードが各ファイルの最初と最後に自動的に含まれていることを確認してください。ファイルごとに個別に実行する必要はありません。このコードを 1 つの場所に保存し、他のすべてのファイルに含めて、必要なときに簡単に変更できるようにしてください。これらのことを行う限り、残りはデータベースへの接続/切断方法に関する個人的な好みにすぎません。

また、各ファイルの舞台裏でこのような一般的なタスクを処理するために、 CodeIgniterなどのフレームワークをお勧めします。

于 2009-04-05T14:51:51.197 に答える
0
  • 接続には費用がかかるため、クエリごとに接続および切断しないでください。
  • 可能であれば、mysqlの代わりにmysqliを使用すると、一般的に高速になります
  • mysql_pconnectmysqliではなくmysqlを使用している場合は、mysql_connect
  • phpは開いているすべてのdb接続を閉じるため、明示的に行う必要はありません。
  • スクリプトの開始時に接続するか、最初のクエリで接続するかに関係なく、クエリ間で接続を共有します。
于 2009-04-06T06:28:58.133 に答える
0

「正しい」方法は、おそらく MySQLi および PDO 拡張機能のように行うことです。コンストラクタで接続を開き、デストラクタで閉じます。「効率的な」方法は、 query() メソッドで接続を確認し、必要に応じて (r) 開くことです。

どちらのアプローチでも、個別の connect() メソッドを作成することを回避できるため、スクリプトで呼び出しを忘れるリスクがなくなります。

于 2009-04-05T18:10:11.000 に答える
0

あなたの接続を再利用することを確認してください:

new_link パラメータを確認します。

同じ引数で mysql_connect() への 2 回目の呼び出しが行われた場合、新しいリンクは確立されませんが、代わりに、既に開かれているリンクのリンク識別子が返されます。new_link パラメータはこの動作を変更し、mysql_connect() が以前に同じパラメータで呼び出された場合でも、常に新しいリンクを開くようにします。SQL セーフ モードでは、このパラメーターは無視されます。

http://php.net/function.mysql-connect

于 2009-04-06T04:33:50.970 に答える
0

「dbconnect」クラスから「edit_data」クラスを派生させることは、ロジックの混乱を示していると思います。データ編集オブジェクトは特別なタイプのデータベース接続ですか? それとも、データ編集オブジェクトがデータベース接続を使用する必要があると言う方が理にかなっているでしょうか? (これが IS A と HAS A の違いです。)

現在では時代遅れになっているようですが、シングルトン ファクトリ コールを使用してデータベース ハンドラを取得できます。次に、それを必要とする関数は、単にそれを呼び出すことができます。ハンドラーが最初に何らかの作業を行う必要があるときにハンドラーを自己初期化するようにすると、初期化について心配する必要さえありません。(これを行うには、ハンドルを含むインスタンス変数がリソース ハンドルであるかどうかを確認します。そうでない場合は、初期化子を呼び出します。接続が失敗した場合の対処方法を決定することを忘れないでください。)次に、ハンドラーがその構成を見つける方法が必要です。 . イニシャライザではなく、ファクトリコールにそれを行わせます。

これを行う別の方法は、コンストラクターが現在のデータベース ハンドラーを取得し、それへの参照をインスタンス変数に入れることです。これにはいくつかの方法があります。コンストラクターでそれを要求するとうまくいくか、シングルトン ファクトリ コールに再度フォールバックできます。この手法により、オブジェクト コンストラクターは、データベース ハンドラーが初期化されない場合にインスタンス化を拒否する機会が与えられます (ファクトリ コールで確認できます)。

于 2009-04-06T05:35:27.017 に答える
0

毎回常にデータベースに接続することがわかっている場合を除き、接続ピースをコンストラクターに入れません。接続する必要がない場合は、接続しないでください。コストがかかります。コンストラクターは、接続パラメーターのみを受け入れる必要があります。静的クラスを使用しているように見えますが、コンストラクターが実行されます。

Krzysztof が述べたように、オンデマンドで接続する必要があります。私のデータベース クラスでは、すべてのクエリが最終的に「execQuery」関数を通過するようにしています。その関数は、データベースへの接続があるかどうかをチェックします。単一の中央クエリ機能を使用すると、セッションで実行されたすべてのクエリを記録したり、タイミングを追加したり、ログを記録したり、その他必要なことを行うことができます。

デストラクタで切断するのが適切な場所です。

于 2009-04-06T00:44:37.697 に答える
0

私たちのコードベースには多くのパスがあり、キャッシュを多用しています。

最初のクエリが実行されたときにのみデータベースに接続します。(つまり、実際には ->query() メソッドで)。

スクリプトが終了したら、PHP を切断します。明示的に ->disconnect を呼び出さないでください。

于 2009-04-06T01:16:20.867 に答える