Magentoストアをデバッグするための基礎


81

Magentoストアをデバッグするにはどうすればよいですか

これは今ではあまり関係のない質問ですが、5年前にMagento SEサイトが存在していた場合、おそらく最初の質問だったでしょう。Magentoを使い始めたばかりの人や、Magentoに慣れていない人にとっては、デバッグの基本を知ることが、問題の原因を除外するための鍵となります。そして、私たちとは無関係であるにもかかわらず、私たちはこの質問を自己回答のアプローチで先取りしています。

私のサイトがダウンしている助けて!

  1. 私の設計に問題はありますか?
  2. サードパーティのモジュールに障害がありますか?
  3. エラーが表示されないのはなぜですか?

これらの質問のそれぞれは、最も基本的なユーザーでも完了できるデバッグへの標準化されたアプローチに従うことにより、容易に回答できます。Magentoストアのデバッグの基本を排除するプロセスによって。


5
優れたデバッガーとインテリジェンスを使用してください...
SylvainRayé13年

4
これは深刻な質問ですか?
-davidalger

5
いいえ、このベータ版でボールを転がすのを助けるために、意図的に自己回答した質問です。スタック交換は、自己回答の質問を許可するだけでなく、blog.stackoverflow.com/2012/05/encyclopedia-stack-exchangeを積極的に奨励します。この質問はキックがデバッグプロセスを開始するに役立つ新しい/経験の浅いユーザーを対象にしてい@sylvain
ベンLessani - Sonassi

@sonassi私は投票しなかったので、あなたはあなたの質問をより明確な方法でリファクタリングしました。おそらく私はそれを手伝うことができました:) SEがQ&Aであるだけでなく、知っているのは良いことだとは知りませんでした。メイントピックについて、ここでの答えは、可能な限り深い問題のほとんどの表面にすぎません。デバッガーを使用して、Magentoのインターンディスパッチプロセスの動作を最初に理解すると言う理由です。それが私の5セントです。税計算、配送方法、ブロック生成などの問題を解決する方法:デバッグ!また、インターンプロセスの学習にも役立ちます。
シルヴァンレイ

2
わかった。私が助けようとしたのは、より根本的な致命的なエラーです。明らかに、問題の範囲は広すぎて、単一のソリューションでは答えられません。癖/小さなバグはデバッグによって診断されますが、致命的なエラーの場合は、以下のように、それほど繊細ではないアプローチが必要です。そして、はい、私は質問を微調整しました:)
ベンレサニ-ソナシ

回答:


98

デバッグはちょっとした技術ですが、簡単な方法で簡単に習得できます。

最終的に解決策に達するまで、各ポイントに従ってください。


PHPエラーを有効にする

これはほとんどの問題の鍵です。セキュリティまたはその他の理由により、PHPエラー表示は、PHP設定によりデフォルトで無効になっている可能性があります。

より永続的な解決策、または単により一時的なものでエラーを有効にできます。

永続的なソリューション

Apache / mod_phpユーザーの場合

ドキュメントルートの.htaccessファイルに-これを一番上にドロップしてください。

php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
php_flag  log_errors on
php_value error_log  /home/path/public_html/var/log/system.log

Nginx / FastCGIユーザーの場合

Nginx仮想ホストの設定、最終的なlocation .php {ディレクティブ、またはfastcgi_paramsファイル(指定されている場合)

fastcgi_param PHP_VALUE  display_startup_errors=on;
fastcgi_param PHP_VALUE  display_errors=on;
fastcgi_param PHP_VALUE  html_errors=on;
fastcgi_param PHP_VALUE  log_errors=on;
fastcgi_param PHP_VALUE  error_log=/home/path/public_html/var/log/system.log;

一時的/普遍的なソリューション

あらゆるプラットフォーム向け

index.phpドキュメントルートでMagentoブートストラップを編集し、次の行のコメントを解除します。

#ini_set('display_errors', 1);

開発者モードを有効にする

エラーが発生し、突然「エラーレポート」ページにアクセスし、一見役に立たないようなエラー文字列が表示された1184257287824場合-いくつかのオプションがあります。

永続的なソリューション

Apache / mod_phpユーザーの場合

ドキュメントのルート.htaccessファイルで、これを一番上にドロップします。

SetEnv MAGE_IS_DEVELOPER_MODE true

Nginx / fastcgiユーザーの場合

Nginx仮想ホストの設定、最終的なlocation .php {ディレクティブ、またはfastcgi_paramsファイル(指定されている場合)

fastcgi_param MAGE_IS_DEVELOPER_MODE true;

一時的/普遍的なソリューション

index.phpドキュメントルートでMagentoブートストラップを編集し、ifステートメントを常にtrueにするか、特定のIPに対して有効にします。

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) || true) {
  Mage::setIsDeveloperMode(true);
}

