効率の良いDBプログラミング

このQ&Aのポイント
  • PHP+MySQLでサイトを効率的に構築するためのDB接続方法について解説します。
  • 一つのページで複数回DBに接続する方法と、個別のパッケージで接続する方法の効率を比較します。
  • また、接続/切断の時間と処理速度の関係についても考察します。
回答を見る
  • ベストアンサー

効率の良いDBプログラミング

PHP+MySQLでサイトを構築しているのですが、DBサーバへの接続/切断について分からない事があります。 現在作成中のサイトでは、1ページにDBデータを利用している箇所が複数あります。 DBを利用する部分は、個別にパッケージしているので、使いたい場所でincludeする様にしているのですが、個々のパッケージ内容で、DBサーバへのconnectを行っておらず、ページを読み込む時に、先頭でDBサーバへ接続する様に宣言して、ページの最後で切断しています。 <? include("config.php"); ?> ←DBへ接続 <HTML> <HEAD></HEAD> <BODY> <? include("counter.php"); ?> DBカウンタ ~中略~ <? include("graph.php"); ?> グラフ表示 </BODY> <HTML> 切断 こうする事で、DBへの接続を1回で済ましているのですが、この方法が最良なのかどうかわかりません。 やはり、個々のパッケージで接続/切断した方が効率が良いのでしょうか? 例えば、1ページの表示に時間がかかる様なページだと、接続から切断まで時間がかかると思います。それであれば、複数回接続でも1接続あたりの時間が短い方が効率が良いのではないかと思いました。 1ページを表示するのに、複数回接続するのはごく一般的な事なのでしょうか?

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • mi-si
  • ベストアンサー率35% (200/567)
回答No.1

通常はコネクションプーリングという手法を利用します。あらかじめデータベース接続をプールしておき、必要な時にその接続プールからコネクションを取り出して利用するやり方です。このやり方だと接続切断のオーバーヘッドがかなり軽減出来ます。単純参照系場合はかなり有効な手法です。ページにまたがる処理や更新系の場合は同じコネクションプールを次のページに引き渡す必要がありますし、終了時にリソースの破棄の処理が必要になる場合があります(結果的には使わない方が良い場合もあります。) http://search.net-newbie.com/php/function.pg-pconnect.html http://www.hizlab.net/app/phptune.html

参考URL:
http://www.hizlab.net/app/phptune.html
hamasaku
質問者

お礼

レスありがとうございます。 mysql_pconnectとmysql_connectの違いなんとなく理解しました。 使い方のイメージがあまりわかないのですが、単にmysql_connectをmysql_pconnectに変えれば動くのでしょうか? PHPファイルの先頭で、mysql_pconnectを使った場合、同じページをリロードすると、接続プールからコネクションを取り出すので、2回接続しなくても良いと言うイメージですが、あってますでしょうか? プロセスが消えるまでDBとの接続を維持すると理解したのですが、mi-siさんの「ページにまたがる処理や更新系の場合は同じコネクションプールを次のページに引き渡す必要がありますし、終了時にリソースの破棄の処理が必要になる場合があります」の説明が理解できませんでした。 良ければ、それらの説明(サンプルスクリプト)の掲載されているHPがありましたら教えていただけるとうれしいです。

