13000 노드 삭제


9

Drupal 7 사이트에서 약 13000 개의 노드를 삭제할 수 있습니다. 한 번에 500 개의 노드를 삭제하기 위해 Views Bulk Operations 모듈을 시도 했지만 시간이 초과되었습니다. 한 번에 50 개의 노드 만 삭제할 수 있습니다.

한 번에 50 개가 넘는 노드를 어떻게 삭제합니까?


예전에는 "bulk delete"모듈이 있었지만 VBO anwyay에 유리하게 사용되지 않습니다. 그러나 VBO는 일괄 처리를 지원하는 것 같습니다. 당신은 그것을 사용하려고 했습니까?
Mołot

1
아래 답변에 표시된 것처럼 VBO가 갈 길입니다. 이 경우보다 훨씬 더 많은 노드를 삭제해야 할 때 내가 한 일은 해킹 모듈이 필요하지 않은 많은 후크 호출을 무시하도록 호출하는 것입니다. (나의 최악의 범죄자는 아파치 솔러였다). 이로 인해 작업 속도가 크게 빨라질 수 있지만, 각별히주의를 기울여야합니다.
Letharion 2016 년

답변:


16

VBO는 대량 삭제 노드에 대한 사실상의 표준이며이를 수행하는 더 좋은 방법은 없습니다.

VBO는 일괄 처리하므로 한 번에 1 개 (또는 몇 개의) 노드 만 수행합니다. 따라서 시간 초과 오류가 발생 하면 전체 일괄 작업이 아닌 단일 노드 삭제와 관련된 오류가 발생 합니다.

이와 같은 표준 해상도 는 PHP 최대 실행 시간늘려서 보상하는 것입니다.


2
답을 완성하기 만하면됩니다 : 작업을 위해 몇 개의 엔티티를 선택해야하는지 선택할 수 있습니다. 100을 사용하면 내 경험에서 ~ 1 분 안에 잘 작동합니다.
AyeshK

7

Devel을 설치하십시오. 그런 다음 D7의 admin / config / development / generate / content로 이동하여 모든 컨텐츠 유형을 선택하십시오. "모든 컨텐츠 삭제"를 확인하십시오. "몇 개의 노드를 생성 하시겠습니까?"에 0을 입력하십시오.

생성을 클릭하십시오.

모든 노드가 삭제됩니다.


1
@ Mołot ' Check "모든 컨텐츠 삭제" '... ""노드를 몇 개 생성 하시겠습니까? "에 0을 입력하십시오." ' ...;)
Clive

@Clive OK, 내 실수, 죄송합니다.
Mołot

1
특히,이를 수행하는 것은 Devel Generate 모듈입니다. Devel과 함께 제공되지만 Devel 만 활성화하면이 기능을 사용할 수 없습니다. 모든 것을 삭제하지 않으려는 경우 특정 컨텐츠 유형의 모든 노드 이 방법으로 쉽게 삭제할 수도 있습니다 . 여전히 PHP 시간 초과가 발생하고 CLI를 두려워하지 않으면 Devel Generate와 함께 제공 되는 Drush generate-content( genc) 명령을 사용할 수도 있습니다 . drush help genc사용법 정보를 위해.
개럿 올브라이트

3

VBO를 사용하여 Drush에서 실행하십시오. 스케일 테스트 후 다음 방법을 사용하여 150 만 개가 넘는 노드를 삭제했습니다.

  1. 페이지가있는 새보기를 작성하십시오. 삭제하려는 노드 유형 만 표시하도록 필터를 적절하게 설정하십시오.
  2. 새 필드 추가 : "대량 작업 : 내용"
  3. '선택한 대량 작업'에서 '항목 삭제'옆의 확인란을 선택하십시오.
  4. 보기를 저장하십시오.
  5. Drush를 사용하는 방법을 알고 있다고 가정하면 다음 명령을 실행하십시오.

drush vbo-execute my_view action :: views_bulk_operations_delete_item

