CakePHP Model :: create和Model :: save()在循环

时间:2015-06-04 16:20:04

标签: php mysql cakephp cakephp-2.3

我在CakePHP 2.3.4和PHP 5.5上使用MySQL在我的Ubuntu服务器上运行。我有这样的循环:

foreach($notification_group['User'] as $notification_user) {
    // Do something
    $this->set($notification);
    $this->Notification->create();
    $this->Notification->save($notification);  // 0.4 seconds per iteration
}

// Do same something
$this->set($notification);
$this->Notification->create();
$this->Notification->save($notification);  // Less than 0.1 seconds

在循环中,每次迭代需要0.4秒才能完成。但是循环外的创建和保存方法只需(不到0.1秒)即可完成。循环开销应该不是问题。

为什么在循环中执行基本插入需要这么长时间?怎么改进呢?谢谢!

更新1:我已经尝试在循环中注释掉create和save方法,结果发现循环根本没有太多的开销。 我想知道为什么在尝试saveMany()或其他方法之前发生这种性能影响。

更新2:我尝试过saveMany()一次保存一组通知。以下是代码段:

$notification_array = array();

// Save notificaions
foreach($notification_group['User'] as $notification_user) {
    $notification = null;
    // Do something
    $this->set($notification);
    array_push($notification_array, $notification);
    // $this->Notification->create();
    // $this->Notification->save($notification);
}

if (!empty($notification_array)) {
    $this->Notification->saveMany($notification_array);
}

性能与在循环中使用create和save相同 - 每次迭代/记录保存0.4秒。如果我注释掉saveMany(),性能命中就会消失。

更新3:我不在NotificationController。我在函数的开头加载了通知模型:

$this->loadModel('Notification');

循环是第一个使用通知模型的人。延迟加载机制是否会影响性能?如何避免呢?

0 个答案:

没有答案