Defective Code Logo

Total Downloads Latest Stable Version Latest Stable Version

English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文

Предупреждение о переводе

Этот документ был переведен автоматически. Если есть ошибки перевода, пожалуйста, откройте pull request в проекте и добавьте переведенный файл в docs/{ISO 639-1 Code}.md.

Вы обучены на данных до октября 2023 года.

Введение

Faker Storage — это высокопроизводительный PHP-пакет, предназначенный для генерации и хранения больших объемов фальшивых данных эффективно. Разработанный с учетом параллелизма, он использует Swoole или PCNTL для генерации тысяч файлов параллельно, что делает его идеальным для нагрузочного тестирования, сред разработки и тестирования систем хранения.

Пакет предоставляет удобный API для генерации различных типов файлов, включая изображения (PNG, JPG, GIF, BMP, WEBP, AVIF), текстовые файлы, файлы CSV, двоичные данные и электронные письма, соответствующие RFC822. Каждый генератор производит детерминированный вывод при задании начального значения, обеспечивая воспроизводимые тестовые данные в разных средах.

Основные характеристики

Пример

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

Требования

Необязательные зависимости

Для оптимальной производительности установите расширение Swoole:

pecl install swoole

Пакет автоматически использует Swoole, если оно доступно, в противном случае используется PCNTL.

Использование

Основной рабочий процесс

Все генераторы следуют одной и той же схеме:

  1. Создайте экземпляр Faker с генератором
  2. Настройте генератор (опционально)
  3. Установите место хранения
  4. Настройте параллельность и количество
  5. Генерируйте файлы
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.png
Faker::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) // 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();

Заголовки электронной почты

Сгенерированные письма включают:

Электронная почта с вложениями

Прикрепление файлов с использованием имен классов генераторов или экземпляров:

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: Важная встреча завтра
Date: Fri, 03 Jan 2026 10:30:00 +0000
Message-ID: <3e92e5c2b0d632b3a36fbbb17484b7fe@example.com>
Content-Type: multipart/mixed; boundary="----=_Part_123"
 
------=_Part_123
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
 
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
 
------=_Part_123
Content-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;
}

Советы по производительности

  1. Используйте Swoole: Установите расширение Swoole для наилучшей производительности
  2. Настройте параллелизм: Соответствуйте количество потоков количеству ядер процессора для оптимальной пропускной способности
  3. Пакетные операции: Генерируйте большие пакеты вместо множества мелких запусков
  4. Место хранения: Используйте быструю память (SSD, локальный диск) для временных файлов перед загрузкой
  5. Сетевой ввод-вывод: При использовании S3 увеличьте параллелизм для максимального использования пропускной способности

Вы обучены на данных до октября 2023 года.

Конфигурация

Методы глобальной конфигурации

Эти методы доступны для всех экземпляров 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

Установить seed для детерминированной генерации:

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. Все права защищены

Настоящим предоставляется бесплатное разрешение любому лицу, получившему копию этого программного обеспечения и сопутствующих файлов документации (далее "Программное обеспечение"), использовать Программное обеспечение без ограничений, включая, помимо прочего, права на использование, копирование, изменение, объединение, публикацию, распространение, сублицензирование и/или продажу копий Программного обеспечения, а также лицам, которым предоставляется Программное обеспечение, при соблюдении следующих условий:

Указанное выше уведомление об авторских правах и данное разрешение должны быть включены во все копии или значительные части Программного обеспечения.

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ КОММЕРЧЕСКОЙ ПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ИНЫЕ ОБЯЗАТЕЛЬСТВА, НЕЗАВИСИМО ОТ ТОГО, ЯВЛЯЮТСЯ ЛИ ОНИ ДЕЙСТВИЯМИ ПО ДОГОВОРУ, ДЕЛИКТУ ИЛИ ИНЫМ ОБРАЗОМ, ВОЗНИКШИМИ ИЗ, ИЗ-ЗА ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.