Performance 具有多个外键的CakePHP性能

Performance 具有多个外键的CakePHP性能,performance,cakephp,apache2,cpu,Performance,Cakephp,Apache2,Cpu,我有一个评分系统,将评分或资格约20个领域连同其他数据。这个问题可能更多的是一个设计问题,但cake显然没有很好地处理它,导致apache2占用了我的CPU 我有一个名为Recommensions的表,它是一个简单的ID,Name。此表中填充了如下内容: var $belongsTo = array( 'Employee' => array( 'className' => 'Employee', 'foreignKey' => 'fore

我有一个评分系统,将评分或资格约20个领域连同其他数据。这个问题可能更多的是一个设计问题,但cake显然没有很好地处理它,导致apache2占用了我的CPU

我有一个名为Recommensions的表,它是一个简单的ID,Name。此表中填充了如下内容:

var $belongsTo = array(
    'Employee' => array(
        'className' => 'Employee',
        'foreignKey' => 'foreign_key',
        'conditions' => array('Review.model' => 'Employee')
    ),
    //...
1-正确 2-不正确 3-失踪 4-NA

review表中有许多字段是Recommensions表的外键

字段1-字段20参考建议ID

我看到的是,每一个页面请求都会使apache2占用的CPU达到50-90%,即使我没有访问一个引用评论的页面

我猜这与cake处理模型绑定的方式有关。我可以使用类似于enum的东西,但它没有那么灵活

关于更好的设计或者如何调试cake为什么会让Apache变得疯狂,有什么想法吗

var $name = 'Review';
var $actsAs = array('Containable');

var $validate = array(
    'service_request' => array(
        'minLength' => array(
            'rule' => array('minLength', 8),
            'message' => 'Enter a valid Service Request Number'
        ),
        'maxLength' => array(
            'rule' => array('maxLength', 8),
            'message' => 'Enter a valid Service Request Number'
        ),
        'numeric' => array(
            'rule' => 'numeric',
            'message' => 'Enter a valid Service Request Number'
        )
    )
);

var $belongsTo = array(
    'Employee' => array(
        'className' => 'Employee',
        'foreignKey' => 'reviewer_id',
    ),
    'Reviewer' => array(
        'className' => 'Employee',
        'foreignKey' => 'reviewer_id'
    ),
    'Reviewee' => array(
        'className' => 'Employee',
        'foreignKey' => 'reviewee_id'
    ),
    'Rating' => array(
        'className' => 'Rating',
        'foreignKey' => 'rating_id',
    ),
    'SrSummary' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_summary'
    ),
    'SrProduct' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_product'
    ),
    'SrVersion' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_version'
    ),
    'SrRelease' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_release'
    ),
    'SrComponent' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_component'
    ),
    'SrTechnicalProblem' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_technical_problem'
    ),
    'SrCommunicationOwner' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_communication_owner'
    ),
    'SrCommunicationGroup' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_communication_group'
    ),
    'SrOwnerGroup' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_owner_group'
    ),
    'SrOwnerGroupGeo' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_owner_group_geo'
    ),
    'SrStatus' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_status'
    ),
    'SrSubstatus' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_substatus'
    ),
    'SrSeverity' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_severity'
    ),
    'SrPriority' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_priority'
    ),
    'SrHwPlatform' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_hwplatform'
    ),
    'SrBuild' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_build'
    ),
    'SrSerial' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_serial'
    ),
    'SrManualSerial' => array(
        'className' => 'Recommendation',
        'foreignKey' => 'sr_manual_serial'
    ),
    'Note' => array(
        'className' => 'Note',
        'foreignKey' => 'note_id'
    ),
    'Timing' => array(
        'className' => 'Timing',
        'foreignKey' => 'timing_id'
    )
);

有一名控制员负责所有审查。在不需要数据的情况下提取数据时,需要禁用关联。您还没有显示任何代码,但在运行查询之前,它看起来像这样

$this->Model->recursive = -1;

如果不能调试您的站点,很难说,但是-有几件事

如果您尚未使用,请获取它。然后,您可以很容易地查看任何/所有正在运行的mysql查询以及它们各自花费的时间

CPU峰值可能与运行一个获取太多信息(即太多关联数据)的查询有关。根据您正在运行的Cake版本获取正确的版本,查看所有查询及其运行时间,然后调整您的关联或递归级别,或包含…等,以避免获取多余的数据

或者,如果您知道某个特定的查询是问题所在,但无法找出原因,请将其作为另一个StackOverflow问题发布

无关注:

设置评论关联类型的正常方法是在评论表中设置一个“外键”和一个“模型”字段,然后使用这些字段设置关联-如下所示:

var $belongsTo = array(
    'Employee' => array(
        'className' => 'Employee',
        'foreignKey' => 'foreign_key',
        'conditions' => array('Review.model' => 'Employee')
    ),
    //...

这样,如果您添加了另一个模型,您就可以链接到该模型,而无需在reviews表中添加另一个字段。

听起来像是在猜测。你看过日志了吗?我没猜,我把应用程序拆开,一块一块地重新构建。我已经有了强烈的怀疑。如果我将$belongsTo关联删除到review模型中的建议表中,问题就会消失。我还查看了我的apache日志,没有发现任何问题。你在帖子中说,我猜这与cake处理模型绑定的方式有关。不管怎样,你能分享一些你认为问题发生的代码吗?我已经用基本的回顾模型更新了。正如您所见,有许多与“推荐”相关的关系。我同意你下面的逻辑,但事实并非如此。我有一个仪表板控制器,它运行自定义查询,甚至不涉及评论。我遇到了同样的问题。同样,如果我删除上述与建议的关联,CPU问题就会消失。我发现我可以删除推荐模型中的$hasMany数组,并且性能得到了很大提高。我测试了如何保存数据,结果没有问题。我认为蛋糕需要$belongsTo和$hasMany这两个定义才能正常运行。似乎只使用$belongsTo是有效的,并且消除了性能问题。我已经尝试过了,但没有什么不同。我可能要做的是删除模型关联并仅在需要时使用bindModel,但这仍然会在访问此模型时导致性能下降。蛋糕似乎不能很好地处理同一张桌子上的多个关联。我正在尝试使用xdebug,看看是否可以进一步确定任何内容。我以为Auth可能做了一些额外的搜索,但我已经完全禁用Auth排除了这一可能性。如果其他人看到过类似的东西或有任何其他想法,请让我知道谢谢Dave,我一定会查看DebugKit。现在,仅仅删除$hasMany的推荐就解决了我的问题。我真的不需要它,因为我可能永远不会从模型/控制器中提取相关数据。我不确定我是否完全遵循了您提供的关联示例。Jeff-基本上,每个模型都不需要单独的字段-您可以使用模型/外键字段来确定评审与哪个项目/模型关联。Jeff-DebugKit几乎是必须的-我认识的每个人在启动新项目时默认都会获得它。一旦你使用了它,你会想没有它你怎么生活。