「[EC-CUBE]売上集計をリアルタイムで行うとタイムアウトする」の編集履歴(バックアップ)一覧に戻る
管理画面>システム設定>パラメータ設定>DAILY_BATCH_MODE
- #!/usr/bin/env php
- <?php
- /**
- * デイリーバッチ起動スクリプト
- * @author y-nakajima
- */
-
- require_once(CLASS_EX_PATH . "util_extends/GC_Utils_Ex.php");
- require_once(CLASS_EX_PATH . "util_extends/SC_Utils_Ex.php");
- require_once(CLASS_EX_PATH . "db_extends/SC_DB_MasterData_Ex.php");
- require_once(CLASS_EX_PATH . "db_extends/SC_DB_DBFactory_Ex.php");
- require_once(CLASS_PATH . "SC_DBConn.php");
- require_once(CLASS_PATH . "SC_Query.php");
- require_once(CLASS_PATH . "SC_SelectSql.php");
-
- // アプリケーション初期化処理
- $objInit = new SC_Initial_Ex();
- $objInit->init();
-
- $usage = <<<USAGE
-
- php -f execute_batch_daily.php start term
- 集計期間を指定して売上集計します。
-
- start 集計開始日。何日前の売上から集計するか。1から365以内で指定。
- term 集計対象期間。何日分の売上を集計をするか。1から365以内で指定。
-
- 例:昨日の売上を集計します。
- php -f execute_batch_daily.php 1 1
-
-
- USAGE;
-
-
- if( $argc != 3){
- echo($usage);
- }
-
- $start = $argv[1];
- $term = $argv[2];
- echo($usage);
- }
-
-
- if( $start < 1 || $start > 365 || $term < 1 || $term > 365){
- echo($usage);
- }
-
- if($term > $start ){
- echo($usage);
- }
-
- $objBatch = new SC_Batch_Daily_Ex();
- $objBatch->lfStartDailyTotal( $term, $start, true);
-
- ?>
-
-
- /**
- * バッチ処理を実行する.
- *
- * @param mixed $argv コマンドライン引数
- * @return void
- */
- function execute($argv = "") {
- $term = 0;
- $start = 1; // 集計期間は、$start~$termの間となる。通常前日分から。
- $command = false;
-
- // 集計対象期間の取得(指定日分さかのぼる)
- if (SC_Utils_Ex::sfIsInt($argv[1]) && $argv[1] <= 365) {
- $term = $argv[1];
- $command = true;
- }
-
- // 集計開始日
- if (SC_Utils_Ex::sfIsInt($argv[2]) && $argv[2] <= 365) {
- $start = $argv[2];
- $command = true;
- }
-
- if($term > 0) {
- // 集計の開始
- $this->lfStartDailyTotal($term, $start, $command);
- }
- }
-
- // 集計の開始
- function lfStartDailyTotal($term, $start, $command = false) {
-
-
- // グラフ画像の削除
- $path = GRAPH_DIR . "*.png";
-
- // 削除された受注データの受注詳細情報の削除
- $objQuery = new SC_Query();
- /*
- EC-CUBE全体をgrepしてみたが、なぜ受注詳細情報だけを削除してしまうのか不明なので削除しないでおく。
- 商品別集計もdel_flg=0でキャンセルステータスではない注文から集計してるので影響はなさそう。
- $where = "order_id IN (SELECT order_id FROM dtb_order WHERE del_flg = 1)";
- $objQuery->delete("dtb_order_detail", $where);
- */
- // 最後に更新された日付を取得
-
- // 最後のバッチ実行からLOAD_BATCH_PASS秒経過していないと実行しない。
- if($pass < LOAD_BATCH_PASS) {
- // GC_Utils_Ex::gfPrintLog("LAST BATCH " . $arrRet[0]['create_date'] . " > " . $batch_pass . " -> EXIT BATCH $batch_date");
- GC_Utils_Ex::gfPrintLog("LAST BATCH " . $batch_last . " NEXT BATCH AFTER $batch_next -> EXIT BATCH");
- return;
- }
-
- // 集計
- // for ($i = $start; $i < $term; $i++) {
- for ($i = $start; $k = 0; $i--, $k++ ) {
- // 基本時間から$i日分さかのぼる
- $tmp_time = $now_time - ($i * 24 * 3600);
-
- GC_Utils_Ex::gfPrintLog("LOADING BATCH $batch_date");
-
- $this->lfBatOrderDaily($tmp_time);
- $this->lfBatOrderDailyHour($tmp_time);
- $this->lfBatOrderAge($tmp_time);
-
- // タイムアウトを防ぐ
- SC_Utils_Ex::sfFlush();
- }
- }
-
$ crontab -e 0 2 * * * /usr/local/bin/php -f /path/to/eccube/data/script/execute_batch_daily.php 1 1 2>&1 > /dev/null
- // リアルタイムで集計を実施する。集計が終了しているレコードは実施しない。
- /*
- $sdate:YYYY-MM-DD hh:mm:ss形式の日付
- $edate:YYYY-MM-DD hh:mm:ss形式の日付
- */
- function lfRealTimeDailyTotal($sdate, $edate) {
-
- for($i = 0; $i <= $loop; $i++) {
- $objQuery = new SC_Query();
- $arrRet = $objQuery->select("order_date, create_date", "dtb_bat_order_daily", "order_date = ?", array($batch_date));
- // すでにバッチ処理が終了しているかチェックする。
- if( $count > 0 ) {
- // オーダー開始日より一日以上後に集計されている場合は集計しなおさない
- continue;
- }
- }
- GC_Utils_Ex::gfPrintLog("LOADING BATCH $batch_date");
- $this->lfBatOrderDaily($tmp_time);
- $this->lfBatOrderDailyHour($tmp_time);
- $this->lfBatOrderAge($tmp_time);
-
- // タイムアウトを防ぐ 2009.05.01 追加
- SC_Utils_Ex::sfFlush();
- }
- }
-