调试Magento商店的基础知识


81

如何调试我的Magento商店

这个问题现在对我们来说并不太相关,但是如果Magento SE网站在5年前就已经存在,那可能就是我们的第一个问题。对于刚接触Magento或不熟悉它的人来说,了解调试的基础知识可能是排除问题根源的关键。尽管它与我们无关,但现在我们以一种自我解答的方式来避免出现这个问题。

帮助我的网站关闭!

  1. 我的设计有问题吗?
  2. 第三方模块有故障吗?
  3. 为什么看不到错误?

这些问题中的每一个都可以通过遵循标准化的调试方法来轻松回答,即使最基本的用户也可以完成。通过消除调试Magento商店的基础知识的过程。


5
使用一个好的调试器和您的情报...
SylvainRayé2013年

4
这是一个严重的问题吗?
davidalger

5
不,这是一个有意识的自我回答的问题,以帮助使此BETA上的球滚动。堆栈交换不仅允许自己回答问题,而且还积极鼓励Blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange。@sylvain此问题适用于新手/经验不足的用户,以帮助他们启动调试过程
Ben Lessani-Sonassi 2013年

@sonassi我没有拒绝投票,您以更清晰的方式重构了您的问题。大概我可以帮忙:)我不知道SE不仅是一个问答环节,而且很高兴知道。关于主要主题,这里的答案只是大多数可能出现的更深层问题的表面,这就是为什么我说使用调试器并首先了解Magento的内部派遣过程的工作方式,因此您可以在理解之后解决很多问题。那是我的5美分。如何解决税收计算,运输方式,块生成或其他问题:调试!它也有助于学习实习过程。
SylvainRayé13年

2
明白了 我试图帮助的是更根本的致命错误。显然,问题的范围过于广泛,以至于没有一个单一的解决方案可以回答。可通过调试诊断出古怪/小错误-但对于致命错误-则需要一种较不复杂的方法,如下所示。是的,我调整了这个问题:)
Ben Lessani-Sonassi

Answers:


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服务器,您需要阅读它的文档,但是原理是相同的。


恢复主题为默认

您的主题或程序包可能是导致此问题的原因。恢复到原始的Magento主题是一种快速的发现方法。

**这带有警告,某些模块可能取决于某些主题功能*

与其通过管理面板进行任何更改,不如仅重命名有问题的目录要简单得多。

通过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 {} {}.tmprename 's/^/.tmp/' *

然后逐步逐个启用每个文件,直到解决为止。

如果这样不能解决您的问题

有潜力,你base/defaultenterprise/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如果要验证任何更改,也可以利用机会进入两个目录。

diff -r base base.tmp

注意 此方法将在处理过程中引起更多错误,因为模块依赖性决定了特定文件的存在。不幸的是,这与课程相当。


禁用本地模块

