日曜研究室 〜技術的な日常〜

技術的な観点から日常を綴ります

   1 月 08

XREAでEC CUBEを動作させるときにsafe_modeの制限を回避する方法

はっきり言ってXREAにもEC CUBEにもあまり関わりたくないのですが、そういう話が来てしまうので仕方ありません。 今回はEC CUBEパージョン1系の話です。 何も考えずにXREAにEC CUBEを載せた場合、Apacheモジュールとして動作するsafe_mode onのPHP上で動作することになります。 これで一見普通に動作するように見えるのですが、XREAではApacheモジュールのPHPによって生成されたファイルは所有者がapacheユーザとなる仕様となっており、さらにsafe_modeがonなのでそれらのファイルが既存のPHPのスクリプトから読み込めないという問題が起きます。 (safe_mode onではファイルの所有者(uidもしくはgid)が違うとオープンできない。) つまり、例えば管理画面のページ詳細設定からページを追加してもそのページが実際に表示できないということになります。 (バージョン2系は知りませんが、ページ詳細設定では実は追加だけでなく更新でも内部で一旦削除してから作成しなおしてるようで、更新だけでも同じ問題が発生します。) この問題をXREA上で回避するには、safe_modeがoffとなるCGIモードでPHPを動作させる方法があります。 なぜCGIモードではsafe_modeがoffになるかというと、XREAの場合はCGIモードのPHPはsuEXEC環境、つまりユーザ権限で動作するので、ファイルの読み書き権限をOS側で設定されたパーミッションにより判定できるからです。 逆にApacheモジュールモードでは全てのユーザーのスクリプトがapacheユーザ権限で動作してしまうために、apacheユーザからアクセスできるファイルにはどのユーザの物であろうとアクセス出来てしまうためにsafe_modeがonになっています。 ちょっと話がそれましたが、XREA上でCGIモードでPHPを動作させる方法はググればすぐ出てくるのですが、せっかくなので書いておきます。 XREAではドキュメントルートの.htaccessに以下の一行を記述するだけで配下の.phpファイルをCGIモードで動作させることが出来ます。 AddHandler application/x-httpd-phpcgi .php ディレクトリを分けてる場合はもちろんドキュメントルートじゃなく、適用したいディレクトリのトップに設置するだけでもOKです。 これによりPHPにより生成されたファイルにアクセスできない問題が解決するのですが他の問題が起きます。 XREAではCGIモードのPHPでは、magic_quotes_gpcがonになってしまうのです。.htaccessに「php_flag magic_quotes_gpc off」と書こうが反映されません。 EC CUBE側ではmagic_quotes_gpcの違いを吸収する作りにはなってないので、例えば管理画面のページ詳細設定からhtmlソースをPOSTしようとするとダブルクオーテーションがエスケープされて正常に表示されなくなったりします。 この問題を回避するには以下の一行を記述したphp.iniファイルを置いておけばいいのですが、 magic_quotes_gpc = off このphp.iniファイルはスクリプトが動作するディレクトリに置いておく必要があります。 EC CUBEで作ったサイトのURLを注意深く見た人なら分かると思いますが、EC CUBEはルートのindex.phpでディスパッチするような作りにはなっておらず、実に様々なディレクトリで動作するようになっています。 そう、必要なディレクトリ全てにphp.iniファイルを設置するのはすごく面倒なのです。 というか、どのディレクトリにphp.iniを設置すべきか否か洗い出すこと自体が面倒です。 そこでphp.iniが設置され過ぎてても問題ないだろうという考えから、全てのディレクトリに設置することにしました。 でまず、再帰的にディレクトリの一覧を作成する方法ですが、今回はこういう風にしました。 ls -R | grep / > directorylist.sh これでカレントディレクトリからサブディレクトリの中まで含めたディレクトリだけのリストが取得できます。 あとは生成したdirectorylist.shを編集して、ルートに作成しておいたphp.iniをcpコマンドで各ディレクトリにコピーするスクリプトを作成し実行するだけです。 一応今回作成したスクリプトがどんなものか頭の方だけ載せておきます。実際はこんな調子で250行以上になります。 秀丸で2回だけ置換して行頭を付け足して作成しました。所要時間約30秒。 #!/bin/bash cp ./php.ini ./abouts/php.ini cp [...]

Read the rest of this entry »

   8 月 13

サーバー移行後EC-CUBEで作ったサイトの表示がおかしい

社内サーバーでテスト中のEC-CUBEで作ったサイトの見た目が微妙におかしい。という連絡を受けまして色々調べました。 結果にたどり着くまでには色々と苦労があったのですが、要はdata/Smarty/template_cディレクトリに古いファイルが残ってたのが原因でした。ということでdata/Smarty/template_c配下をばっさりと消去して無事解決しました。 しかし、なぜtemplate_cに古いファイルが入ってたのか、移行前はそんな問題なかったのにと不思議に思い移行時の手順を思い出してみました。 破損ファイルが含まれているかもしれないディレクトリ全体をコピーしてくるよりはSubversionで管理されているファイルに関しては、ある程度の整合性は保障されてるかなと思い、まず、新しい環境で最新リビジョンをチェックアウトしてから、管理外のファイルだけをrsyncを駆使してコピーしました。 ここで気づきました。要はSubversionにtemplate_cの中の古いファイルがコミットされてたのです。つまりチェックアウト時に古いファイルが配置されてしまっていたのです。サーバー側のファイルはアップデートしかしませんから、リポジトリより実際のファイルが新しい分には問題が出なかったわけですね。 サーバー移行時にはキャッシュを消しましょうなんて常識的なことを忘れていたため、30分も無駄にしてしまいましたorz

Read the rest of this entry »

   6 月 26

EC-CUBEで商品編集時に編集できない項目がある

商品情報編集ページで編集できない項目がいくつかあるよとお客様から問合わせが。 実際に見てみると確かに、商品情報新規登録ページには存在する「商品コード、通常価格、販売価格、在庫数」の4つの項目が、商品情報編集ページには見当たりません。商品コードはともかく、他の数が後から変更できないのは痛すぎます。(EC-CUBEでは商品コードも主キーではなくただの文字列扱いだったはずで全部編集できてもいいはず。) ということでEC-CUBEのバグなのか仕様なのか調査してみましたが、どうも仕様みたい。 ソースを読んでみるとどうも「商品に規格が関連付けられている場合に4つの項目をを表示しない」ようになっている様子です。 ん?と思って、規格登録のページ(商品編集ページのリンクと並んで表示される「規格」のリンク先)をブラウザで見てみると、そこで4つの項目が規格ごとに編集できるようになってました。 そりゃそうですよね。同じ商品でも規格の違い、例えば、おまけの有る無しや、色違いなどで、在庫数や価格が違うのは当たり前ですからね。これを、色んな規格の数字を1つの数字の入力だけで編集なんて論理的に無理です。まぁ、無理すれば(=妙な仕様にすれば)やれますけどそれじゃあ使いづらいですからね。 ということで、商品編集で4つの項目が出ないのはバグではなく仕様でした。その4つの項目を編集するには、規格登録のページから規格ごとにやってくださいってことです。 この程度のことくらい把握しとけよ>自分

Read the rest of this entry »