Php Joomla:实例化ContentModelArticle非常慢

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

我有一个json文件,大小约为50M,记录约为10k条。我使用以下代码以编程方式插入Joomla,它工作得非常好,所有相关的表都会同时更新,例如#u资产,但是代码运行非常慢:现在大约40个小时过去了,但只处理了大约4k个文章。我能加快这个过程吗

我知道如果我插入
#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(),否则在插入几行之后,进程仍然会提前退出(没有错误)。不知道如何把代码放在这里,以便在我评论时限制字符。谢谢