EC-CUBE2.11.1でAPCの動作を確認してみる

ECCUBE

EC-CUBEはそれなりに負荷の高いアプリです
APCを使って少しでも負荷を下げたいところですが2.4.4の時はDB周りがAPCに対応できないと言う問題がありました

EC-CUBE2.11.1ではどうなったのか確かめてみたいと思います

PHP5.2.9+APC3.0.19の場合

だーいぶわかりにくいですがMDB2.phpとか含まれているので動いている模様

PHP5.3.6+APC3.1.6の場合

画面の一番下にf見慣れたFatal errorが
~~~
Fatal error: Class ‘MDB2’ not found in /var/www/apps/eccube-2.11.1/data/class/SC_Query.php on line 76

Call Stack:
0.0820 2554744 1. SC_Helper_Session>sfSessWrite() /var/www/apps/eccube-2.11.1/data/class/helper/SC_Helper_Session.php:0
0.0820 2555336 2. SC_Query>SC_Query() /var/www/apps/eccube-2.11.1/data/class/helper/SC_Helper_Session.php:85

Dump $_GET
$_GET[‘transactionid’] = ‘2da42b0d905ea0063638499b3be5cbf1cd29b3a2’
$_GET[‘product_id’] = ”
$_GET[‘category_id’] = ”
Dump $_POST
~~~

このエラーが出ているとなにが起きるかというと、SESSIONへの書き込みが出来ないのでカゴの中に商品が入らなくなってしまいます。

動作するように修正してみる

# vim data/class/pages/LC_Page.phpのfunction destroy() に1行足します
~~~
session_write_close();
~~~

すると、エラーが消えました(*´Д`*)
これコミットしておこうかな・・・

ちゃんとカゴにも商品が入るようにヽ(´ー`)ノ
なんでこれで直るのかはPHPのSESSIONの書き込みが変わったことが原因なのですが省略します

APCの管理画面にもMDB2.phpやSC_Helper_Session_Ex.phpが出ているのでちゃんと動いている模様

と、いうわけでEC-CUBE2.11.1でAPCは1行追加すれば問題なく動く、と思います

#2012/03/08追記

EC-CUBE2.11.5ではAPCをONにしていると管理画面が500エラーになり開けないことを確認しています
上記修正内容で問題なく動くことを確認していますがPHP5をお使いの場合

EC-CUBE2.11系のパフォーマンスを185%あげる4つの手法 | のぶろぐに書いた方法を利用しますとよりパフォーマンスがよくなります

SC_Helper_Session_Exに追記します
~~~
function __destruct() {
session_write_close();
}
~~~

