node_save()的效率低下给我带来很多麻烦。但是节点可以解决我的问题吗?最终,这就是我想要找出的。
我创建了一个具有100,000次迭代的循环。我创建了使节点对象有效并正确保存的最低要求。这是节点保存代码:
$node = new stdClass();
$node->type = "test_page";
node_object_prepare($node);
$node->uid = 1;
$node->title = $node_title;
$node->status = 1;
$node->language = LANGUAGE_NONE;
if($node = node_submit($node)){
node_save($node);
}
结果如下:
保存了100,000个节点,每个节点都使用node_save()。完成了5196.22秒。那就是19节省一秒钟。
至少可以说,这是不可接受的,特别是当此人每秒获得大约1200个单独的插入查询,并且这个人每秒获得25,000个插入时。
那么,这是怎么回事?瓶颈在哪里?是否与node_save()函数一起使用以及如何设计?
可能是我的硬件吗?我的硬件是一台开发服务器,除我之外没有人可以使用-Intel双核,3Ghz,Ubuntu 12.04和16 gig的ram。
在循环运行时,我的资源使用情况是:MySQL 27%CPU,6M RAM;PHP 22%CPU 2M RAM。
我的mysql配置由percona向导完成。
Mysql说,如果我的CPU使用率低于70%,我的问题就是磁盘绑定。当然,我只有WD Caviar 7200 RPM磨粉机,但我希望它每秒能获得超过19次插入!
不久之前,我写过关于每天节省30,000个节点的文章。但是,需要明确的是,该节点与任何外力无关。纯粹是了解如何提高对node_save()的调用速度的基准。
实际上,我需要使用node_save每分钟将30,000个项目放入数据库。如果不选择保存节点,我想知道我是否可以编写自己的drupal api函数“ node_batch_save()”或利用mysql的INSERT查询功能进行批量插入的功能。关于如何处理此问题的想法?