Php Joomla:实例化ContentModelArticle非常慢
我有一个json文件,大小约为50M,记录约为10k条。我使用以下代码以编程方式插入Joomla,它工作得非常好,所有相关的表都会同时更新,例如#u资产,但是代码运行非常慢:现在大约40个小时过去了,但只处理了大约4k个文章。我能加快这个过程吗 我知道如果我插入Php Joomla:实例化ContentModelArticle非常慢,php,mysql,json,joomla,Php,Mysql,Json,Joomla,我有一个json文件,大小约为50M,记录约为10k条。我使用以下代码以编程方式插入Joomla,它工作得非常好,所有相关的表都会同时更新,例如#u资产,但是代码运行非常慢:现在大约40个小时过去了,但只处理了大约4k个文章。我能加快这个过程吗 我知道如果我插入#u内容,#u标签等,速度会快得多,但这种方法有一些我尽量避免的琐事 <?php define( '_JEXEC', 1 ); define('JPATH_BASE', dirname(dirname(__FILE__))); d
#u内容
,#u标签
等,速度会快得多,但这种方法有一些我尽量避免的琐事
<?php
define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(dirname(__FILE__)));
define( 'DS', DIRECTORY_SEPARATOR );
require_once (JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once (JPATH_BASE . DS . 'includes' . DS . 'framework.php');
require_once (JPATH_BASE . DS . 'libraries' . DS . 'joomla' . DS . 'factory.php' );
define('JPATH_COMPONENT_ADMINISTRATOR', JPATH_BASE . DS . 'administrator' . DS . 'components' . DS . 'com_content');
$mainframe = JFactory::getApplication('site');
require_once (JPATH_ADMINISTRATOR.'/components/com_content/models/article.php');
$string = file_get_contents("items.json");
$json_str = json_decode($string, true);
foreach($json_str as $row){
$new_article = new ContentModelArticle();
$data = array(
'title' => $row['title'][0],
'alias' => $row['alias'],
'introtext' => $row['content'],
'state' => 1,
'catid' => 8, /* don't hard code here! */
'created' => $row['pdate'][0],
'created_by' => 798,
'created_by_alias' => $row['poster'][0],
'publish_up' => $row['pdate'][0],
'urls' => $row['urls'],
'access' => 1,
'metadata' => array(
'tags' => $row['tags'],
'robots' => "",
'author' => implode(" ", $row['poster']),
'rights' => "",
'xreference' => "",
),
);
$new_article->save($data);
}
如果您在Joomla中运行此功能作为扩展,我建议打开调试并查看Joomla中的配置文件信息!调试控制台
查看所有时间都花在哪里
你不是,所以剩下的是扣除(因此可能是错误的)
您正在为每个插入加载ContentModelArticle
,这意味着它不仅为每一行创建和销毁模型类,而且为每一行创建和销毁表类
如果这些都是插入,那么您不需要模型的所有开销(例如,首先检查文章是否存在)
如果数据全部有效,您也不需要内容模型中的数据准备(prepareTable()
),也不需要内容表中的check()
)
如果不需要,可以加载JTable
一次,然后调用表对象save()
为每个项目传入数组。这将运行更新资产跟踪的bind()
,check()
,store()
,并完成插入
所以,你可以试试这样的东西,我想它会更快,不知道要多快
$contentTable = JTable::getInstance('Content', 'JTable', array());
foreach($json_str as $row){
$data = array(
'title' => $row['title'][0],
'alias' => $row['alias'],
'introtext' => $row['content'],
'state' => 1,
'catid' => 8, /* don't hard code here! */
'created' => $row['pdate'][0],
'created_by' => 798,
'created_by_alias' => $row['poster'][0],
'publish_up' => $row['pdate'][0],
'urls' => $row['urls'],
'access' => 1,
'metadata' => array(
'tags' => $row['tags'],
'robots' => "",
'author' => implode(" ", $row['poster']),
'rights' => "",
'xreference' => "",
),
$contentTable->save($data);
}
*免责声明:这不是经过测试的代码,它只是从我的脑海中出现在浏览器中。是的,我用JTable修改了我的代码,做了一些实验:1。似乎我需要把$contentTable=JTable::getInstance('Content','JTable',array())放进去代码>在foreach循环中,否则脚本将在插入一行后退出;2.我仍然需要显式地绑定()、检查()和存储(),而不是只使用save(),否则在插入几行之后,进程仍然会提前退出(没有错误)。不知道如何把代码放在这里,以便在我评论时限制字符。谢谢