사이트맵을 리소스 단위로 영속화(sitemap_urls)해 진정한 증분 갱신과 도메인 재쿼리 없는 파일 재작성을 구현했다. 리소스 공개/비공개/삭제 시 해당 항목만 색인이 갱신되고, 관리자=full·스케줄러=auto·리소스 변경=증분으로 동작한다. - sitemap_urls 마이그레이션 + SitemapUrl 모델. loc(2048) 를 unique 에 직접 넣으면 InnoDB 키 길이를 초과하므로 loc_hash(sha256) 컬럼을 identity 로 사용 - SitemapUrlRepository(멱등 upsert / remove / 스트리밍) + SitemapIndexer (+ 제3자용 sitemap.index.collect_for_resource 필터 훅) - 4 리스너 재배선: 공개→색인 / 비공개·삭제→색인 해제 + 재생성 잡 디바운스 디스패치. 3 기여자가 resource_type/resource_id 를 함께 emit 해 전체·증분 identity 를 일치 - 재생성 모드를 SitemapGenerationMode Backed Enum 으로 통일(Command→Job→Manager) - seo:generate-sitemap 에 --rebuild / --mode 옵션 추가
49 lines
1.5 KiB
PHP
49 lines
1.5 KiB
PHP
<?php
|
|
|
|
namespace App\Enums;
|
|
|
|
/**
|
|
* 사이트맵 재생성 모드 Enum
|
|
*
|
|
* SitemapManager::regenerate 와 GenerateSitemapJob, seo:generate-sitemap 커맨드가
|
|
* 공유하는 재생성 모드 도메인입니다.
|
|
*
|
|
* - Full: 저장소 상태와 무관하게 각 기여자를 스트리밍해 sitemap_urls 를 전량 대체한 뒤 파일 재작성.
|
|
* - Auto: 저장소가 비어 있으면 Full, 아니면 Incremental 로 동작(스케줄러 기본).
|
|
* - Incremental: 기여자 재쿼리 없이 저장소의 현재 델타만으로 파일 재작성.
|
|
*/
|
|
enum SitemapGenerationMode: string
|
|
{
|
|
/**
|
|
* 전체 재생성 (관리자 수동 = 항상 Full)
|
|
*/
|
|
case Full = 'full';
|
|
|
|
/**
|
|
* 자동 판정 (빈 저장소=Full / 채워짐=Incremental)
|
|
*/
|
|
case Auto = 'auto';
|
|
|
|
/**
|
|
* 증분 재생성 (저장소 델타만 파일로 반영)
|
|
*/
|
|
case Incremental = 'incremental';
|
|
|
|
/**
|
|
* 저장소 상태를 반영해 실제 실행 모드(Full 또는 Incremental)로 해석합니다.
|
|
*
|
|
* Auto 는 저장소가 비어 있으면 Full, 아니면 Incremental 로 해석됩니다.
|
|
*
|
|
* @param int $visibleCount 저장소의 공개 URL 수
|
|
* @return self 실제 실행 모드 (Full | Incremental)
|
|
*/
|
|
public function resolve(int $visibleCount): self
|
|
{
|
|
return match ($this) {
|
|
self::Full => self::Full,
|
|
self::Incremental => self::Incremental,
|
|
self::Auto => $visibleCount === 0 ? self::Full : self::Incremental,
|
|
};
|
|
}
|
|
}
|