ECCUBE

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

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();
}
~~~

の

のぶダイバー、写真を撮る人、EC-CUBE の開発者。世界のウミウシ、かさね日記、きれるまえ を作っています。詳しく

コメント(10)

MAIMAX2011-12-14

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

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

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();

}
}

}

のぶ2011-12-15

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();// ←一番下に
}

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

MAIMAX2011-12-15

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

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

のぶ2011-12-15

ちなみにどんなエラーが出ていますか?

MAIMAX2011-12-16

こんなエラーです

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

のぶ2011-12-17

SQLのエラーが出ていますね・・・これはAPCをoffにすると出ないのでしょうか?

MAIMAX2011-12-18

すみません。
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

MAIMAX2011-12-18

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

のぶ2011-12-19

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

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

MAIMAX2011-12-19

ありがとうございます。

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

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