English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文
소개
Faker Storage는 대량의 가짜 데이터 파일을 효율적으로 생성하고 저장하기 위해 설계된 고성능 PHP 패키지입니다. 동시성을 염두에 두고 구축되어, Swoole 또는 PCNTL을 활용하여 수천 개의 파일을 병렬로 생성할 수 있어 로드 테스트, 개발 환경 및 저장 시스템 벤치마킹에 적합합니다.
이 패키지는 이미지(PNG, JPG, GIF, BMP, WEBP, AVIF), 텍스트 파일, CSV 파일, 이진 데이터 및 RFC822 호환 이메일 등 다양한 파일 유형을 생성하기 위한 유창한 API를 제공합니다. 각 생성기는 시드를 사용하여 결정론적 출력을 생성하여 환경 간에 재현 가능한 테스트 데이터를 보장합니다.
주요 기능
- 고성능 동시성: 병렬 파일 생성을 위한 Swoole(코루틴)와 PCNTL(프로세스 포킹) 간의 자동 선택
- 다중 파일 생성기: 이미지, 텍스트, CSV, 이진 및 이메일 파일에 대한 기본 지원
- 결정론적 출력: 시드 기반 생성을 통해 재현 가능한 결과 보장
- 유연한 저장소: 모든 League Flysystem 어댑터(로컬, S3 등)와 함께 작동
- 사용자 정의 파일 이름 지정: 완전한 제어를 통한 클로저 기반 이름 생성
- 이미지 지원: 구성 가능한 차원과 압축을 가진 여러 형식
- 이메일 생성: 첨부 파일과 MIME 지원을 갖춘 RFC822 호환 이메일
예제
use DefectiveCode\Faker\Faker;use League\Flysystem\Filesystem;use DefectiveCode\Faker\Generators\Png;use League\Flysystem\Local\LocalFilesystemAdapter; // 10개의 동시 작업자로 1000개의 PNG 이미지를 생성합니다.Faker::make(Png::class) ->width(800, 1920) ->height(600, 1080) ->toDisk(new Filesystem(new LocalFilesystemAdapter('/path/to/storage'))) ->basePath('images') ->count(1000) ->concurrency(10) ->seed(42) ->generate(); // CSV 파일 생성use DefectiveCode\Faker\Generators\Csv; Faker::make(Csv::class) ->columns(5, 10) ->rows(100, 500) ->delimiter(',') ->toDisk(new Filesystem(new LocalFilesystemAdapter('/path/to/storage'))) ->count(50) ->generate(); // 첨부파일이 있는 이메일 생성use DefectiveCode\Faker\Generators\Email; Faker::make(Email::class) ->paragraphs(3, 5) ->sentences(2, 4) ->withAttachment(Png::class, 1, 3) ->toDisk(new Filesystem(new LocalFilesystemAdapter('/path/to/storage'))) ->count(100) ->generate();
설치
Composer를 통해 패키지를 설치합니다:
composer require defectivecode/faker-storage
요구 사항
- PHP >= 8.4
- ext-gd (이미지 생성을 위해)
- ext-swoole (선택 사항, 성능 향상을 위해)
- ext-pcntl (동시성 수행을 위한 대체)
선택적 종속성
최적의 성능을 위해 Swoole 확장을 설치합니다:
pecl install swoole
패키지는 사용 가능한 경우 자동으로 Swoole을 사용하고 그렇지 않으면 PCNTL로 대체합니다.
사용법
기본 워크플로
모든 생성기는 동일한 패턴을 따릅니다:
- 생성기를 사용하여 Faker 인스턴스를 생성합니다.
- 생성기를 구성합니다(선택 사항).
- 저장소 대상을 설정합니다.
- 동시성과 수를 구성합니다.
- 파일을 생성합니다.
use DefectiveCode\Faker\Faker;use League\Flysystem\Filesystem;use DefectiveCode\Faker\Generators\Text;use League\Flysystem\Local\LocalFilesystemAdapter; Faker::make(Text::class) ->paragraphs(5, 10) // 생성기 특정 구성 ->toDisk(new Filesystem(new LocalFilesystemAdapter('/storage'))) ->basePath('documents') // 파일은 /storage/documents/에 저장됩니다. ->count(100) // 100개의 파일을 생성합니다. ->concurrency(4) // 4개의 작업자를 사용합니다. ->seed(123) // 결정론적 출력을 위해 ->generate();
저장소 구성
Flysystem 사용
Faker Storage는 저장소 추상화를 위해 League Flysystem을 사용합니다:
use League\Flysystem\Filesystem;use League\Flysystem\Local\LocalFilesystemAdapter; // 로컬 저장소$filesystem = new Filesystem(new LocalFilesystemAdapter('/path/to/storage')); Faker::make(Png::class) ->toDisk($filesystem) ->generate();
AWS S3 저장소
use Aws\S3\S3Client;use League\Flysystem\Filesystem;use League\Flysystem\AwsS3V3\AwsS3V3Adapter; $client = new S3Client([ 'credentials' => [ 'key' => 'your-key', 'secret' => 'your-secret', ], 'region' => 'us-east-1', 'version' => 'latest',]); $adapter = new AwsS3V3Adapter($client, 'your-bucket-name');$filesystem = new Filesystem($adapter); Faker::make(Png::class) ->toDisk($filesystem) ->basePath('uploads/images') ->generate();
디스크 옵션
파일 시스템 어댑터에 추가 옵션을 전달합니다:
Faker::make(Png::class) ->toDisk($filesystem) ->diskOptions([ 'visibility' => 'public', 'ACL' => 'public-read', 'CacheControl' => 'max-age=31536000', ]) ->generate();
동시성 구성
concurrency() 메서드를 사용하여 병렬 실행을 제어합니다:
// 10개의 작업 스레드/프로세스를 사용합니다.Faker::make(Png::class) ->concurrency(10) ->generate(); // Swoole 전용: 스레드당 스레드와 코루틴을 설정합니다.Faker::make(Png::class) ->concurrency(threads: 4, coroutines: 8) // 4개의 작업자, 각 8개의 코루틴 ->generate();
파일 이름 지정
기본 이름 지정
기본적으로 파일은 UUID v4를 사용하여 명명됩니다:
// 생성: e7f0a8d3-5c2b-4f9e-8a1d-3b4c5d6e7f8a.pngFaker::make(Png::class)->generate();
내장 이름 생성기
use DefectiveCode\Faker\NameGenerator; // UUID 기반(기본값)NameGenerator::setDefault('uuid'); // 생성: e7f0a8d3-5c2b-4f9e-8a1d-3b4c5d6e7f8a.png // 순차적 번호 매기기NameGenerator::setDefault('sequence'); // 생성: 1.png, 2.png, 3.png, ...
사용자 정의 이름 지정
파일 이름을 사용자 정의하기 위해 클로저를 제공합니다:
use DefectiveCode\Faker\NameGenerator; // 사용자 정의 클로저Faker::make(Png::class) ->nameGenerator(function (int $seed, int $completedFiles, $generator) { return "custom-{$completedFiles}-{$seed}.png"; }) ->generate(); // 날짜 기반 이름 지정Faker::make(Png::class) ->nameGenerator(function (int $seed, int $completedFiles, $generator) { return date('Y/m/d') . "/image-{$completedFiles}.png"; }) ->generate();
재현 가능성을 위한 시딩
같은 파일을 생성하기 위해 시드를 설정합니다:
Faker::make(Png::class) ->seed(42) ->count(10) ->generate();
각 파일은 기본 시드와 파일 인덱스에서 파생된 고유 결정론적 시드를 가집니다.
생성기
이미지 생성기
모든 이미지 생성기는 차원 및 품질 구성을 지원합니다.
PNG
use DefectiveCode\Faker\Generators\Png; Faker::make(Png::class) ->width(800, 1920) // 800-1920px 사이의 난수 폭 ->height(600, 1080) // 600-1080px 사이의 난수 높이 ->withAlpha(true) // 알파/투명도 채널 활성화 ->grid(5) // 선택 사항: 5x5 대칭 패턴 생성 ->toDisk($filesystem) ->generate();
JPG
use DefectiveCode\Faker\Generators\Jpg; Faker::make(Jpg::class) ->width(800, 1920) // 800-1920px 사이의 난수 폭 ->height(600, 1080) // 600-1080px 사이의 난수 높이 ->grid(5) // 선택 사항: 5x5 대칭 패턴 생성 ->toDisk($filesystem) ->generate();
GIF
use DefectiveCode\Faker\Generators\Gif; Faker::make(Gif::class) ->width(800, 1920) // 800-1920px 사이의 난수 폭 ->height(600, 1080) // 600-1080px 사이의 난수 높이 ->withAlpha(true) // 알파/투명도 채널 활성화 ->grid(5) // 선택 사항: 5x5 대칭 패턴 생성 ->toDisk($filesystem) ->generate();
BMP
use DefectiveCode\Faker\Generators\Bmp; Faker::make(Bmp::class) ->width(800, 1920) // 800-1920px 사이의 난수 폭 ->height(600, 1080) // 600-1080px 사이의 난수 높이 ->grid(5) // 선택 사항: 5x5 대칭 패턴 생성 ->toDisk($filesystem) ->generate();
WEBP
use DefectiveCode\Faker\Generators\Webp; Faker::make(Webp::class) ->width(800, 1920) // 800-1920px 사이의 난수 폭 ->height(600, 1080) // 600-1080px 사이의 난수 높이 ->withAlpha(true) // 알파/투명도 채널 활성화 ->grid(5) // 선택 사항: 5x5 대칭 패턴 생성 ->toDisk($filesystem) ->generate();
AVIF
use DefectiveCode\Faker\Generators\Avif; Faker::make(Avif::class) ->width(800, 1920) // 800-1920px 사이의 난수 폭 ->height(600, 1080) // 600-1080px 사이의 난수 높이 ->withAlpha(true) // 알파/투명도 채널 활성화 ->grid(5) // 선택 사항: 5x5 대칭 패턴 생성 ->toDisk($filesystem) ->generate();
랜덤 이미지
무작위 이미지 형식을 생성합니다:
use DefectiveCode\Faker\Generators\RandomImage; Faker::make(RandomImage::class) ->width(800, 1920) ->height(600, 1080) ->withAlpha(false) // AVIF, BMP, GIF, JPEG, PNG, WEBP 중 무작위 선택 ->toDisk($filesystem) ->generate(); Faker::make(RandomImage::class) ->width(800, 1920) ->height(600, 1080) ->withAlpha(true) // AVIF, GIF, PNG, WEBP 중 무작위 선택 ->toDisk($filesystem) ->generate();
텍스트 생성기
단락이 있는 일반 텍스트 파일을 생성합니다:
use DefectiveCode\Faker\Generators\Text; Faker::make(Text::class) ->paragraphs(5, 10) // 파일당 5-10개의 단락 ->sentences(3, 6) // 단락당 3-6개의 문장 ->toDisk($filesystem) ->generate();
출력 예시:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
CSV 생성기
무작위 데이터로 CSV 파일을 생성합니다:
use DefectiveCode\Faker\Generators\Csv; Faker::make(Csv::class) ->columns(5, 10) // 5-10열 ->rows(100, 500) // 100-500행 ->delimiter(',') // 열 구분자 ->enclosure('"') // 필드 둘러싸기 ->escape('\\') // 이스케이프 문자 ->eol("\n") // 줄 끝 ->toDisk($filesystem) ->generate();
출력 예시:
"John Doe","john@example.com","555-1234","New York","Engineer""Jane Smith","jane@example.com","555-5678","Los Angeles","Designer""Bob Johnson","bob@example.com","555-9012","Chicago","Manager"
이진 생성기
무작위 이진 데이터를 생성합니다:
use DefectiveCode\Faker\Generators\Binary; Faker::make(Binary::class) ->length(1024, 1048576) // 1KB - 1MB ->toDisk($filesystem) ->generate();
이메일 생성기
RFC822 호환 이메일 파일을 생성합니다:
use DefectiveCode\Faker\Generators\Email; Faker::make(Email::class) ->paragraphs(3, 5) // 이메일 본문에 포함될 단락 수 ->sentences(2, 4) // 단락당 문장 수 ->withAttachment(Png::class, 1, 3) // 1-3개의 PNG 첨부파일 추가 ->toDisk($filesystem) ->generate();
이메일 헤더
생성된 이메일에는 다음이 포함됩니다:
To: 무작위 이름 및 이메일From: 무작위 이름 및 이메일Subject: 무작위 문장Date: 현재 타임스탬프Message-ID: 시드를 기반으로 한 결정론적 ID
첨부파일이 있는 이메일
생성기 클래스 이름 또는 인스턴스를 사용하여 파일을 첨부합니다:
use DefectiveCode\Faker\Generators\Email;use DefectiveCode\Faker\Generators\Png;use DefectiveCode\Faker\Generators\Pdf; Faker::make(Email::class) ->withAttachment(Png::class, 1, 3) // 1-3개의 PNG 첨부파일 ->generate(); // 구성된 생성기 인스턴스를 사용하여 첨부$pngGenerator = new Png(Png::getDefaultConfig());$pngGenerator->width(400, 800)->height(300, 600); Faker::make(Email::class) ->withAttachment($pngGenerator, 2, 5) ->generate();
출력 예시:
To: John Doe <john.doe@example.com>From: Jane Smith <jane.smith@example.com>Subject: Important meeting tomorrowDate: Fri, 03 Jan 2026 10:30:00 +0000Message-ID: <3e92e5c2b0d632b3a36fbbb17484b7fe@example.com>Content-Type: multipart/mixed; boundary="----=_Part_123" ------=_Part_123Content-Type: text/plain; charset=utf-8Content-Transfer-Encoding: quoted-printable Lorem ipsum dolor sit amet, consectetur adipiscing elit... ------=_Part_123Content-Type: image/png; name="attachment.png"Content-Disposition: attachment; filename="attachment.png"Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==------=_Part_123--
고급 사용법
사용자 정의 생성기
Generator 인터페이스를 구현하여 사용자 정의 생성기를 만듭니다:
use DefectiveCode\Faker\Configs\Config;use DefectiveCode\Faker\Concerns\SetsSeed;use DefectiveCode\Faker\Generators\Generator;use DefectiveCode\Faker\Concerns\PreparesFaker; class MyCustomGenerator implements Generator{ use PreparesFaker; use SetsSeed; public function __construct(public Config $config) {} public static function getDefaultConfig(): Config { return new MyCustomConfig([ 'contentType' => 'application/x-custom', 'nameGenerator' => NameGenerator::default('extension'), ]); } public function generate(): mixed { // 생성 로직 여기에 $data = $this->faker->randomElement(['foo', 'bar', 'baz']); $stream = fopen('php://temp', 'w+'); fwrite($stream, $data); return $stream; }} // 사용자 정의 생성기 사용Faker::make(MyCustomGenerator::class) ->toDisk($filesystem) ->generate();
구성 클래스
각 생성기는 Config를 확장하는 구성 클래스를 사용합니다:
use DefectiveCode\Faker\Configs\Config; class MyCustomConfig extends Config{ public int $minValue = 1; public int $maxValue = 100;}
성능 팁
- Swoole 사용: 최상의 성능을 위해 Swoole 확장을 설치합니다.
- 동시성 조정: 최적의 처리량을 위해 스레드 수를 CPU 코어 수에 맞춥니다.
- 배치 운영: 여러 개의 작은 실행보다 대량 배치를 생성합니다.
- 저장소 위치: 업로드 전에 임시 파일을 위해 빠른 저장소(SSD, 로컬 디스크)를 사용합니다.
- 네트워크 I/O: S3를 사용할 때 대역폭 사용량을 극대화하기 위해 동시성을 증가시킵니다.
구성
전역 구성 메서드
이 메서드는 모든 Faker 인스턴스에서 사용할 수 있습니다:
make(string $generator): Faker
지정된 생성기로 새 Faker 인스턴스를 생성합니다:
Faker::make(Png::class)
toDisk(Filesystem $filesystem): Faker
저장소 대상을 설정합니다(필수):
Faker::make(Png::class) ->toDisk(new Filesystem(new LocalFilesystemAdapter('/storage')))
basePath(string $basePath): Faker
파일 시스템 내의 기본 경로를 설정합니다:
Faker::make(Png::class) ->basePath('images/uploads') // 파일은 /storage/images/uploads/에 저장됩니다.
count(int $count): Faker
생성할 파일 수를 설정합니다:
Faker::make(Png::class) ->count(1000)
concurrency(int $threads, ?int $coroutines = null): Faker
병렬 실행을 구성합니다:
// 기본 동시성Faker::make(Png::class) ->concurrency(4) // Swoole 전용: 스레드와 코루틴Faker::make(Png::class) ->concurrency(threads: 4, coroutines: 8)
seed(int $seed): Faker
결정론적 생성을 위한 시드를 설정합니다:
Faker::make(Png::class) ->seed(42)
nameGenerator(Closure $generator): Faker
파일 이름 지정을 사용자 정의합니다:
Faker::make(Png::class) ->nameGenerator(function (int $seed, int $completedFiles, $generator) { return "file-{$completedFiles}.png"; })
diskOptions(array $diskOptions): Faker
파일 시스템 어댑터에 옵션을 전달합니다:
Faker::make(Png::class) ->diskOptions([ 'visibility' => 'public', 'ACL' => 'public-read', ])
generate(): void
파일 생성을 실행합니다:
Faker::make(Png::class)->generate();
지원 지침
우리의 오픈 소스 패키지를 선택해 주셔서 감사합니다! 이 지원 지침을 확인하는데 잠시 시간을 할애해 주세요. 이 지침은 우리 프로젝트를 최대한 활용하는 데 도움이 될 것입니다.
커뮤니티 주도 지원
우리의 오픈 소스 프로젝트는 훌륭한 커뮤니티에 의해 구동됩니다. 질문이 있거나 도움이 필요하다면 StackOverflow와 다른 온라인 리소스가 최선의 선택입니다.
버그 및 기능 우선순위
오픈 소스 프로젝트를 관리하는 현실은 모든 보고된 버그나 기능 요청을 즉시 처리할 수 없다는 것입니다. 우리는 문제를 다음과 같은 순서로 우선 처리합니다:
1. 유료 제품에 영향을 주는 버그
우리의 유료 제품에 영향을 미치는 버그는 항상 최우선 순위입니다. 경우에 따라 우리에게 직접적인 영향을 미치는 버그만 처리할 수도 있습니다.
2. 커뮤니티 풀 리퀘스트
버그를 발견하고 해결책이 있다면, 풀 리퀘스트를 제출해 주세요. 우리 제품에 영향을 미치는 문제 다음으로, 이러한 커뮤니티 주도 수정을 우선적으로 처리합니다. 리뷰하고 승인된 후, 귀하의 해결책을 병합하고 기여를 인정할 것입니다.
3. 재정적 지원
언급된 범주 외의 문제에 대해서는 해결을 위한 자금을 기부할 수 있습니다. 각 열려 있는 문제는 재정적으로 기여할 수 있는 주문 양식에 연결되어 있습니다. 제공된 자금 금액에 따라 이러한 문제를 우선 처리합니다.
커뮤니티 기여
오픈 소스는 커뮤니티가 활발할 때 성장합니다. 버그를 수정하지 않더라도 코드 개선, 문서 업데이트, 튜토리얼, 또는 커뮤니티 채널에서 다른 사람들을 도와주는 방식으로 기여하는 것을 고려해 보세요. 우리는 모두가 커뮤니티로서 오픈 소스 작업을 지원하는 것을 강력히 권장합니다.
다시 말해, DefectiveCode는 유료 제품에 영향을 미치는 정도, 커뮤니티 풀 리퀘스트 및 문제에 대한 재정적 지원을 기반으로 버그를 우선 처리할 것입니다.
라이선스 - MIT 라이선스
Copyright © Defective Code, LLC. 모든 권리 보유.
본 소프트웨어 및 관련 문서 파일(이하 "소프트웨어")의 사본을 얻은 모든 개인에게 무료로 사용 권한이 부여되며, 소프트웨어를 제한 없이 사용할 수 있습니다. 여기에는 소프트웨어를 사용, 복사, 수정, 병합, 게시, 배포, 서브 라이센스 및/또는 판매하는 권리가 포함되며, 소프트웨어가 제공된 사람에게 그러한 권한을 허용하는 것이 포함됩니다. 단, 다음 조건을 준수해야 합니다:
위의 저작권 고지 및 이 사용 허가 고지는 소프트웨어의 모든 복사본 또는 상당 부분에 포함되어야 합니다.
소프트웨어는 "있는 그대로" 제공되며, 명시적이거나 암시적인 어떤 종류의 보증도 없이 제공됩니다. 여기에는 상업성, 특정 목적에 대한 적합성 및 비침해성에 대한 보증이 포함되지만 이에 국한되지 않습니다. 어떤 경우에도 저자나 저작권자는 계약, 불법행위 또는 기타 방식으로 소프트웨어 또는 소프트웨어의 사용이나 기타 거래와 관련하여 발생하는 어떤 청구, 손해 또는 기타 책임에 대해 책임을 지지 않습니다.