ホームページ  >  記事  >  バックエンド開発  >  PHP PDOの問題

PHP PDOの問題

WBOY
WBOYオリジナル
2016-06-23 14:12:041011ブラウズ

<?phpabstract class AbstractDB {    private $m_pdo;    public  $m_stmt;    private static $empty_array = array();    public function open(){        try {            $this->m_pdo = new PDO('mysql:host=127.0.0.1;dbname=MYDB', 'root', '123456', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8';"));            return true;        }        catch (PDOException $e){            return false;        }    }    public function close(){        $this->m_stmt = null;        $this->m_pdo = null;    }    public function prepare_statement($prepare_statement_text){        if (empty($this->m_pdo))            return;        if(!empty($this->m_stmt)){            $this->m_stmt->closeCursor();        }        $this->m_stmt = $this->m_pdo->prepare($prepare_statement_text);    }    public function set_param($param_name, $param_value){        if (empty($this->m_stmt))            return;        $this->m_stmt->bindParam($param_name, $param_value);    }    public function execute_single_row(){        if (empty($this->m_stmt))            return self::$empty_array;        if (!$this->m_stmt->execute()){            return self::$empty_array;        }        return  $this->m_stmt->fetch(PDO::FETCH_ASSOC);    }    public function execute_rows(){        if (empty($this->m_stmt))            return self::$empty_array;        if (!$this->m_stmt->execute())        {            $error = $this->m_stmt->errorInfo();            return self::$empty_array;        }        $this->m_stmt->setFetchMode(PDO::FETCH_ASSOC);        return $this->m_stmt->fetchALL();    }}class TCategoryAttrDB extends AbstractDB{    public function  get_category_attr_list($arr_params){        $sql = 'select category_id,category_name,attrib_name,attrib_content from cat_attrib where category_id = :category_id and  is_delete = 0';        $this->prepare_statement($sql);        $this->set_param(':category_id', $arr_params['category_id']);        return $this->execute_rows();    }    public function getCategoryIdFromTCategory($arr_params) {        $sql = 'SELECT category_id FROM `t_category` where category_name = :category_name and is_delete = 0            and parent_id = (SELECT category_id from t_category WHERE category_name = :parent_category_name and is_delete = 0);';        $this->prepare_statement($sql);        $this->set_param(':parent_category_name', $arr_params['parent_category_name']);        $this->set_param(':category_name', $arr_params['category_name']);        return $this->execute_single_row();    }}$t_db = new TCategoryAttrDB();$arr_params = array('parent_category_name' => 'XXXX', 'category_name' => 'YYY');if($t_db->open()){    $category = $t_db->getCategoryIdFromTCategory($arr_params);    $result = $t_db->get_category_attr_list($category);}?>


私の開発マシンでは、2 番目の SQL の prepare() メソッドが実行されると、errorInfo によって出力される情報は次のとおりです。他のバッファリングされていないクエリがアクティブなときにクエリを実行します。PDOStatement::fetchAll() の使用を検討してください。あるいは、コードが mysql に対してのみ実行される場合は、PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性を設定してクエリ バッファリングを有効にすることもできます。コードは本番環境にあります。環境に問題はありません。開発マシンで問題を解決するために次の方法を試しましたが、成功しました。
//(1)在PDO初始化时候设置MYSQL_ATTR_USE_BUFFERED_QUERY属性,PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>1//(2)在prepare_statement函数中添加下面代码,就是在prepare前执行closeCursor()if(!empty($this->m_stmt)){    $this->m_stmt->closeCursor();}

ここで、いくつか質問したいことがあります。
1. 私の PHP バージョンは 5.2.10、本番環境です。PHP バージョンは 5.3.11 ですが、この一貫性のない結果の原因は何ですか?
2.PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (MySQL で利用可能) ) これはドキュメント内の属性の説明ですが、キャッシュされたクエリとは何か、キャッシュされたオブジェクトとは何か、使用されるメモリの量、および占有サイズとの関係はまだよくわかりません。 3. PDOStatement::closeCursor を追加するとパフォーマンスにどの程度の影響がありますか (同時実行性が高い場合)
PDO は単一ユーザーになるように設計されており、各クエリの後にデータを読み取って再利用する必要があります


結局のところ、PDO はますます完璧になっています。シングル ユーザー モードでは、各クエリの後にデータを読み取ってからオブジェクトを再利用する必要があります。つまり、バージョン 5.3 以降では、closeCursor なしでステートメントを再利用できるということですか。 .11 なのに、なぜ開発環境はまだ 5.2.10 なのでしょうか?

これでは php5.3 は php5.2 より 5 倍、php5.4 は php5.3 より 10 倍高速に利用できませんか?

はい!

実稼働環境はすでに 5.3.11 ですが、開発環境はなぜまだ 5.2.10 なのでしょうか?

php5.3を活用できないでしょうか? (少なくとも php5.3 は php5.2 より 5 倍、php5.4 は php5.3 より 10 倍高速です)

プロジェクトは新しく引き継がれ、元のプロジェクトは常に 5.2.10 でした。開発マシンを変更したくない~~
質問 2 と 3 に答えられますか?

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。