默认情况下,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. 将目录中的所有模块重命名为.tmp(对于SSH用户ls | xargs -I {} mv {} {}.tmprename 's/^/.tmp/' *
  2. 通过.tmp从文件名中删除,逐步启用每个模块

如果问题没有解决

然后,芯子本身可能会被污染。Magento PHP的主要核心包括

./app/code/core
./lib

同样,重命名这些目录并复制一个干净的变体。假设您已经通过SSH下载了上述的Magento干净版本,您可以执行以下操作:

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-processwww.sonassi.com/knowledge-base/stop-magento-permissions-errors-permanently


7
我认为该答案可能对某些Magento用户有用,但应将其标记为类似于社区Wiki的问答问题,因为发帖人会立即回答该问题。
Matthias Zeis

8
SE不仅允许自我回答问题,而且还鼓励SE。blog.stackoverflow.com/2012/05/encyclopedia-stack-exchange。应该有更多的用户这样做以帮助该Beta不断发展,而不是因为努力帮助他人和改善网站而将其他成员选入名单吗?
Ben Lessani-Sonassi

如果不是这是755644权限?或者你有什么特别的理由,推荐775664
尔根·塞伦(JürgenThelen)

@Jurgen-对于我们所有服务器-Nginx / Apache / PHP始终以与SSH / FTP相同的用户身份运行-无论是在共享/专用托管上。因此权限只能是rwx所有者的-组和其他所有人都不相关。但正如我提到的-并非每个人都正确配置他们的服务器(实际上,很少有人这样做)-Apache / Nginx / PHP用户与SSH / FTP用户的潜力很可能不同,因此请相互添加然后,每个相应的组都允许每个rwx文件都应有其能力。
Ben Lessani-Sonassi

如果你不希望使用终端差异比较两个目录,你可以安装这些GUI选项之一askubuntu.com/questions/12473/...
pablofiumara

18

由于在Twitter上请求讨论了元我就从这里开始对非开发者调试教程。

首先,我认为(即使您是magento都想参与其中)对于没有开发人员/开发团队的商人来说,Magento太复杂了。但是,如果您勇于尝试,我们将竭诚为您服务。我认为对于“我如何做到这一点”之间的界限有些疑问。和“请让我做我的工作,我太愚蠢了,以至于不能用Google搜索”这句话很不错。我知道Google认为这通常很难,因为您不知道要搜索的内容,因为您还不知道名称。这就是说,让我们收集拥有magento商店的每个人都可以做的事情,即使您不是开发人员。

Sonassi已经给出了一个非常好的答案,当您想弄脏时,如何调试magento,但是我尝试添加内容并复制我认为适用于商家的内容。

免责声明:本文中提到的所有目录和文件都相对于magento根文件夹,该目录可能位于其中,/var/www但取决于托管提供商,您所谓的“文档根目录”可能无处不在,请询问提供商,如果找不到您的magento !

开发模式

您想要的是真正的错误,而不是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将很多内容记录到两个文件中:

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

异常始终记录。需要在后端启用系统日志:

System > Configuration > Developer > Log

在此处输入图片说明

设置Enabled为Yes,你会看到更多的错误和调试信息system.log,并在exception.log

这是主题问题吗?

您有自己的主题,这是在后端配置的:

系统>配置>设计

在此处输入图片说明

感谢kb.magenting.com提供的图片

在这里您可以配置包和主题。如果要尝试重现默认主题中的错误,请从输入字段中删除所有内容。然后单击“保存”,您将看到演示商店中的标准magento主题,如果您在1.8之前的商店中可以在《Magento社区版用户指南》中找到屏幕截图

如果您无法在默认主题中重现该问题,则您的主题已损坏,请与主题供应商联系。我们不支持第三方主题,尤其是商业主题。

现在怎么办?

您发现了一个真正的错误,一个可以复制,在默认主题下是否可以复制?太好了,请提出一个问题,我们正在竭尽所能。

在问题中:

  • 描述你在做什么
  • 引发什么错误
  • 日志文件中有什么?
  • 错误的屏幕截图

5
  1. 首先,您应该启用开发人员模式
  2. 您也可以在index.php:ini_set('display_errors',1);中显示错误。
  3. 使用任何智能IDE编译xDebug扩展(PhpStrom / eclipse)
  4. 禁用自定义和第三方模块
  5. 查看您的异常和错误日志,解决异常日志中列出的错误
  6. 检查curl和mcrypt扩展名是否必须在服务器上加载
  7. 检查文件夹和文件权限chown -R sonassi:apache / home / path / public_html /查找/ home / path / public_html / -type d -exec chmod 775 {} \; 查找/ home / path / public_html / -type f -exec chmod 664 {} \;
  8. 如果未设置,请更新媒体和var目录权限0777
  9. 启动IDE(phpstrom),然后在index.php上设置调试器起点10.按F8并继续,直到出现错误

使用上述步骤,您肯定会出错。


1
非常感谢您的回答,但为什么不回答已经接受的答案,为什么不能回答这个问题。
dh47 2014年

3
@ dh47对我来说,阿比舍克所做的是正确的。我只想提及,回答已经被接受的问题仍然是重要和重要的。实际上,我们的站点(Magento SE)缺少这一重要方面。重要的是要有2.5个答案比率来自beta。目前,我们只有1.6的回答率。因此,对同一问题的多个答案应该受到赞赏。不要留下一个没有回答的问题,因为该问题具有公认的答案。如果还有一点要补充,您应该回答。
Rajeev K Tomy 2015年

-1

调试回溯

这是调试magento中的函数调用的好函数。

将此功能添加到includes / config.php中或创建新文件,然后将所有常用的php函数放入。

函数back_trace($ exit = true){
  $ call_back_methods ='';
  $ call_back_methods。='';
  $ call_back_methods。='SNFunction名称行编号文件名';

  $ counter = 1;
  foreach(debug_backtrace()as $ index => $ data){
    //如果(0 == $ index)继续;

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

  $ call_back_methods。='';

  打印$ call_back_methods;

  如果(true == $ exit)退出;
}

输出将是

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.