删除节点有300,000条评论时500错误 -- 7 领域 和 comments 领域 drupal 相关 的问题

500 error when deleting node with 300,000 comments


4
vote

问题

中文

我有一个已垃圾邮件的节点,有300,000个评论。每当我尝试删除它时,我会得到500个内部服务器错误。

通过数据库删除所有注释不是一个选项,因为我需要在其他节点上保留大量合法注释。但是,此特定节点已被垃圾邮件发送,我希望删除节点和所有关联注释,但我不能。我已经禁用了节点的评论,但我如何删除这些评论?任何想法?

英文原文

I have a node which has been spammed and has 300,000 comments. Whenever I try to delete it I get a 500 internal server error.

Deleting all comments via database is not an option because I need to retain a large number of legitimate comments on OTHER nodes. However, this specific node has been spammed and I wish to delete the node and all associated comments, But I can't. I have disabled commenting on the node, but how can I remove these comments? Any ideas?

     

回答列表

3
 
vote
vote
最佳答案
 

我认为你可以通过数据库删除注释,将删除限制为附加到涉及节点的那些。

可能是一个简单的:

  DELETE FROM comment WHERE nid = <the involved node id>   

以确保避免任何问题(或者如果有一些微妙的东西,我错过了)您可以先执行等效的 SELECT 并控制其结果:

  SELECT * FROM comment WHERE nid = <the involved node id>   

显然,您不应该执行 DELETE 查询,而无需先前备份。


编辑:作为非专家,我只提出了检查 998887669 表时似乎是显而易见的。
但感谢@MPD评论,我意识到还有一些链接数据也考虑。