여기서 my_view 는 뷰의 시스템 이름입니다.

drush vbo-list 를 사용하여 사용 가능한 모든보기 및 대량 작업을 표시 할 수도 있습니다 .

이제 VBO가 셸에서 실행되어 피드백을 제공합니다.


2

삭제 모든 거기 모듈. 사이트에서 모든 노드 및 / 또는 사용자를 삭제합니다.

또한 Drush를 지원합니다.

예 :

drush delete-all article             Delect all article nodes.  
drush delete-all all                 Delete nodes of all types.  
drush delete-all --reset             Delete nodes of all types, and reset node, revision and comment counters.  
drush delete-all users               Delete users.

7
이 모듈을 사용하지 않는 것이 좋습니다. 스크립트에서 시간 제한을 30 초로 설정 하고 각 노드를 개별적으로 실행하여 호출합니다 node_delete()(더 이상 사용하지 않아도됩니다 node_delete_multiple()). 더 걱정스럽게도 필드 API를 사용하지 않고 후크를 사용하지 않고 데이터베이스 테이블에서 직접 데이터를 삭제하는 옵션이 있습니다. 배치 작업이 전혀 없으며 스크립트가 종료 될 때까지 실행됩니다. 매우 위험한 모듈 IMHO.
Clive

2
수행중인 작업을 알고 백업을 수행하는 경우에도 여전히 유용 할 수 있습니다. 모든 후크와 API를 호출하는 동안 수천 개의 노드를 삭제하면 매우 느려질 수 있습니다. :(
Letharion 2016 년

@Letharion 고통도없고 이득도 없습니다.) 물론 그렇습니다.하지만이 모듈은 잘못된 손에 물건을 지저분하게 만들 수 있기 때문에 이것에 대한 면책 ​​조항을 낫게하는 것이 좋습니다!
Clive

@Clive drush delete-all article기사를 삭제 하려고 할 때 drush 지원 을 통해이 솔루션을 사용할 것입니다.
AjitS 2016 년

@develkar 수백 개의 노드는 괜찮지 만 drush 확장 기능은 온 사이트 버전과 정확히 동일한 기능을 사용하므로 불행히도 타임 아웃에 취약합니다.
Clive


0

귀하의 경우처럼 대량으로 노드를 삭제하는 경우 (예 : 대량)이를 위해 대량 삭제 모듈 을 사용할 수도 있습니다 .

node_delete_multiple ()을 한 번 호출하여 수천 개의 노드를 삭제할 때 시간 초과 또는 메모리 문제를 피하기 위해 배치 API를 사용하여 노드를 삭제합니다.

이 외에도 컨텐츠 유형의 모든 노드를 삭제하기 위해 모든 모듈 삭제를 시도 할 수도 있습니다 .

도움이 되었기를 바랍니다.


0

BATCH API를 사용하여 배치 프로세스를 만들 수도 있으며 해당 배치 프로세스에서

foreach($nodes as $node){ node_delete($node[nid]);}

그게 다야. 당신은 여기에 있습니다. drush 명령을 작성하려면 작성할 수도 있습니다. 참고로 이것 좀 봐주세요 .


0

코드로 작성해야 할 이유가있는 경우 :

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->propertyOrderBy('nid', 'DESC')
  ->range(1000, 1000);

$result = $query->execute();
node_delete_multiple(array_keys($result['node']));

삭제할 노드를 선택 하는사용할 수있는 다른 방법많이 있습니다 .


0

Bobik의 조언을 받아 실제로 꼬집음에 빠지면 'drush php-eval'의 주장으로 피드를 제공 할 수 있지만 성능은 VBO의 성능과 비슷하지만 약간 더 빠를 것으로 기대합니다. 성능이 실제로 느린 경우 '_node_delete ('에 대한 코드베이스를 그랩 한 다음 해당 후크를 사용하는 일부 모듈을 사용 안함으로 설정할 수 있는지 여부를 판별하여 hook_node_delete를 호출하는 모듈을 살펴볼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.