현재 성능과 관련하여 몇 가지 모듈을 개선하려고합니다.
일부 사용자는 콜렉션 에서 메소드 의 사용법을 알고있을 수 있으며 이는 제품을 직접 루핑하는 것을 피하는 데 매우 유용합니다.walk()
또한 @Vinai 덕분에 수집 delete()
방법을 사용할 수도 있습니다 .
그러나 Magento 1 기본 파일이 항상 이러한 방법을 사용하여 삭제하는 것은 아닙니다.
내가 본 최악의 코드 중 하나는 삭제 전에 제품이 루프에로드 되는 massDelete()
방법입니다 .app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php
foreach ($productIds as $productId) {
$product = Mage::getSingleton('catalog/product')->load($productId);
Mage::dispatchEvent('catalog_controller_product_delete', array('product' => $product));
$product->delete();
}
그래서 몇 가지 성능 테스트를 수행하고 소요 시간과 100 제품 삭제에 대한 메모리 사용량을 확인하기 위해 로깅 호출을 추가했습니다.
시험 1 : walk
방법
위에 붙여 넣은 원래 코드를이 코드로 바꿨습니다.
$collection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('entity_id')
->addIdFilter($productIds)
->walk('delete');
그리고 내 결과는 내 crappy dev 서버에서 다음과 같습니다 (평균 10 테스트 기준).
- 원본 코드 : 19.97 초, 15.84MB 사용
- 맞춤 코드 : 17.12 초, 15.45MB 사용
따라서 100 개의 제품을 삭제하는 경우 사용자 지정 코드가 3 초 빨라지고 0.4MB가 줄어 듭니다.
테스트 2 : 수집 delete()
방법 사용
원래 코드를 다음 코드로 바꿨습니다.
$collection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('entity_id')
->addIdFilter($productIds)
->delete();
그리고 마음이 불어 여기 결과는 다음과 같습니다
- 원본 코드 : 19.97 초, 15.84MB 사용
- 맞춤 코드 : 1.24 초, 6.34MB 사용
따라서 100 개의 제품을 삭제하면 사용자 지정 코드가 18 초 빨라지고 9MB가 줄어 듭니다.
주석에서 언급 했듯이이 방법은 Magento 이벤트 (로드 후, 삭제 후) 또는 인덱스 / 캐시 플러시를 트리거하지 않는 것처럼 보입니다.
질문
그래서 내 질문은 : Magento 핵심 팀이 루프에 제품을로드하는 대신 walk('delete')
수집 delete()
방법을 더 잘 사용하지 않는 이유가 있습니까?
주요 목표는 모듈 개발의 경우 이러한 핵심 사항을 인식하는 것입니다 . walk
/ 수집 delete()
방법을 사용할 수없는 특별한 경우가 있습니까?
편집 : 이유는 Magento 코어 catalog_controller_product_delete
의 여러 곳에서 동일한 코드를 찾을 수 있기 때문에 이벤트가 전달 되기 때문이 아닙니다 massDelete
. 제품의 예를 사용하여 일반적으로 가장 큰 엔티티이므로 성능을 강조했습니다.
delete()
컬렉션을로드하고 각 제품을 삭제하는 대신 DELETE 쿼리를 만듭니다. 그것으로 당신은 정말로 사건을 풀어 놓을 것입니다.
getSingleton()
명백한 컬렉션 사용 대신에 성능 측정으로 사용됩니다. 아 그리고walk()
바로 가기가 아닌 컬렉션으로 이벤트를 트리거 할 수 있습니다 .