关于字段,在查看表定义后,我认为附加的 998876610 查询应该被执行首先(在删除评论本身之前),类似于:
  function MYMODULE_theme($existing, $type, $theme, $path){   return array(     // user profile 2 form     'custom_profile_form'=>array(       'render element'=>'form',       'template'=>'custom-profile-form'     ), 1  

如果添加了不幸的是,添加了补充评论,则应为每个问题执行类似的查询。

关于"NOTEDELEDEXED" 。 "节点统计信息不会更新。" ,我不是专业,以了解所涉及的内容。
所以我希望@MPD能够带来自己的互补信息。

 

I think you could delete the comments via database, limiting the deletion to those attached to the involved node.

It might be a simple as this:

DELETE FROM comment WHERE nid = <the involved node id> 

To ensure avoiding any issue (or in case there is something subtle I missed) you can first execute the equivalent SELECT and control its results:

SELECT * FROM comment WHERE nid = <the involved node id> 

And obviously you shouldn't execute the DELETE query without previously getting a backup.


EDIT: as a non-expert, I only proposed what seemed obvious when examining the comment table.
But thanks to @MPD comment, I realize that there are some linked data to also consider.

Regarding fields, after looking at the tables definition I think that an additional DELETE query should be executed first (before deleting comments themselves), something like:

DELETE FROM field_data_comment_body WHERE entity_type = "comment" AND entity_id IN (   SELECT cid   FROM comment   WHERE nid = <the involved node id> ) 

If unfortunately supplemental comments had been added, a similar query should be executed also for each of them.

Regarding "The node won't be reindexed." and "Node statistics won't be updated.", I'm not expert enough to understand what is involved.
So I hope @MPD will be able to bring its own complementary information.

 
 
     
     
1
 
vote

可能在您的PHP设置中耗尽时间或内存。如果您可以暂时允许PHP拥有许多众多,您可以通过更改PHP.ini中的值,然后再次尝试删除节点来解决问题。

如果您有访问权限,请告诉您的限制因素审核Web服务器错误日志。

如果您习惯于编写脚本,您也可以编写一个简单的疏士脚本,它将使用 node_delete()。 PHP CLI并不时间限制,所以如果这是你的反击,你就不会遇到一段时间。

 

Likely you are running out of time or memory in your PHP setup. If you can temporarily allow PHP to have a great deal more of both you might be able to solve the problem just by changing values in php.ini and then trying again to delete the node.

To tell which is your limiting factor review the web server error log if you have access.

If you are comfortable writing a script, you could also write a simple drush script that would delete the one node using node_delete(). PHP Cli is not time limited so if that's the limit you're fighting you will not run into a time out.

 
 
 
 
1
 
vote

如果您有疏浚到您的服务器,可以使用 drush php-script 命令(或 drush scr for short)来运行完整的Drupal引导程序的顶部。这允许您运行您在服务器上的Drupal模块中通常可用的任何Drupal函数或访问信息,而无需编写整个自定义模块以进行一次性操作。

使用comment_delete_multiple()删除注释将确保删除其他字段数据,并且在删除过程中会更新统计信息。此脚本应该完成作业。 在运行之前备份数据库!

  <?php  // Change this to the nid you want to clear comments from $nid = 12345;  // Queries the database for all comment IDs associated with the nid, max 1000 $cids = db_select('comment', 'c')   ->fields('c', array('cid'))   ->condition('c.nid', $nid)   ->range(0, 1000)   ->execute()   ->fetchCol();  if (!count($cids)) {   drush_print("No more comments found. Aborting.");    // Abort with an error code (so a bash script can key off that)   exit(1); }  // Delete the comments with comment IDs we got from the DB comment_delete_multiple($cids); drush_print(count($cids) . " comments deleted");   

将此脚本上传到Web服务器,您可以使用 99887663 从本地计算机(使用正确配置的疏浚别名)或服务器本身执行它。由于您需要多次运行它(它一次只删除1000个注释,以避免超时或内存错误),您可能希望使用Cron作业,或带有循环的Bash脚本,继续运行它,直到删除所有注释。这是一个应该这样做的bash脚本:

  #!/bin/bash  while drush @your-server-alias scr /path/to/script/on/server/so.php; do     sleep 1 done   

如果您有疏浚配置为从本地通信,则可以在服务器本身或本地计算机上运行Bash脚本。如果在脚本运行时获得500错误或其他故障,则可能需要减少 99887665 行上的第二个值。 (在没有评论的情况下,通过PHP脚本的设计,您将看到一端的一个错误,所以不要担心)

 

If you have drush access to your server, you can use the drush php-script command (or drush scr for short) to run a script on top of a full Drupal bootstrap. This allows you to run any Drupal functions or access information you'd customarily have available in a Drupal module on your server, without the overhead of writing an entire custom module for a one-time operation.

Using comment_delete_multiple() to delete comments will ensure that additional field data is removed and statistics get updated during the deletion process. This script should get the job done. Back up your database before running!

<?php  // Change this to the nid you want to clear comments from $nid = 12345;  // Queries the database for all comment IDs associated with the nid, max 1000 $cids = db_select('comment', 'c')   ->fields('c', array('cid'))   ->condition('c.nid', $nid)   ->range(0, 1000)   ->execute()   ->fetchCol();  if (!count($cids)) {   drush_print("No more comments found. Aborting.");    // Abort with an error code (so a bash script can key off that)   exit(1); }  // Delete the comments with comment IDs we got from the DB comment_delete_multiple($cids); drush_print(count($cids) . " comments deleted"); 

Upload this script to the web server and you can execute it from your local machine (with a properly configured drush alias), or the server itself, using drush @your-server-alias scr. Since you'll need to run it multiple times (it only deletes 1000 comments at a time to avoid timeouts or out-of-memory errors), you'll probably want to use a cron job, or a bash script with a while loop, to keep running it until all the comments are deleted. Here's a bash script that should do it:

#!/bin/bash  while drush @your-server-alias scr /path/to/script/on/server/so.php; do     sleep 1 done 

The bash script can be run on the server itself, or your local machine if you have drush configured to talk to your server from your local. If you get 500 errors or other failures while the script is running, you may need to decrease the second value on the ->range(0, 1000) line. (You will see one error at the end when there are no comments left, by the design of the PHP script, so don't worry about that)

 
 

相关问题

1  MailJet HTML和跟踪  ( Mailjet html and tracking ) 
由于模块开发人员没有响应 https://www.drupal.org/node / 2032343 &amp; https://www.drupal.org/node/2611824 我在这里尝试运气: 我有一个网站通过两个规则和simplenews发送电子邮件。我已经安装了MailJet,mailsystem...

2  商务添加产品属性而无需添加新产品变体  ( Commerce add product attribute without adding new product variations ) 
我已发现此商务手册:产品属性&amp;变型,它解释了字段,属性和变体之间的差异和连接,其中它们在最后分配给每个产品显示的不同产品。 我所处的情况如下。让我们说我卖午餐盒。相同的型号有5种颜色,盖子总是白色。但现在我想向商店添加一个选择,人们可以以与午餐盒相同的颜色订购盖子。我的SKU是如下: 午餐盒_red j...

0  我应该调用一个函数来在自定义内容类型模板中查询数据库吗?  ( Should i call a function to query the database in a custom content type template ) 
我在模板中调用以下函数,以进行自定义内容类型,但我的高级开发人员建议调用模板文件中的函数不是Drupal标准。 function some_function($AA_tid = 0) { $dis_pt = db_select('some_tble', 'v') ->fields('v', arra...

0  渲染地址菲尔德  ( Rendering addressfield ) 
在我的Drupal 7 Commerce网站上,我有我的结账页面,它将添加我的结算和运输配置文件。我需要只显示我的送货地址和帐单地址,而不是输入字段。 (从ERP后端提供的数据。) 所以我隐藏了一个输入字段。现在我想渲染addresfield值并将其添加到我的表单中以供显示。但我似乎无法这样做。 我的表单中有以下代码...

2  多语种分类观点 - 实体翻译  ( Multilingual taxonomy views entity translation ) 
我正在尝试使用 Entity翻译。到目前为止,即使在使用语言代码时,我也卡住了英语视图。 我正在寻找这个需要的步骤。最简单,我正在尝试根据语言创建分类术语的块或页面。 任何建议? ...

-1  有没有办法将自定义类/包装器添加到页面节点,类似于使用视图创建的页面?  ( Is there a way to add custom classes wrappers to page nodes similar to pages cr ) 
我正在研究设计师提出的5个主题颜色,我需要与特定页面相关联。主题有2个区域需要受主题颜色的影响:侧边栏和内容。 我希望将一个字段添加到基本页面内容类型链接到分类词词汇表,其中术语将是颜色,所以我可以在创建页面时选择主题。我需要将一个类添加一个术语高度,足以影响页面内容类型的所有其他字段。 这将是在视图中的行等级,其中...

1  如何用破碎的URL删除分类学期  ( How to delete a taxonomy term with a broken url ) 
我试图改变分类学术语指向的URL,以便点击它将将用户带到地图。但是,在更改URL之后,我不再能够进入术语来编辑值。 我如何在我无法访问它的编辑屏幕时切换回电源,或者删除术语? ...

1  媒体模块未正确渲染媒体的YouTube视频:YouTube  ( The media module does not correctly render youtube videos added with media yout ) 
尝试允许用户从 wysiwyg ,ckeditor 3.6,< href ="https://www.drupal.org/project/media_youtube" rel ="nofollow noreferrer" >媒体:youtube 。 这是模块配置: 然后我尝试通过向视频或嵌入代码(iframe...

1  显示在发票PDF Comperce Billy上的订单付款方法  ( Display the method of payment of an order on the invoice pdf comerce billy ) 
我安装了商务billy 。 如何在我的账单上显示付款方式? $info2 以下是我的文件"commerme_order - commerce_order - pdf.tpl.php" 的内容。 我在哪里放置代码? ...

1  向WebForm提交发送电子邮件通知  ( Sending email notifications to webform submissions ) 
我正在尝试创建一个规则,该规则将发送电子邮件到WebForm提交的列表,在创建新内容时通知它们。到目前为止,这是我有的: 事件:保存类型[类型] 的新内容后 条件:内容是类型 操作:使用规则视图显示,我正在抓住WebForm提交,然后循环发送邮件到WebForm提交的值。 一切都很好,直到我需要发送邮件。而不是...

1  视图:添加(链接到文件字段)到映像字段  ( Views add link to file field to image field ) 
在d7中,我有一个事件内容类型,其中包含图像字段("特色图像" )和文件字段("文档")。我有一个包含文档的事件的视图,并希望将链接包裹在图像周围,导致文档。这是一个 sample link 。 如何重写图像(或使用其他技术)以获取图像周围的所需链接?查看可用的令牌(我确实在图像上方添加了一秒钟的隐藏文档字段以定义...

0  如何在内容创建期间允许查看模式选择?  ( How to allow view mode selection during content creation ) 
我们有一个内容类型,基本页面,可以是三种类型 出版 网络广播 音频/视频 有一个基于基本页面类型的字段,我们切换显示的字段。因此,对于键入="音频/视频" 时,我们将显示字段A-C,但如果Type ="网络广播" ,则我们在节点编辑页面上显示字段D-G。 基于基本页面类型,节点视图应根据类型显示。我们正在考虑使...

2  如何配置总订阅模块? [关闭]  ( How to configure the total subscription module ) 
关闭。这个问题需要详细信息或清晰度。它目前不接受答案。 想要改进这个问题?添加详细信息并阐明编辑此帖的问题。 closed 4年前。 ...

1  如何使Blob文件可下载?  ( How to make blob file downloadable ) 
我已经创建了一个模块,以在Drupal 7中可用于下载Blob文件。 在我的代码下面.module文件 <?php function blobfile_block_info() { $blocks = array(); $blocks['blobfile_block'] = array( 'in...

0  如果字段是自动完成的字段,则以编程方式保存节点字段?  ( Programatically save node fields if fields is autocomplete ) 
我已经创建了一个包含3个字段的内容类型,我的一个字段是node_refrence在此文件中,我使用node_refrence填充其他节点的标题。 我正在使用这个代码。 > $node = new stdClass(); $node->type = 'application'; > node_object_pr...

1  如何引用自定义字段到内容类型条目  ( How to reference a custom field to content type entry ) 
在Drupal 7中我创建了一个"产品" 内容类型和自定义模块,它创建了一个具有字段"产品" 的实体"订单" 。 我想用来自内容类型的产品引用我的字段"产品" 。 任何建议如何使其审理? ...

0  在没有任何HTML标记的情况下获得清洁日期  ( Get clean date without any html tags ) 
我正在使用日期模块以及显示日期的视图,我需要获取日期时间戳。问题是 $fields['date_in_timestamp'] 内容在html包装。 <span class="date-display-single"> 1468473300 </span> 我只需要值,没有html。 ps:我的字段"dat...

6  Drupal_static的预期用途是什么?  ( What is the intended use of drupal static ) 
我理解Drupal静态缓存用于存储内存中的静态值,以便更快地访问它们的要求。然而,在德鲁佩尔和贡献的模块中,我倾向于看到两个不同的版本: 示例来自 drupal_is_front_page : function drupal_is_front_page() { // Use the advanced dru...

1  如何在规则操作中替换关于[node:url]的文本吗?  ( How to replace text about nodeurl within a rules action ) 
我正在使用规则模块,并在保存新时创建规则内容,发送电子邮件包含节点标题,以及节点的URL。非常直接。也就是说,我想在发送的消息之前替换网址中的文本。我正在使用str_replace(),但它不起作用。 任何建议? 更新: 路径当前看起来像这样: domain.com/cron.php/newsroom/press-...

0  单击链接时,从表中检索值并显示在WebForm字段上  ( When a link is clicked a value is retrieved from the table and displayed on a w ) 
我创建了一个带有两个按钮的基本页面,"是" 和"否" 。单击"是" 按钮时,它将引导到WebForm。 目的:当出现WebForm时,它会将表中的值显示为字段。 数据库 表名:房间 领域:房间 数据:培训室 基本页 webform 我为此功能创建了一个模块: test_presa...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.