バージョン選択

フォーラム

メニュー

オンライン状況

41 人のユーザが現在オンラインです。 (30 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 41
もっと...

サイト内検索

質問 > 管理機能 > 郵便番号DB登録の不具合?

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ramrun
投稿日時: 2009/6/14 14:21
対応状況: −−−
仙人
登録日: 2006/11/3
居住地:
投稿: 789
Re: 郵便番号DB登録の不具合?
webサーバのタイムアウトって無応答の時間だと思うのですが、順次flushしているかぎり発生しないのでは?

xreaで試した感じでは処理時間が2秒〜7分ぐらいで止まるのを確認しました。
調子がよければ最後まで行くのかもしれませんが、あまり連発しているとxreaを追い出されそうなので(笑)。
コードは以前のものと、チェンジセットのもの両方で試してみて同じような状態です。

ちなみに以前のコードでは登録済みレコードをwhileで読み飛ばしてその分imgを出力しますが、その途中で止まることもあります。
要するにDBは関係ないみたい。

xreaの共有SSL(squid)をやめてhttpで管理画面より確認しても同じような状態。
要するに共有SSLやプロキシも関係ないみたい。

PHPをapacheのモジュール(safe_mode on)で確認しても同じ。
※ただしこの場合は5分を超えるとmax_execution_timeがきちんと出る。
要するにモジュール版かCGI版かも関係ないみたい。

ためしにwhileの処理をtry catchしても捕まらず。

やはりdestroyは呼ばれておらず。
プロセスが強制的に終了させられている感じ。

負荷が関係するのかとwhile内にsleepを入れてみても変化なし。

xreaではapacheなどのログは見れないのでお手上げです(汗)。
見れても共有だから環境をいじれないけど...

とりあえず以前のコードにmbの関数をいれて、while内でbeginして、imgの出力時にcommitすれば中途半端なinsertはされないかと思います。
seasoft
投稿日時: 2009/6/14 16:09
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7367
Re: 郵便番号DB登録の不具合?
> webサーバのタイムアウトって無応答の時間だと思うのですが、順次flushしているかぎり発生しないのでは?

WEB サーバに依存しますが、1レスポンスの経過時間で落とすことが可能だったと思います。

WEB サーバを FTP のような利用をするときに、障害になるケースがあったと思います。

典型的なのは、300秒や600秒で落ちるケースが結構あったと思います。


いずれにしても、現状のメニューをクリックすると勝手に処理が始まるという動作もどうかなと思っていまして、もう少し改善をしようかなと思っていますので、そのときにはWEBサーバのタイムアウトも考慮しようと考えています。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

ramrun
投稿日時: 2009/6/14 21:22
対応状況: −−−
仙人
登録日: 2006/11/3
居住地:
投稿: 789
Re: 郵便番号DB登録の不具合?
とりあえず以前の追記と組み合わせてみました。
途中で止まった際はもう一度実行すれば続きからになります。

LC_Page_Admin_Basis_ZipInstall.php
<?php
/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
 *
 * http://www.lockon.co.jp/
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

// {{{ requires
require_once(CLASS_PATH . "pages/LC_Page.php");

/** CSV ファイルの最大行数 */
define("ZIP_CSV_LINE_MAX", 8192);

/** 画像の表示数量 */
define("IMAGE_MAX", 680);

/** 郵便番号CSV ファイルのパス */
define("ZIP_CSV_FILE_PATH", DATA_PATH . "downloads/KEN_ALL.CSV");

/**
 * 郵便番号DB登録 のページクラス.
 *
 * @package Page
 * @author LOCKON CO.,LTD.
 * @version $Id:LC_Page_Admin_Basis_ZipInstall.php 16741 2007-11-08 00:43:24Z adachi $
 */
class LC_Page_Admin_Basis_ZipInstall extends LC_Page {

    // }}}
    // {{{ functions

    /**
     * Page を初期化する.
     *
     * @return void
     */
    function init() {
        parent::init();
    }

    /**
     * Page のプロセス.
     *
     * @return void
     */
    function process() {
        $objQuery = new SC_Query();
        $objSess = new SC_Session();

        // 認証可否の判定
        SC_Utils_Ex::sfIsSuccess($objSess);

        $fp = fopen(ZIP_CSV_FILE_PATH, "r");
        $img_path = USER_URL . "packages/" . TEMPLATE_NAME . "/img/";

        echo ('<html>');
        echo ('<body bgcolor="#494E5F">');
        // 一部のIEは256バイト以上受け取ってから表示を開始する。
        SC_Utils_Ex::sfFlush(true);

#('http://www.post.japanpost.jp/zipcode/dl/kogaki/lzh/ken_all.lzh')
        if(!$fp) {
            SC_Utils_Ex::sfErrorHeader(">> " . ZIP_CSV_FILE_PATH . "の取得に失敗しました。");
        } else {
            print("<img src='". $img_path . "install/main_w.jpg'><br>");
            SC_Utils_Ex::sfFlush();

            // CSVの件数を数える
            $line = 0;
            while(!feof($fp)) {
                fgets($fp, ZIP_CSV_LINE_MAX);
                $line++;
            }

            print("<img src='". $img_path ."install/space_w.gif'>");
            SC_Utils_Ex::sfFlush();

            // ファイルポインタを戻す
            fseek($fp, 0);

            // 画像を一個表示する件数を求める。
            $disp_line = intval($line / IMAGE_MAX);

            $end_cnt = $objQuery->count('mtb_zip');
            $begin = false;
            $cnt = 1;
            $img_cnt = 0;
            while (!feof($fp)) {
                if ($cnt > $end_cnt) {
                    if (!$begin) {
                        $objQuery->begin();
                        $begin = true;
                    }
                    $arrCSV = fgetcsv($fp, ZIP_CSV_LINE_MAX);
                    // $sqlval['code'] = $arrCSV[0];
                    // $sqlval['old_zipcode'] = $arrCSV[1];
                    $sqlval['zipcode'] = $arrCSV[2];
                    // $sqlval['state_kana'] = $arrCSV[3];
                    // $sqlval['city_kana'] = $arrCSV[4];
                    // $sqlval['town_kana'] = $arrCSV[5];
                    $sqlval['state'] = mb_convert_encoding($arrCSV[6], CHAR_CODE, 'sjis-win');
                    $sqlval['city'] = mb_convert_encoding($arrCSV[7], CHAR_CODE, 'sjis-win');
                    $sqlval['town'] = mb_convert_encoding($arrCSV[8], CHAR_CODE, 'sjis-win');
                    // $sqlval['flg1'] = $arrCSV[9];
                    // $sqlval['flg2'] = $arrCSV[10];
                    // $sqlval['flg3'] = $arrCSV[11];
                    // $sqlval['flg4'] = $arrCSV[12];
                    // $sqlval['flg5'] = $arrCSV[13];
                    // $sqlval['flg6'] = $arrCSV[14];
                    $objQuery->insert("mtb_zip", $sqlval);
                }
                $cnt++;
                // $disp_line件ごとに進捗表示する
                if($cnt % $disp_line == 0 && $img_cnt < IMAGE_MAX) {
                    print("<img src='". $img_path ."install/graph_1_w.gif'>");
                    $objQuery->commit();
                    $begin = false;
                    SC_Utils_Ex::sfFlush();
                    $img_cnt++;
                }
                // 暴走スレッドが残留する確率を軽減したタイムアウト防止のロジック
                // TODO 動作が安定していれば、SC_Utils 辺りに移動したい。
                if (!get_cfg_var('safe_mode')) {
                    // タイムアウトをリセット
                    set_time_limit((int)get_cfg_var('max_execution_time'));
                }
            }
            fclose($fp);

            print("<img src='". $img_path ."install/space_w.gif'><br>\n");
            print("<table width='700' height='50' border='0' cellpadding='0' cellspacing='0'>\n");
            print("<tr>\n");
            print("<td align='center'><a href='java script:window.close()'><img src='". $img_path ."install/close.gif' alt='CLOSE' width='85' height='22' border='0' /></a></td>\n");
            print("</tr>\n");
            print("</table>\n");
        }
    }

    /**
     * デストラクタ.
     *
     * @return void
     */
    function destroy() {
        parent::destroy();
    }
}
?>
kokoko
投稿日時: 2009/6/15 18:26
対応状況: −−−
半人前
登録日: 2009/6/4
居住地:
投稿: 18
Re: 郵便番号DB登録の不具合?
沢山のご返信ありがとうございます(^^
シックスコアの一発インストールで使われていた下記のデータと入れ替えれば登録できました(^-^



{zip_install.php}
/**************************************/

// {{{ requires
require_once("../require.php");
require_once(CLASS_EX_PATH . "page_extends/admin/basis/LC_Page_Admin_Basis_ZipInstall_Ex.php");

ini_set("max_execution_time", 600);

// }}}
// {{{ generate page

$objPage = new LC_Page_Admin_Basis_ZipInstall_Ex();
register_shutdown_function(array($objPage, "destroy"));
$objPage->init();
$objPage->process();


/**************************************/
{LC_Page_Admin_Basis_ZipInstall.php}



// {{{ requires
require_once(CLASS_PATH . "pages/LC_Page.php");

/** CSV ファイルの最大行数 */
define("ZIP_CSV_LINE_MAX", 8192);

/** 画像の表示個数 */
define("IMAGE_MAX", 680);

/** 郵便番号CSV ファイルのパス */
define("ZIP_CSV_FILE_PATH", DATA_PATH . "downloads/KEN_ALL.CSV");

/**
* 郵便番号DB登録 のページクラス.
*
* @package Page
* @author LOCKON CO.,LTD.
* @version $Id:LC_Page_Admin_Basis_ZipInstall.php 16741 2007-11-08 00:43:24Z adachi $
*/
class LC_Page_Admin_Basis_ZipInstall extends LC_Page {

// }}}
// {{{ functions

/**
* Page を初期化する.
*
* @return void
*/
function init() {
parent::init();
}

/**
* Page のプロセス.
*
* @return void
*/
function process() {
$objQuery = new SC_Query();
$objSess = new SC_Session();

// 認証可否の判定
SC_Utils_Ex::sfIsSuccess($objSess);

$fp = fopen(ZIP_CSV_FILE_PATH, "r");
$img_path = USER_URL . "packages/" . TEMPLATE_NAME . "/img/";

// 一部のIEは256バイト以上受け取ってから表示を開始する。
for($i = 0; $i < 256; $i++) {
print(" ");
}
print("\n");
$this->myFlush();

if(!$fp) {
SC_Utils_Ex::sfErrorHeader(">> " . ZIP_CSV_FILE_PATH . "の取得に失敗しました。");
} else {
print("<img src='". $img_path . "install/main_w.jpg'><br>");
$this->myFlush();

// CSVの件数を数える
$line = 0;
while(!feof($fp)) {
fgets($fp, ZIP_CSV_LINE_MAX);
$line++;
}

print("<img src='". $img_path ."install/space_w.gif'>");
$this->myFlush();

// ファイルポインタを戻す
fseek($fp, 0);

// 画像を一個表示する件数を求める。
$disp_line = intval($line / IMAGE_MAX);

// 既に書き込まれたデータを数える
$end_cnt = $objQuery->count("mtb_zip");
$cnt = 1;
$img_cnt = 0;
while (!feof($fp)) {
$arrCSV = fgetcsv($fp, ZIP_CSV_LINE_MAX);

// すでに書き込まれたデータを飛ばす。
if($cnt > $end_cnt) {
$sqlval['code'] = $arrCSV[0];
$sqlval['old_zipcode'] = $arrCSV[1];
$sqlval['zipcode'] = $arrCSV[2];
$sqlval['state_kana'] = $arrCSV[3];
$sqlval['city_kana'] = $arrCSV[4];
$sqlval['town_kana'] = $arrCSV[5];
$sqlval['state'] = $arrCSV[6];
$sqlval['city'] = $arrCSV[7];
$sqlval['town'] = $arrCSV[8];
$sqlval['flg1'] = $arrCSV[9];
$sqlval['flg2'] = $arrCSV[10];
$sqlval['flg3'] = $arrCSV[11];
$sqlval['flg4'] = $arrCSV[12];
$sqlval['flg5'] = $arrCSV[13];
$sqlval['flg6'] = $arrCSV[14];
$objQuery->insert("mtb_zip", $sqlval);
}

$cnt++;
// $disp_line件ごとに進捗表示する
if($cnt % $disp_line == 0 && $img_cnt < IMAGE_MAX) {
print("<img src='". $img_path ."install/graph_1_w.gif'>");
$this->myFlush();
$img_cnt++;
}
}
fclose($fp);

print("<img src='". $img_path ."install/space_w.gif'><br>\n");
print("<table width='700' height='50' border='0' cellpadding='0' cellspacing='0' bgcolor='#494E5F'>\n");
print("<tr>\n");
print("<td align='center'><a href='java script:window.close()'><img src='". $img_path ."install/close.gif' alt='CLOSE' width='85' height='22' border='0' /></a></td>\n");
print("</tr>\n");
print("</table>\n");
}
}

/**
* デストラクタ.
*
* @return void
*/
function destroy() {
parent::destroy();
}

/**
* 出力バッファをフラッシュし, バッファリングを開始する.
*
* @return void
*/
function myFlush() {
flush();
ob_end_flush();
ob_start();
}
}
ramrun
投稿日時: 2009/6/15 22:52
対応状況: −−−
仙人
登録日: 2006/11/3
居住地:
投稿: 789
Re: 郵便番号DB登録の不具合?
ini_setでmax_execution_timeを伸ばして対応できたようですが、文字コードのほうは大丈夫だったのかな?

xreaのほうですが、

XREA&CORE SUPPORT BOARD:sendmailで複数送信は不可?
http://sb.xrea.com/showthread.php?t=965

によるとやはりKILLされるみたいです。
時間が一定ではなく7分いけたのもあったので、共有サーバ全体としての負荷をみているのかもしれませんが、詳細は不明です。

それにしてもメルマガ禁止だったとは(汗)。


表の XREA FAQ(よくある質問) には
http://www.xrea.com/?action=faq#7

引用:
CGIなどから利用するメール機能「Sendmail」は使用できます。ただし、匿名メールや、広告メールは一切禁止です。不特定多数が使用する方法も禁止しています。
となっています。

xrea+でec-cubeを考えている人は注意しましょう。
kokoko
投稿日時: 2009/6/16 0:54
対応状況: −−−
半人前
登録日: 2009/6/4
居住地:
投稿: 18
Re: 郵便番号DB登録の不具合?
ramrun様>

シックスコアの方では今のところ上記の手法で問題なく登録できました。

サーバのシステムによっても色々設定が変わるみたいで私のような素人にはなかなか初期設定が大変なものですね(−−:
seasoft
投稿日時: 2009/9/24 21:54
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7367
Re: 郵便番号DB登録の不具合?
引用:

当該リビジョンに関して、把握している問題点として、(PHP ではなく)WEB サーバのタイムアウトに到達するまでに処理を終えないとロールバックされるというものがあります。


http://svn.ec-cube.net/open_trac/changeset/18317 にて、タイムアウトする環境にも対応できるように改修してみました。

今晩のナイトリービルドから、取り込まれる予定です。

実際にタイムアウトする環境でのテストを行なっていませんので、環境がある方は、お試しいただき結果を教えていただけると助かります m(__)m


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

« 1 (2)
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は89,150名です
総投稿数は110,046件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1650
8
red
1570
9
mcontact
1299
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.