質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

5600閲覧

DB接続クラスを作ったところ速度が遅い

bws

総合スコア98

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2018/11/24 02:45

下のページを参考にDB接続するクラスを作成したのですが、クラスを使わず接続していた時に比べると、読み込みにとても時間がかかるようになってしまいました。(87ms→1.08s)

アドバイス、参考になるページなど教えて頂けませんでしょうか?よろしくお願いします。

モデルの作り込み
http://www.objective-php.net/mvc/model_ex

コード

イメージ説明

Base.php

PHP

1<?php 2 3class Base 4{ 5 private static $connectInfo; 6 public $dbh; 7 protected $name; 8 9 public function __construct() { 10 $this->dbConnect(); 11 } 12 13 public function dbConnect() { 14 $dsn = sprintf( 15 'mysql:host=%s;dbname=%s;port=3306', 16 self::$connectInfo['host'], 17 self::$connectInfo['dbname'] 18 ); 19 $this->dbh = new PDO($dsn, self::$connectInfo['dbuser'], self::$connectInfo['password']); 20 $this->dbh->query('SET NAMES utf8'); 21 } 22 23 public static function setConnectInfo($connectInfo) { 24 self::$connectInfo = $connectInfo; 25 } 26}

DB接続

php

1<?php 2 3require_once('../Base.php'); 4 5$connectInfo = array( 6 'host' => 'localhost', 7 'dbname' => 'db', 8 'dbuser' => 'root', 9 'password' => 'root' 10); 11 12Base::setConnectInfo($connectInfo); 13 14$base = new Base(); 15 16$dbh = $base->dbh;

以前のコード

イメージ説明

PHP

1function dbconnect() { 2 3 $dsn = 'mysql:dbname=db;host=localhost'; 4 $user = 'root'; 5 $password = 'root'; 6 7 try { 8 $dbh = new PDO($dsn, $user, $password,array(PDO::ATTR_PERSISTENT => TRUE )); 9 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 10 $dbh->exec('SET NAMES utf8'); 11 } catch (PDOException $e) { 12 die("データベース接続エラーです。:{$e->getMessage()}"); 13 } 14 15 return $dbh; 16}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/11/24 05:12

数百回実行した平均を比べられたほうが良いかと。数回遅くなることは端末の影響でないことはないです。
bws

2018/11/26 04:06

自分の検証不足でした。アドバイスありがとうございました。
guest

回答1

0

ベストアンサー

環境に依存する部分が多そうなので一般的に有効だと思われるアプローチの方法を回答します。

  1. 本当に遅くなっているのか何十回か試してみてください。どこかでキャッシュが効く設定になっていて新しい方が遅くなるということはありえます。
  2. クラスを外出しにした事が原因なのか、処理を加えたことが原因なのかを特定しましょう。(元の処理と比較して、処理やパラメータ自体が違うところがあると原因の絞り込みができません)
  3. 実際にどの辺で処理に時間がかかっているかをmicrotime()で通過箇所毎に出力して問題の場所を特定してみてください。

以下は勘です。
今回のケースだと接続パラメータが以前のケースと明らかに異なっているので、この辺りが怪しいんじゃないかと思います。
「以前コード」と同一の接続パラメータに修正してみて確認してみて下さい。

投稿2018/11/24 09:11

tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bws

2018/11/26 04:05

PDOのインスタンス作成時に PDO::ATTR_PERSISTENT => TRUE にしたところ、改善しました。 本当に遅くなっているか何度か試した結果、初期接続の時間はどちらの場合も1s程度かかっていました。 インスタンス作成時に接続を永続化していなかった為、毎回初期の接続と同じ時間がかかっていたのが原因だとわかりました。 とても勉強になりました。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問