または

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) || $_SERVER['REMOTE_ADDR'] == 'my.ip.add.ress') {
  Mage::setIsDeveloperMode(true);
}

許可を確認してください

不正なアクセス許可は多くの問題を引き起こしますが、その多くは一見簡単に見つけることはできません。

例えば。
PHPが./mediaディレクトリに書き込めず、JSコンバインが有効になっている場合-Magentoは、メディアの結合ファイルと関連する一意のURIを生成できません。その代わり、ブラウザのソースコードにあるのは、メディアファイルへの完全なサーバーパスです。 /home/path/public_html/media/xxx

それ以外の場合、サイトは正常に機能しているように見える場合があり、重大なエラーは実際には表示されません。

この方法は専用ホスティングでは安全ですが、Apacheプロセスがユーザーごとにchrootされていない場合、共有ホスティングでセキュリティの問題が発生する可能性があることに注意してください。

この例では、SSH / FTPユーザーはsonassi、Apacheユーザーはapache、グループはapache

FTP / SSHユーザーをApacheグループに追加します

最も重要なことは、FTP / SSHユーザーがApacheグループの一部であることを確認する必要があることです。この例では、そのグループapacheは(しかし一般的にはwww-data

usermod -a -G apache sonassi

FTP / SSHの場合と同じ数のユーザーをグループに追加し続けます。

元の権限をリセット

そのため、開始する前に、すべての権限が正しいことを確認してください。

chown -R sonassi:apache /home/path/public_html/
find /home/path/public_html/ -type d -exec chmod 775 {} \;
find /home/path/public_html/ -type f -exec chmod 664 {} \;

変更を永続的にする

ACLとスティッキービット

LinuxのACLを使用すると、特定のルール、この場合は作成時にどのパーミッションファイルを継承するかを定義できます。スティッキービット(後述)は、グループ継承の世話をするが、私たちはACLを使用する理由である権限、と助けにはなりません。

アクティブパーティションでACLサポートを有効にすることから始めます。カーネルがACLサポートでコンパイルされていることを確認してください

あなたのパーティションであってもよい//home/varまたは何か他のものは、適宜交換してください。

mount -o remount,acl /home

ACLが有効になったので、ACLルールとグループスティッキビットを設定できます。

setfacl -d -m u::rwx,g::rwx,o::rx /home/path/public_html/
chmod g+s /home/path/public_html/

しかし、私はACLをサポートしていません

カーネルがACLをサポートしていない場合umaskは、デフォルトのファイル許可を設定するために(BASH、FTP、およびPHPの実行時設定)を使用することもできます。Magentoは通常に設定umask(0)index.phpれますが、これを変更することはあなたの利益になります。

あなたにindex.php変更umask行がなければ

umask(022);

そして、SSHのBASH環境で、これをあなた.bashrcまたは.bash_profile

umask 022

FTPサーバーについては、そのドキュメントを読む必要がありますが、原則は同じです。


テーマをデフォルトに戻す

テーマまたはパッケージがこの問題の原因である可能性があります。バニラマジェントのテーマに戻すことで、簡単に見つけることができます。

**これには、一部のモジュールが特定のテーマ機能に依存している可能性があるという警告があります*

管理パネルで何かを変更するのではなく、問題のディレクトリの名前を変更する方がはるかに簡単です。

SSH経由

mv ./app/design/frontend/myBrokenTheme{,.tmp}
mv ./skin/frontend/myBrokenTheme{,.tmp}

または、FTPクライアントを介して、パッケージをトラバースし、別の名前に変更します。例えば。myBrokenTheme.tmp

これで問題が解決した場合

次に、テンプレートのどの部分に問題があるかについて、もう少し詳しく調べる必要があります。そのため、パッケージを復元し、それぞれをテストしながら次のことを試みます。

基本的に、プロセスは、問題のあるファイルが見つかるまで、ファイルツリーをたどってディレクトリを徐々に有効にします。

  1. レイアウトディレクトリの名前を .tmp
  2. テンプレートディレクトリの名前を .tmp

次に、どちらかが修正された場合、レイアウトディレクトリ内のすべてのファイルの名前を.tmp-(SSHユーザーls | xargs -I {} mv {} {}.tmpまたはrename 's/^/.tmp/' *)に変更します

その後、解決されるまで、各ファイルを1つずつ徐々に有効にします。

これで問題が解決しない場合

base/defaultまたはenterprise/defaultディレクトリが汚染されている可能性があります-既知のクリーンバージョンに置き換えるのが最適です。

これを行うには、Magentoのクリーンビルドをダウンロードし、必要に応じてディレクトリを置き換えます。SSHでこれを行うことができます:

cd /home/path/public_html/
mkdir clean_mage
cd clean_mage
MAGENTO_VERSION=1.7.0.0
wget -O magento.tgz  http://www.magentocommerce.com/downloads/assets/$MAGENTO_VERSION/magento-$MAGENTO_VERSION.tar.gz
tar xvfz magento.tgz
cd /home/path/public_html/app/design/frontend
mv base{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/app/design/frontend/base .
cd /home/path/public_html/skin/frontend
mv base{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/skin/frontend/base .

diff変更を確認する場合は、2つのディレクトリにアクセスすることもできます。

diff -r base base.tmp

NB。モジュールの依存関係は特定のファイルの存在を指示するため、このメソッドはプロセス中により多くのエラーを引き起こします。残念ながら、コースのパー。


ローカルモジュールを無効にする

デフォルトでは、Magentoは、次の順序でクラスをロードするPHPインクルードパスを定義します

Local > Community > Core

ファイルがローカルにある場合-それをロードして、それ以上はしません。
ファイルがコミュニティにある場合-それをロードして、それ以上はしません。
他の場所でファイルが見つからない場合-コアからロードします。

繰り返しになりますが、Magento管理パネルでモジュールを無効にするよりも、ファイルレベルでこれを行う方が実用的です。

通常、モジュールを「適切な」方法で無効にするには、それぞれの./app/etc/modules/MyModule.xmlファイルを編集して設定します。<active>false</active>ただし、これは実際にはクラスのロードを妨げません。

別のクラスがモジュール内の特定のクラスを拡張する場合(Magento依存関係宣言を無視する場合)、拡張機能が無効かどうかに関係なく、引き続きロードされます。

繰り返しになりますが、拡張機能を無効にする最良の方法は、ディレクトリの名前を変更することです。

ローカルを無効にすることから始めます

FTP経由でディレクトリの名前を変更するか、次のSSHコマンドを使用します

mv ./app/code/local{,.tmp}

次に、コミュニティを無効にします

mv ./app/code/community{,.tmp}

いずれかから問題が解決した場合

次に、特にエラーの原因となったモジュールを理解する場合です。上記のパッケージ診断の例と同様に、同じプロセスが適用されます。

そのため、Xディレクトリを復元し、それぞれをテストしながら次のことを試みます。

基本的に、エラーが再発するまで、ディレクトリ(モジュール)を1つずつ段階的に有効にします。

  1. ディレクトリ内のすべてのモジュールの名前を変更します.tmp(SSHユーザーls | xargs -I {} mv {} {}.tmpまたはrename 's/^/.tmp/' *
  2. .tmpファイル名から削除することにより、各モジュールを徐々に有効にします

問題が解決しない場合

その後、コア自体が汚染される可能性があります。メインのMagento PHPコアは、

./app/code/core
./lib

繰り返しますが、これらのディレクトリの名前を変更し、クリーンなバリアントでコピーします。上記のように、Magentoのクリーンバージョンを既にSSH経由でダウンロードしていると仮定すると、これを行うことができます。

cd /home/path/public_html/app/code
mv core{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/app/code/core .

それでも問題が解決しない場合は、libディレクトリも置き換えます

cd /home/path/public_html
mv lib{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/lib .

この時点で、Magentoストアは、変更されたデータベースを備えた通常のインストールにすぎません。

一部のモデルは実際にはまだデータベースに保存されています(たとえば、注文の増分)。したがって、この時点で、それらの編集を手動で行う場合になります。これまでのところ、上記のすべての手順は永続的な損傷なしで可逆的です。ただし、クリーンなMagentoデータベースもインポートしている場合は、元に戻せないことが判明する可能性があります(バックアップの復元以外)。


上記のガイドは、エラーを特定する方法を説明しています。結果のエラーを修正することではありません。

www.sonassi.com/knowledge-base/magento-debug-processおよびwww.sonassi.com/knowledge-base/stop-magento-permissions-errors-permanentlyから提供されるコンテンツ


7
回答は一部のMagentoユーザーにとっては役立つと思いますが、ポスターがすぐに質問に答えたため、コミュニティWikiのようなQ&A質問としてマークする必要があります。
マティアスツァイス

8
自己回答の質問は許可されているだけでなく、SEによって奨励されています。blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange。より多くのユーザーがこのベータ版の発展を支援するためにそれを行うべきであり、他のメンバーを支援してサイトを進歩させるための努力をするために他のメンバーをスレートする必要はありませんか?
ベンレサニ-ソナシ

これ755644パーミッションは違いますか?または、特別な理由が775あり664ますか?
ユルゲンセレン

@Jurgen-すべてサーバーについて-Nginx / Apache / PHPは常にSSH / FTPと同じユーザーとして実行されます-共有/専用ホスティングで実行されます。そのrwxため、グループと他の全員は関係ないので、権限は所有者のみに許可されます。しかし、私が述べたように-誰もがサーバーを適切に構成するわけではありません(実際、非常に少数です)-そして、Apache / Nginx / PHPユーザーがSSH / FTPユーザーと異なる可能性があります。その後、それぞれのグループは、それぞれにrwxできるはずのファイルを許可します。
ベン・レッサーニ-ソナッシ

端末を使用して2つのディレクトリを比較
questions

18

Twitterで要求されたメタに議論し、私はここに非開発者のためのデバッグのチュートリアルを開始します。

まず、Magentoは開発者/開発チームのいない商人にとっては複雑すぎると思います(もしあなたがmagentoがこれに従事しようとする場合でも)。しかし、あなたが勇敢で、それを試してみたいのであれば、私たちはあなたを助けるためにここで最善を尽くしています。一部の質問では、「どうすればこれを行うことができますか?」そして、「私の作品を作ってください、私はこれをグーグルするにはバカすぎます」は非常に良いラインです。グーグルで何を探しているのかわからない、ネーミングがまだわからないので、グーグルが考えるのは難しいことが多いことを理解しています。これは、Magentoストアを持っている人なら誰でもできることを集めましょう、たとえあなたが開発者でなくてもです。

汚れたくなったときにmagentoをデバッグする方法についての非常に良い答えは、すでにSonassiによって与えられましたが、商人に適用できると思うものを追加してコピーしようとしています。

免責事項:この投稿に記載されているすべてのディレクトリとファイルは、Magentoのルートフォルダに関連しています/var/wwwが、ホスティングプロバイダによっては、ドキュメントルートと呼ばれるものがどこにでもある可能性があります。 !

開発モード

magentoが正常に配信する安っぽい「エラーが発生しました」ページではなく、実際のエラーが必要です。 http://www.fontis.com.au/blog/magento/custom-magento-error-page

この画像を提供してくれたfontis.comに感謝します。

ページに記載されているレポートは、 var/reports/<the_number>

開発モードをアクティブにすると、magentoが実際のエラーを発生させます。これらのエラーは、データベースの資格情報のように、特に資格情報を漏らす可能性があります。したがって、本番サーバーで有効にする前に考えてください!

index.phpバージョンに応じて、magentoのルートフォルダーでファイルを開きます。73行目付近に次の行があります。

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
    Mage::setIsDeveloperMode(true);
}

#ini_set('display_errors', 1);

モードをアクティブにするには、これらの行を変更する必要があります。

IPアドレスを知っている場合(少なくともドイツでは、ほとんどの人が24時間ごとに新しいものを取得します)、ここでgoogleが役立ちます:

パブリックIPアドレスは87.138.100.68です

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) 
    || $_SERVER['REMOTE_ADDR'] == 'my.ip.add.ress'
) {
    Mage::setIsDeveloperMode(true);
    ini_set('display_errors', 1);
}

何らかの理由でIPがわからない場合は、全員にエラーを表示できます。

#if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) || true) {
  Mage::setIsDeveloperMode(true);
#}
ini_set('display_errors', 1);

ロギング

Magentoは多くの情報を2つのファイルに記録します。

  • var/log/exception.log
  • var/log/system.log

例外は常に記録されます。システムログはバックエンドで有効にする必要があります。

System > Configuration > Developer > Log

ここに画像の説明を入力してください

設定してEnabledYesに、あなたは、よりエラーやデバッグメッセージを表示system.logし、中exception.log

テーマの問題ですか?

独自のテーマがあります。これはここのバックエンドで設定されます:

システム>設定>設計

ここに画像の説明を入力してください

画像を提供してくれたkb.magenting.comに感謝

ここで、パッケージとテーマを構成できます。デフォルトのテーマでエラーを再現しようとする場合は、入力フィールドからすべてを削除します。次に、[保存]をクリックすると、デモショップのように標準のmagentoテーマが表示されます。1.8より前のショップがある場合は、Magento Community Editionユーザーガイドでスクリーンショットを見つけることができます。

デフォルトのテーマで問題を再現できない場合、テーマが壊れています。テーマのベンダーに連絡してください。サードパーティのテーマ、特に商用のテーマはサポートしていません。

今何?

あなたは本当のエラーを見つけました、1つは再現できます、それはデフォルトのテーマで再現可能ですか?素晴らしい、質問を開いてください。私たちは最善を尽くして支援します。

質問:

  • あなたがしていることを説明してください
  • どのエラーが発生しますか
  • ログファイルに何かありますか?
  • 多分エラーのスクリーンショット

5
  1. まず、開発者モードを有効にする必要があります
  2. index.php:ini_set( 'display_errors'、1);でエラーを表示することもできます。
  3. スマートなIDE(PhpStrom / eclipse)でxDebug拡張機能をコンパイルします
  4. カスタムモジュールとサードパーティモジュールを無効にする
  5. 例外とエラーログを確認し、例外ログにリストされているエラーを解決します
  6. curlとmcrypt拡張機能がサーバーにロードされていることを確認してください
  7. フォルダーとファイルのアクセス権を確認しますchown -R sonassi:apache / home / path / public_html / find / home / path / public_html / -type d -exec chmod 775 {} \; find / home / path / public_html / -type f -exec chmod 664 {} \;
  8. 設定されていない場合、メディアとvarディレクトリのアクセス許可0777を更新します
  9. IDE(phpstrom)を起動し、index.phpでデバッガーの開始ポイントを設定します10. F8を押して、エラーが発生するまで次に進みます

上記の手順を使用すると、間違いなくエラーが発生します。


1
私はあなたの答えに感謝しますが、すでに答えを受け入れている質問に答える代わりに、なぜあなたはこの質問に
dh47 14

3
@ dh47私にとって、アビシェークがしたことは正しい。既に受け入れられている質問に答えることは、依然として関連性があり重要です。実際、私たちのサイト(Magento SE)にはこの重要な側面が欠けています。ベータ版から出てくるには、2.5の回答が必要です。現在、回答率は1.6のみです。したがって、同じ質問に対する複数の回答を高く評価する必要があります。その質問には回答が受け入れられているため、回答せずに質問を残さないでください。さらに追加するポイントがある場合は、回答する必要があります。
ラジーエフKトミー

-1

バックトレースのデバッグ

これは、magentoの関数呼び出しをデバッグするのに適した関数です。

この関数をincludes / config.phpに追加するか、新しいファイルを作成して、一般的に使用されるすべてのphp関数を配置します。

function back_trace($ exit = true){
  $ call_back_methods = '';
  $ call_back_methods。= '';
  $ call_back_methods。= 'SNFunction NameLine NumberFile Name';

  $ counter = 1;
  foreach(debug_backtrace()as $ index => $ data){
    // if(0 == $ index)continue;

    $ call_back_methods。= '' $ counter ++。'';
    $ call_back_methods。= '' $ data ['function']。'';
    $ call_back_methods。= '' $ data ['line']。'';
    $ call_back_methods。= '' $ data ['file']。'';
  }

  $ call_back_methods。= '';

  print $ call_back_methods;

  if(true == $ exit)exit;
}

OutPutは

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.