Shin x blog Shin x blog
Search
CakePHP パフォーマンスが出ない時は、例えばフレームワークを避ける
この記事の所要時間: 331

フレームワークを使ってパフォーマンスに問題があったため、Plain PHPで書き直したという話です。

先日受信したメールの内容を.forward経由でDBを保存するという処理を実装しました。まあ良くある処理なのですが、このシステムではWeb側をCakePHPで実装していたので、メール処理もCakePHPのCLI機能(cakeコマンド)を利用しました。

実際に動作してみて数件程度では問題無かったのですが、負荷試験として短時間に数百件、数千件のメールを受信させると、LAが80程度まで跳ね上がりました。処理自体を見直したり、不要なSQLをカットしたりしたのですが、それほど大きな効果はありませんでした。

これはフレームワークの起動に時間がかかっていると判断し、CakePHPを使わずベタなPHPスクリプトだけで実装してテストすると、同じ負荷をかけてもLAが3-4程度まで落ちました。

timeコマンドで実行時間を計測しても、3-4倍の差がありました。(もちろんPHPスクリプトだけの方が早い)

CODE:
  1. $ time hoge.php

実はこういった場面はこれまでも経験していて、Web側では負荷が高い箇所やパフォーマンスが出ない箇所ではフレームワークを使わずに実装することがありました。CakePHPにCLI対応が含まれているとはいえ、CLI環境においてもパフォーマンスが出ないシーンでは、あえてフレームワークを使わないという選択肢は覚えておく必要があります。

ただこういったケースがあるからといって、どんなケースでもフレームワークを全く使わないというのは賢明ではありません。

フレームワークで構築することには多くの利点があり、ある程度習得しているフレームワークであれば、PHPスクリプトだけで開発するよりも生産性や安定性等々で有利です。フレームワーク上で十分に性能が出ている場合はそのままで何ら問題ないです。

このあたりのバランスを保つのが大事なのですが、まずはフレームワークで構築しておいて、問題がある箇所を崩していくというアプローチが単純で良いかと。

今回の場合、フレームワーク上で実装していたものをPHPスクリプトで再実装したので、同じ機能をアプローチを実装しただけなので、短時間で再実装することができました。プロトタイプ的にフレームワークで組むというのも良いかもしれません。

CakePHPのDB設定を参照する

これに関連してミニTipsを。

フレームワーク無しで実装する際でもせめてDBの接続情報くらいは共有しておきたいものです。そこで今回はPHPスクリプトから[app/config/database.php]を参照するようにしました。

app/config/database.phpの情報からDBに接続する。

PHP:
  1. require_once('/path/to/cake/app/config/database.php');
  2.  
  3.    public function connect() {
  4.      $db = new DATABASE_CONFIG();
  5.      $dsn = sprintf("dbname=%s user=%s password=%s"
  6.                  , $db->default['database'], $db->default['login'], $db->default['password']);
  7.      if ($db->default['host']) {
  8.        $dsn .= sprintf("host=%s port=%d", $db->default['host'], $db->default['port']);
  9.  
  10.      }
  11.      $this->conn = @pg_connect($dsn);
  12.      if (!$this->conn) {
  13.        $this->log(__FILE__ . ':' . __LINE__ . ' ' . $dsn);
  14.        exit;
  15.      }
  16.    }

arrow2 Responses

  1. 45 mos ago

    最近自分の周りでも「CakePHPは重い」と言われていました(個人的にはCakePHPが好きなので開発の規模が合えば必ず使っています)。

    重い理由は、主にO/Rマッパー周りだと思っていたのですが、「フレームワークの起動」という考えはなかったです。
    その上で上記エントリーのTipsは非常に参考になりました。

  2. 45 mos ago

    k1LoWさん:
    汎用フレームワーク(CakePHPに限らず)はPlainなPHPに比べるとどうしてもオーバーヘッドがありますね。
    フレームワークも「手段」でしかないので、k1LoWさんが書かれているようにケースバイケースで使うのが良いですね。:-)