English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文
- Введение
- Установка
- Использование
- Генераторы
- Расширенное использование
- Конфигурация
- Руководство по поддержке
- Лицензия - MIT Лицензия
Введение
Faker Storage — это высокопроизводительный пакет PHP, разработанный для эффективного создания и хранения больших объемов файлов с фейковыми данными. Созданный с учетом параллелизма, он использует Swoole или PCNTL для генерации тысяч файлов одновременно, что делает его идеальным для нагрузочного тестирования, разработки и оценки систем хранения.
Пакет предоставляет плавный API для генерации различных типов файлов, включая изображения (PNG, JPG, GIF, BMP, WEBP, AVIF), текстовые файлы, CSV файлы, двоичные данные и электронные письма, соответствующие стандарту RFC822. Каждый генератор вырабатывает детерминированный результат при использовании начального значения (seed), обеспечивая воспроизводимость тестовых данных в разных средах.
Ключевые особенности
- Высокопроизводительный параллелизм: Автоматический выбор между Swoole (корутины) и PCNTL (разветвление процессов) для параллельного создания файлов
- Несколько генераторов файлов: Встроенная поддержка изображений, текстов, CSV, двоичных данных и электронных писем
- Детерминированный вывод: Генерация на основе начального значения обеспечивает воспроизводимые результаты
- Гибкое хранение: Работает с любым адаптером League Flysystem (локальное, S3 и др.)
- Настраиваемое именование файлов: Генерация имен на основе замыканий с полным контролем
- Поддержка изображений: Несколько форматов с настраиваемыми размерами и сжатием
- Генерация электронных писем: Электронные письма, соответствующие стандарту RFC822, с вложениями и поддержкой MIME
Пример
use DefectiveCode\Faker\Faker;use League\Flysystem\Filesystem;use DefectiveCode\Faker\Generators\Png;use League\Flysystem\Local\LocalFilesystemAdapter; // Генерация 1000 PNG изображений с 10 параллельными рабочими процессами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 до 1920 пикселей ->height(600, 1080) // Случайная высота от 600 до 1080 пикселей ->withAlpha(true) // Включить альфа-канал/прозрачность ->grid(5) // Необязательно: генерировать симметричный узор 5x5 ->toDisk($filesystem) ->generate();
JPG
use DefectiveCode\Faker\Generators\Jpg; Faker::make(Jpg::class) ->width(800, 1920) // Случайная ширина от 800 до 1920 пикселей ->height(600, 1080) // Случайная высота от 600 до 1080 пикселей ->grid(5) // Необязательно: генерировать симметричный узор 5x5 ->toDisk($filesystem) ->generate();
GIF
use DefectiveCode\Faker\Generators\Gif; Faker::make(Gif::class) ->width(800, 1920) // Случайная ширина от 800 до 1920 пикселей ->height(600, 1080) // Случайная высота от 600 до 1080 пикселей ->withAlpha(true) // Включить альфа-канал/прозрачность ->grid(5) // Необязательно: генерировать симметричный узор 5x5 ->toDisk($filesystem) ->generate();
BMP
use DefectiveCode\Faker\Generators\Bmp; Faker::make(Bmp::class) ->width(800, 1920) // Случайная ширина от 800 до 1920 пикселей ->height(600, 1080) // Случайная высота от 600 до 1080 пикселей ->grid(5) // Необязательно: генерировать симметричный узор 5x5 ->toDisk($filesystem) ->generate();
WEBP
use DefectiveCode\Faker\Generators\Webp; Faker::make(Webp::class) ->width(800, 1920) // Случайная ширина от 800 до 1920 пикселей ->height(600, 1080) // Случайная высота от 600 до 1080 пикселей ->withAlpha(true) // Включить альфа-канал/прозрачность ->grid(5) // Необязательно: генерировать симметричный узор 5x5 ->toDisk($filesystem) ->generate();
AVIF
use DefectiveCode\Faker\Generators\Avif; Faker::make(Avif::class) ->width(800, 1920) // Случайная ширина от 800 до 1920 пикселей ->height(600, 1080) // Случайная высота от 600 до 1080 пикселей ->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) // От 1КБ до 1МБ ->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: Детерминированный идентификатор на основе начального значения
Электронная почта с вложениями
Прикрепите файлы, используя классы или экземпляры генераторов:
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 для лучшей производительности
- Настройте параллелизм: Соответствуйте количеству потоков количеству ядер ЦП для оптимального пропускной способности
- Пакетные операции: Генерируйте большие партии, а не несколько мелких запусков
- Место хранения: Используйте быстрое хранилище (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 Лицензия
Авторские права © Defective Code, LLC. Все права защищены
Настоящим предоставляется разрешение, безвозмездно, любому лицу, получающему копию этого программного обеспечения и сопутствующих документационных файлов (далее «Программное обеспечение»), пользоваться Программным обеспечением без ограничений, включая, но не ограничиваясь правами использовать, копировать, изменять, сливать, публиковать, распространять, предоставлять сублицензии и/или продавать копии Программного обеспечения, а также разрешать лицам, которым предоставляется Программное обеспечение, делать это, при соблюдении следующих условий:
Указанные выше авторские права и данное разрешение должны быть включены во все копии или значительные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ГАРАНТИЙ ЛЮБОГО ВИДА, ЯВНЫХ ИЛИ ИМПЛИЦИТНЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОРГОВОЙ ПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ И НАРУШЕНИЯ ПРАВ. В НИКАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ДЕРЖАТЕЛИ АВТОРСКИХ ПРАВ НЕ НЕСУТ ОТВЕТСТВЕННОСТЬ ЗА ЛЮБЫЕ ИСКИ, УЩЕРБ ИЛИ ДРУГИЕ ОБЯЗАТЕЛЬСТВА, НИ В КАКОМ УКАЗАНИИ, ДОГОВОРЕ, ДЕЛИКТЕ ИЛИ ИНОМ, ВЫТЕКАЮЩИЕ ИЗ, ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ СДЕЛКАМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.