コメント

  1. MAIMAX より:

    設定してみましたが、エラーが消えません。

    もしよろしかったら、場所が合っているか教えてください。

    function destroy() {
    // 一定時間以上かかったページの場合、ログ出力する。
    // エラー画面の表示では $this->timeStart が出力されない
    if (defined(‘PAGE_DISPLAY_TIME_LOG_MODE’) && PAGE_DISPLAY_TIME_LOG_MODE == true && isset($this->timeStart)) {
    $timeEnd = SC_Utils_Ex::sfMicrotimeFloat();
    $timeExecTime = $timeEnd – $this->timeStart;
    if (defined(‘PAGE_DISPLAY_TIME_LOG_MIN_EXEC_TIME’) && $timeExecTime >= (float)PAGE_DISPLAY_TIME_LOG_MIN_EXEC_TIME) {
    $logMsg = sprintf(“PAGE_DISPLAY_TIME_LOG [%.2fsec]”, $timeExecTime);
    GC_Utils_Ex::gfPrintLog($logMsg);
    session_write_close();

    }
    }

    }

  2. のぶ より:

    session_write_close();を書く場所が違うと思います

    function destroy() {
    // 一定時間以上かかったページの場合、ログ出力する。
    // エラー画面の表示では $this->timeStart が出力されない
    if (defined(‘PAGE_DISPLAY_TIME_LOG_MODE’) && PAGE_DISPLAY_TIME_LOG_MODE == true && isset($this->timeStart)) {
    $timeEnd = SC_Utils_Ex::sfMicrotimeFloat();
    $timeExecTime = $timeEnd – $this->timeStart;
    if (defined(‘PAGE_DISPLAY_TIME_LOG_MIN_EXEC_TIME’) && $timeExecTime >= (float)PAGE_DISPLAY_TIME_LOG_MIN_EXEC_TIME) {
    $logMsg = sprintf(“PAGE_DISPLAY_TIME_LOG [%.2fsec]“, $timeExecTime);
    GC_Utils_Ex::gfPrintLog($logMsg);

    }
    }
    session_write_close();// ←一番下に
    }

    ただし、この記事を書いた後にここだと少しパフォーマンスに問題が出るかもしれないなーと悩んでいたりもします

  3. MAIMAX より:

    お返事ありがとうございました。

    一番下に書いてみたところ、違うエラーは出ますが  システムエラーの表示はでなくなりました・

  4. MAIMAX より:

    こんなエラーです

    Fatal error: https://drsupple-usa.com/products/detail.php?product_id=11 SERVER_ADDR: 208.117.46.101 REMOTE_ADDR: 202.229.164.19 USER_AGENT: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2 SQL: PREPARE mdb2_statement_mysql_13c4709a22d9f0ee47868c3aa313304e1b76f1ffca FROM ‘SELECT category_id FROM dtb_product_categories WHERE product_id = ? ‘ PlaceHolder: array ( 0 => 11, ) MDB2 Error: unknown error _doQuery: [Error message: Could not execute statement] [Last executed query: EXECUTE mdb2_statement_mysql_13c4709a22d9f0ee47868c3aa313304e1b76f1ffca USING @0] [Native code: 1615] [Native message: Prepared statement needs to be re-prepared] /home/www/drsupple-usa.com/products/detail.php 34:LC_Page_Products_Detail_Ex->process /home/www/drsupple-usa.com/data/class_extends/page_extends/products/LC_Page_Products_Detail_Ex.php 56:LC_Page_Products_Detail->process /home/www/drsupple-usa.com/data/class/pages/products/LC_Page_Products_Detail.php 84:LC_Page_Products_Detail->actio in /home/www/drsupple-usa.com/data/class/SC_Query.php on line 909

  5. MAIMAX より:

    すみません。
    PHPなど全く分からなくて、、

    APCをOFFにするにはどのようにしたらよいのでしょうか。

    また、OFFにしたことで なにか 機能的に使えなくことはございますか。

    現在の APCの設定環境です。

    apc.cache_by_default On On
    apc.canonicalize On On
    apc.coredump_unmap Off Off
    apc.enable_cli Off Off
    apc.enabled On On
    apc.file_md5 Off Off
    apc.file_update_protection 2 2
    apc.filters no value no value
    apc.gc_ttl 3600 3600
    apc.include_once_override Off Off
    apc.lazy_classes Off Off
    apc.lazy_functions Off Off
    apc.max_file_size 1M 1M
    apc.mmap_file_mask no value no value
    apc.num_files_hint 1024 1024
    apc.preload_path no value no value
    apc.report_autofilter Off Off
    apc.rfc1867 Off Off
    apc.rfc1867_freq 0 0
    apc.rfc1867_name APC_UPLOAD_PROGRESS APC_UPLOAD_PROGRESS
    apc.rfc1867_prefix upload_ upload_
    apc.rfc1867_ttl 3600 3600
    apc.serializer default default
    apc.shm_segments 1 1
    apc.shm_size 8M 8M
    apc.slam_defense On On
    apc.stat On On
    apc.stat_ctime Off Off
    apc.ttl 0 0
    apc.use_request_time On On
    apc.user_entries_hint 4096 4096
    apc.user_ttl 7200 7200
    apc.write_lock On On

  6. MAIMAX より:

    すみません。
    apcモードOFFにしたのですが、エラーは変わりませんでした。

    • のぶ より:

      なるほど、APCがらみのエラーではないみたいですね。
      なにかカテゴリーのカスタマイズなどしていればそこが原因かもしれません

      これ以上はソースをひととおり眺めないと解決できそうにありません;

  7. MAIMAX より:

    ありがとうございます。

    カテゴリーのカスタマイズしてます。

    それが原因なのかもですねぇ、、

タイトルとURLをコピーしました