関連するQ&A

  • FC4でmysqlを使用して PEAR DB への接続ができない

    FC4に、yumでPHP5.0.4、php-pear-5.0.4、php-mysql-5.0.4、(mysql-4.1.20,mysql-server-4.1.20)をインストールしました。 <?php $con = mysql_connect("localhost","taro","password") or die("接続出来ません"); print "接続しました"; mysql_close($con); ?> を実行すると、「接続しました」と出ます。ところが、 <HTML> <HEAD><TITLE>PHP test</TITLE></HEAD> <BODY> <?php require_once("DB.php"); $dbUser="taro"; $dbPass="password"; $dbHost="localhost"; $dbName="testdb"; $dbType="mysql"; $dsn="$dbType://$dbUser:$dbPass:@$dbHost/$dbName"; $conn = DB::connect($dsn); if(DB::isError($conn)){ die($conn->getMessage()); } print ('DBに接続しました'); $conn->disconnect(); ?> </BODY></HTML> を実行すると、DB Error: connect failed と出て、接続できません。 php.iniは、 include_path = ".:/usr/share/pear:/php/includes" としてあり、 [root@FC4 ~]# ls -l /usr/share/pear/ で調べても drwxr-xr-x 2 root root 4096 5月 27 18:06 DB -rw-r--r-- 1 root root 38937 11月 8 2005 DB.php となっています。 パスの切り方が間違っているでしょうか? どのようにすれば接続できるでしょうか?よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • PHPでMySQLのDBに接続

    PHP,MySQLが使えるレンタルサーバーを借りているのですが, PHPでMySQLに接続し、php_dbを選択をするようにしたいのですが、 この時DBファイルはどこに置けばいいのでしょうか? 現在はMySQLの管理コマンド(?)とは別にpublic_htmlの中に PHPフォルダを作り、そこにDBファイルを入れています。 PHPのスクリプトは <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>練習</title> <meta http-equiv="content-language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> </head><body> <?php $con = mysql_connect(); if (!$con) { echo ("Error:MySQLに接続できませんでした。<br />"); } else { echo ("接続ID=$con<br>\n"); } $selectdb = mysql_select_db("php_db" ,$con); if (!$selectdb) { echo ("Error:データベースを選択できませんでした"); } else { echo ("データベースphp_dbを選択しました。"); } ?> </body></html> としています。 MySQLには接続ができるのですが、php_dbには接続ができません。 php_dbのおき場所を変えるのか、ファイルの指定が間違っているのか その他、どの要に変更をしたらよいのでしょうか? お願いします。 環境はレンタルサーバーがLINUXでPHPのバージョンなどはわからないんです・・・!! 開発がOSがW2kでFTPで転送してます。

    • ベストアンサー
    • PHP
  • PEAR_DBをオフラインでインストールするには

    ネットに繋げないサーバにPEAR_DBをインストールする方法はありますか。 現在、PEARをインストール済みのサーバで「pear install DB」を打つと、 以下のメッセージが表示されます。 No releases available for package "pear.php.net/DB" Cannot initialize 'channel://pear.php.net/DB', invalid or missing package file Package "channel://pear.php.net/DB" is not valid install failed PHPは5.2.5です。

    • 締切済み
    • PHP
  • phpとデータベース

    書籍のサンプルを実行しても表示されません pearのインストールが怪しいですが、どこを直せばいいかわかりません。 ご教授お願いいたします。 <HTML> <HEAD> <TITLE>PHPのテスト</TITLE> </HEAD> <BODY> <?php require_once("DB.php"); $dbUser = "sample"; // ユーザー名 $dbPass = "password"; // パスワード $dbHost = "localhost"; // ホスト名 $dbName = "sampledb"; // データベース名 $dbType = "mysql"; // データベースの種類 // MySQL="mysql", PostgreSQL="pgsql", MS SQL-Server="mssql", ODBC="odbc" などを設定 // 接続文字列の作成 $dsn = "$dbType://$dbUser:$dbPass@$dbHost/$dbName"; // データベースに接続 $conn = DB::connect($dsn); // 接続に失敗したらメッセージを表示して終了します。 if (DB::isError($conn)){ die($conn->getMessage()); } print('接続に成功しました。'); // データベースから切断します。 $conn->disconnect(); ?> </BODY> </HTML>

  • 外部ファイルの読み込み

    HTMLにPHPの外部ファイルを読み込みたいと考えています。 <?php include ("1.php"); ?> <html> <head> <title></title> </head> <body> <div> <?php include ("2.php"); ?> </div> </body> </html> <?php include ("3.php"); ?> こんな感じで組み込むことって可能ですか? 外部ファイルなしで普通に1つにして読みこませると大丈夫なのですが、上記のように外部ファイルとして読み込ませると、表示されません。 <html>タグの外って、基本的にだめなんですか? 教えてください。

    • ベストアンサー
    • PHP
  • <select> の<option value>が指定していできません。

    はじめましてチャーシューと申します。 <HTML> <HEAD><TITLE>LOGIN PAGE</TITLE> <?php $db=mysql_connect("localhost","shisan","yu0414") or die("データベースへの接続に失敗しました。"); mysql_select_db("shisan",$db); $rs=mysql_query("SELECT userID,name FROM user order by userID",$db); ?> </HEAD> <BODY> <?php print("<SELECT>"); while($row=mysql_fetch_array($rs)){ print("<option>"); print($row['name']); print("</option>"); } print("</SELECT>"); mysql_free_result($rs); mysql_close($db); ?> </BODY> </HTML> を <HTML> <HEAD><TITLE>LOGIN PAGE</TITLE> <?php $db=mysql_connect("localhost","shisan","yu0414") or die("データベースへの接続に失敗しました。"); mysql_select_db("shisan",$db); $rs=mysql_query("SELECT userID,name FROM user order by userID",$db); ?> </HEAD> <BODY> <?php print("<SELECT>"); while($row=mysql_fetch_array($rs)){ print("<option value="$row['userID']">");←ここを追加しました。 print($row['name']); print("</option>"); } print("</SELECT>"); mysql_free_result($rs); mysql_close($db); ?> </BODY> </HTML> のように変更すると Parse error: syntax error, unexpected T_VARIABLE in C:\xampp\htdocs\shisan\login.php on line 14というエラーが起きてしまいます。 環境はWindowsXP professional apache,mysql,php5はxamppを使用しています。 ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • PHPとMySQLの文字化け

    DBを呼び出すPHPファイルを"Shift_JIS"で作りました。 ですが、レンタルサーバーのPHP、MySQLの文字コードが"EUC-JP"との事で、 全てのファイルに読込んでいるインクルードファイルの文字コードの記述をShift_JISからEUC-JPに変更しました。 ですが、DBから呼び出してるデータは文字化けしないのですが、その他がすべて文字化けしてしまい、JavaScriptも動かない状態です。 各phpのファイルは、最後に$body で書き出す記述をしているので、 $body = mb_convert_encoding($body,"SJIS","EUC-JP"); print $body; と実行してみてもだめでした。 どうか教えて下さい。よろしくお願い致します。 ---共通インクルードファイル---- 省略 //MySQL読み込み時の文字コードを設定 mysql_query("set names EUC-JP"); //データベースを選択します mysql_select_db($DBNAME,$db); function htmlheader($pagetitle) { //各ページのヘッダ部のHTMLを組み立てる $strret = "<DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'> <HTML> <HEAD> <META http-equiv='Content-Type' content='text/html; charset=EUC-JP'> <META http-equiv='Content-Style-Type' content='text/css'> <TITLE>$pagetitle </TITLE> </HEAD> <body border='0' cellpadding='0' cellspacing='0' width='100%'> <br>"; return $strret; } function htmlfooter() { //各ページのフッタ部のHTMLを組み立てる $strret = "<br> </BODY> </HTML>"; return $strret; } ?>

    • ベストアンサー
    • PHP
  • XserverでpearのDBでMySQLに接続

    xserver(レンタルサーバー)でPHPでpearのDBクラスを使ってMySQL(データベース)に接続ができません。 Xserver(レンタルサーバー)環境 MySQL5 バージョン:5.0.77 MySQL5 ホスト名:xxx.xserver.jp(仮名) PHP Version 5.3.3 include_path .:/usr/share/php53/pear :/usr/share/php Xserver PHP関連の仕様一覧 PEARインストール済み <インストール済みライブラリ> ・Archive_Tar ・Auth ・Console_Getopt ・DB ・HTML_Common ・HTML_QuickForm ・HTTP ・HTTP_Header ・HTTP_Download ・Mail ・Net_SMTP ・Net_Socket ・Pager ・PEAR ・XML_Parser ・XML_RPC ・Structures_Grap データベースは同じくXserverに設置されているphpmyadmin(MySQL5)で作成しました。 /xxx.xsrv.jp/public_html/php_sample/Section63 の中に(dbtest2.php) でおいています。 ★以下のコードで接続ができません。 どこが間違っているのか教えて下さい。 ↓ <?php require_once("DB.php"); $dbUser = "sample"; // ユーザー名(仮名) $dbPass = "password"; // パスワード(仮名) $dbHost = "xxx.xserver.jp"; // ホスト名(仮名) $dbName = "sampledb"; // データベース名(仮名) $dbType = "mysql"; // データベースの種類 $dsn = "$dbType://$dbUser:$dbPass@$dbHost/$dbName"; $conn = DB::connect($dsn); // 接続に失敗したらメッセージを表示して終了します。 if (DB::isError($conn)) { die($conn->getMessage()); } print('接続に成功しました。'); // データベースから切断します。 $conn->disconnect(); ?> ★ちなみにPHPのmysql_connect関数からは接続成功しました。 ↓ <?php $con = mysql_connect("xxx.xserver.jp", "sample", "password") or die("接続できません。"); print "接続に成功しました。"; mysql_close($con); ?>

    • ベストアンサー
    • PHP
  • SSI

    SSIを使用してHTMLファイルをインクルードする場合は、それぞれのHTMLファイルに宣言部分とか<head>~</head>は書くべきですかね? 書いた場合は、ブラウザからソースを見ると、宣言がいっぱいあったりしておかしな感じに・・・。 インクルードするファイルが、HTML~XHTMLなど様々であるならば、それぞれに宣言が必要な気はします。 ただ、インクルード前提でHTMLファイルが作られている場合は、宣言とかを書かずにいきなり<body>~</body>とかでもいい気がします。 そうすると、普通のソースみたいになりますし。 SSIってサーバ側で処理するものだから、ソースがサーバで生成されて、それがブラウザに送られるのかな? そうだとしたら、宣言はそれぞれにある必要はないですよね。 どうなんでしょうか?

    • ベストアンサー
    • HTML
  • 誰がDBに接続しているのか知りたい

    こんにちは、いつも参考にさせて頂いております。 SQL Server2008でDBを管理しているのですが、 かゆいところに手が届かない状況です。どうかお助けください。 [状況] 今管理しているDBは複数個あり、各DBに接続している人は複数います。 (といっても2ケタにも行きませんが。) そんな中、テーブルのプロパティなどを変更したいときに、 誰かが接続していると排他エラーが出て変更できないことがあります。 [疑問点] こういう時に、誰が接続しているのか知りたいのですが、 どうすればよいのでしょうか? 監視ツールなどが必要でしょうか。 もしくはシステムテーブルなどにその情報があるのでしょうか? どうかご教授よろしくお願いいたします。 [環境] SQL Server2008 Windows Server2008

専門家に質問してみよう