Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Joomla 3.1:批量删除速度非常慢_Joomla - Fatal编程技术网

Joomla 3.1:批量删除速度非常慢

Joomla 3.1:批量删除速度非常慢,joomla,Joomla,我有一个从类别中删除文章的简单脚本,删除大约10000篇文章需要花费很长时间,以下是我的代码: //include libraries $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select(array('id')); $query->from('#__content'); $query->where('catid = 14'); $db->setQuery($query);

我有一个从类别中删除文章的简单脚本,删除大约10000篇文章需要花费很长时间,以下是我的代码:

//include libraries

$db = JFactory::getDbo();

$query = $db->getQuery(true);
$query->select(array('id'));
$query->from('#__content');
$query->where('catid = 14');
$db->setQuery($query);
$results = $db->loadObjectList();

$table = JTable::getInstance('Content', 'JTable', array());
foreach ($results as $article)
{
    $table->delete($article->id);
}
使用此代码,删除大约3k篇文章大约需要12小时。我做错事情了吗?还是Joomla就是这样工作的


我可以简单地使用MySQL脚本删除##u内容中的行,但是这样许多相关的表就不会被处理,例如###(u)资产、#(u)(u)ucm*、#(u)(u)u contenttagmap等等。

12小时是删除3k文章的极长时间。我估计需要一分钟/几分钟

试着用下面的方法看看是否有什么不同

注意:在尝试此代码之前,请确保您有数据库的备份

$db = JFactory::getDbo();

$query = $db->getQuery(true);
$conditions = array(
    'catid=14');

$query->delete('#__content');
$query->where($conditions);

$db->setQuery($query);

希望这有帮助

您可以手动删除3000篇文章,方法是将筛选列表长度设置为100,选中全部,然后单击删除按钮30次。因此,很明显,你这样做的方式不是应该发生的,尽管基本上理论是正确的

请确保除了根目录1之外,没有父目录id==0的其他目录的资产id,好吗? 还要确保所有文章都正确设置了资产ID,即确保它们始终是第14类资产的父项


您应该能够使用该模型删除阵列。但是,即使循环3000次也不应该花费8小时,除非您遇到了无限循环,这些循环反复启动并触发失控循环的故障保护。

测试了您的代码,运行没有错误,但也没有删除任何内容。您认为这种方法还会得到#uu资产、#u ucm*和所有相关表吗?我没有看到涉及任何JTable或ContentModelArticle实例。我担心,如果我只是从#u内容中删除记录,可能会产生不良后果,因为许多关系、关联未得到正确处理,错误?您可以对其进行添加,以从其他表(如
#u资产
)中删除数据。请看一下删除此上的记录:AFAIK,要更新资产表,您需要重新计算lft和rgt值,这是不实例化模型的琐事。它不是trvia。最有可能的慢是由损坏的资产表引起的,这是您想要避免的。请不要试图直接计算资产嵌套值,除非您了解API中的操作。使用$table->delete()是正确的方法,但delete并不要求您遍历所有内容,它将直接使用数组作为输入,就像在管理员中可以使用复选框一样。@Elin:谢谢数组提示!我怀疑资产表已经损坏。在新安装上进行了实验:使用JTable实例,使用脚本插入50k篇文章,插入时间基本上与文章数量成正比,当文章数量小于(比如)1000篇时,插入时间开始为几毫秒,当文章数量接近50k时,插入时间结束为10秒。大部分时间都花在计算lft和rgt上。我当然忽略了遗留和cms部分的导入,需要仔细研究一下。资产表结构有点混乱:我试图通过后端(不是脚本)在catid 14中添加一篇文章,但是在MySQL中,我没有看到14作为它的父id。我想我使用了一个新的安装,但可能是我在其他地方搞砸了。幸运的是,到目前为止,看似错误的资产表不会影响作业的显示、编辑等类型。错误的资产表会影响所有作业,因为它正在执行访问检查。资产表中的父项id是父项的资产id,而不是类别表中父项的id,因此不会显示为14。资产表的结构非常简单,它只是资产id、名称(component.model.idFromComponentTable)、父级的资产id、lft rght级别。通过第二次检查,我认为我的资产表很好:比如说,我看到了37,这是资产表中catid 14的真实id。还随机检查了其他条目,它们似乎是一致的。我确认我的观察,即处理时间与类别中的文章数量成正比。我的一个类别有超过8万篇文章,保存该类别文章的过程大约需要10秒以上,更新资产表的过程占99%。