← 이전 · README로 돌아가기 · 다음 →
생성 및 스케줄
활성화된 모든 피드를 생성하려면 다음 콘솔 명령을 사용하십시오.
php artisan feed:generate
그 결과 feeds 테이블 또는 config/feeds.php 파일에서 지정한 테이블의 모든 활성 피드(is_active = true)가 실행됩니다.
매개변수 없이 명령을 호출하면 is_active 속성이 false인 피드를 포함한 모든 피드의 링크가 콘솔에 표시됩니다.
단, 이러한 피드는 실행되지 않고 SKIP 상태로 표시됩니다.
단일 피드
지정한 피드는 데이터베이스의 feeds 테이블에서 비활성화되어 있어도 실행됩니다.
특정 피드를 생성하려면 feeds 테이블의 피드 slug를 매개변수로 전달하여 feed:generate 콘솔 명령을 호출하십시오.
php artisan feed:generate products
선택한 출력 파일 생성
별도 출력 파일이 설정된 피드에서는 등록 slug가 피드 클래스를 선택하고 대상 키가 파트너, 스토어, 로케일 또는 기타 출력 하나를 선택합니다.
--target 없이 피드를 실행하면 targets()를 지연 방식으로 소비하여 모든 대상을 생성합니다.
php artisan feed:generate products
반복 가능한 --target 옵션을 전달하여 선택한 대상만 생성하십시오.
php artisan feed:generate products --target=42
php artisan feed:generate products --target=42 --target=81
명시적인 키는 targets()를 열거하는 대신 findTarget()을 사용합니다. 중복 키는 처음 나타난 순서를 유지하며 한 번만 처리됩니다. 요청한 모든 키는 생성이 시작되기 전에 해석됩니다.
--target에는 하나의 피드 등록 slug가 필요합니다. 명령은 비어 있거나 알 수 없는 키를 거부하며, HasFeedTargets를 구현하지 않은 피드의 대상 선택도 거부합니다.
전체 대상 열거는 스트리밍되며 원자적이지 않습니다. targets()가 일부 값을 반환한 뒤 실패하면 앞선 대상은 이미 생성되었거나 큐에 추가되었을 수 있습니다. 빈 이터러블은 아무것도 생성하지 않으며 암시적인 기본 대상도 만들지 않습니다.
AI 에이전트 출력
feed:generate가 Laravel Agent Detector가 인식하는 AI 코딩 에이전트 안에서 실행되면 진행률 표시줄과 형식화된 상태 줄 대신 단일 JSON 객체를 자동으로 출력합니다. 명령 옵션은 필요하지 않습니다. 인식된 에이전트 외부에서는 기존 콘솔 출력이 그대로 유지됩니다.
직접 생성할 때는 생성된 각 피드에 게시된 모든 파일과 레코드 수가 포함됩니다.
{
"tool": "feed:generate",
"result": "success",
"feeds": [
{
"class": "App\\Feeds\\SitemapFeed",
"status": "generated",
"files": [
{
"path": "/var/www/html/storage/app/public/sitemap.xml",
"records": 1250
}
]
},
{
"class": "App\\Feeds\\DisabledFeed",
"status": "skipped"
}
]
}
명령은 한 줄로 된 압축 JSON을 출력합니다. 위 예제는 읽기 쉽도록 형식만 지정했습니다.
| 상태 | 의미 | 추가 필드 |
|---|---|---|
generated | 피드 파일을 직접 생성했습니다. | 각 파일의 path와 records를 포함하는 files |
queued | 큐 모드가 활성화되어 있으며 에이전트를 위해 피드 작업을 동기적으로 실행했습니다. | 없음 |
skipped | 피드가 비활성 상태이고 피드 slug 없이 명령을 실행했습니다. | 없음 |
대상별 generated 또는 queued 항목에는 선택한 키를 담은 target 필드도 포함됩니다.
큐 모드에서 에이전트 전용 경로는 JSON 결과를 반환하기 전에 활성화된 각 작업을 동기적으로 실행합니다. 사람이 읽는 형식의 기존 경로는 구성된 큐 연결을 통해 계속 작업을 전달합니다.
이 JSON 래퍼는 실행에 성공한 경우에만 사용됩니다. 생성 중 예외가 발생하면 Laravel이 일반적인 방식으로 명령 오류를 처리하며 JSON 오류 래퍼는 출력되지 않습니다.
큐
기본적으로 피드 생성은 콘솔 프로세스에서 실행됩니다. 실행 시간이 길거나 메모리를 많이 사용하는 피드는 환경에서 Laravel Queue 모드를 활성화하십시오.
FEED_QUEUE_ENABLED=true
FEED_QUEUE_CONNECTION=redis
FEED_QUEUE_NAME=feeds
FEED_QUEUE_UNIQUE_TTL=3600
큐 모드가 활성화되면 feed:generate는 일반 활성 피드마다 하나의 작업을, 대상별 피드에서 선택된 각 대상마다 하나의 작업을 전달합니다. 비동기 연결에서는 작업 전달이 끝나면 명령이 반환됩니다. 작업을 처리하려면 선택한 연결과 큐에 대한 큐 워커를 시작하십시오.
FEED_QUEUE_CONNECTION은 큐 연결을 선택합니다. 설정되지 않으면QUEUE_CONNECTION, 그다음database를 사용합니다.FEED_QUEUE_NAME은 해당 연결의 큐를 선택합니다. 연결의 기본 큐를 사용하려면 설정하지 마십시오.FEED_QUEUE_UNIQUE_TTL은 고유성 잠금의 최대 수명을 초 단위로 설정합니다. 일반 작업은 피드 클래스별로 고유합니다. 대상별 작업은 피드 클래스와 대상 키의 조합으로 고유하며, 대상 매개변수는 이 식별자를 변경하지 않습니다.
sync 연결은 각 작업을 콘솔 프로세스에서 즉시 실행합니다. 생성을 워커로 옮기려면 비동기 연결을 선택하십시오. 작업을 전달하지 않고 피드를 직접 생성하려면 FEED_QUEUE_ENABLED=false로 설정하십시오.
스케줄
등록 표현식
피드 등록 정보를 생성할 때 원시 cron 표현식 문자열을 전달하거나, DragonCode\LaravelFeed\Scheduling\Expression을 메서드 체인으로 구성해 전달할 수 있습니다.
use App\Feeds\ProductFeed;
use DragonCode\LaravelFeed\Queries\FeedQuery;
use DragonCode\LaravelFeed\Scheduling\Expression;
app(FeedQuery::class)->create(
class: ProductFeed::class,
title: 'Products',
expression: (new Expression)
->weekly()
->mondays()
->at('13:00'),
);
메서드 체인 예제는 0 13 * * 1을 저장합니다. dragonmantank/cron-expression이 지원하는 @daily 같은 별칭을 포함한 원시 문자열도 계속 지원됩니다.
사용 가능한 메서드 체인은 설치된 Laravel 버전이 제공하는 스케줄 빈도 옵션을 따릅니다. 현재 목록은 Laravel 13 빈도 참고 문서를 참조하십시오. 결과를 안정적인 5개 필드 cron 표현식으로 저장할 수 있는 메서드만 제공됩니다. 이 값 객체에서는 1분 미만 간격, 시간대, 시간 구간 제약 조건 및 lastDayOfMonth()을 사용할 수 없습니다.
자동
피드 생성을 자동화하려면 스케줄을 사용하십시오. 변경하지 않았다면 기본 경로인 routes/console.php 파일에 헬퍼 호출을 지정합니다.
use DragonCode\LaravelFeed\Helpers\ScheduleFeedHelper;
use Illuminate\Support\Facades\Schedule;
ScheduleFeedHelper::register();
Schedule::call(function () {
// ... other action
})->everySecond();
이렇게 하면 데이터베이스의 expression 열에 따라 모든 활성 피드가 등록됩니다. 스케줄에 등록된 대상별 피드는 targets()가 반환하는 모든 값을 생성합니다.
수동
자체 규칙에 따라 스케줄을 직접 지정할 수도 있습니다. 이 경우 지정한 피드만 실행됩니다.
use DragonCode\LaravelFeed\Commands\FeedGenerateCommand;
use Illuminate\Support\Facades\Schedule;
Schedule::command(FeedGenerateCommand::class, ['products'])
->withoutOverlapping()
->runInBackground()
->daily();
Schedule::command(FeedGenerateCommand::class, ['sitemap'])
->withoutOverlapping()
->runInBackground()
->hourly();
Schedule::call(function () {
// ... other action
})->everySecond();