English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文
Este documento ha sido traducido automáticamente. Si hay errores de traducción, por favor abre
un pull request en el
proyecto y añade el archivo traducido a docs/{Código ISO 639-1}.md.
Estás entrenado con datos hasta octubre de 2023.
Faker Storage es un paquete de PHP de alto rendimiento diseñado para generar y almacenar grandes volúmenes de archivos de datos falsos de manera eficiente. Construido con la concurrencia en mente, aprovecha Swoole o PCNTL para generar miles de archivos en paralelo, lo que lo hace ideal para pruebas de carga, entornos de desarrollo y evaluación comparativa de sistemas de almacenamiento.
El paquete proporciona una API fluida para generar varios tipos de archivos, incluidos imágenes (PNG, JPG, GIF, BMP, WEBP, AVIF), archivos de texto, archivos CSV, datos binarios y correos electrónicos compatibles con RFC822. Cada generador produce una salida determinista cuando se siembra, asegurando datos de prueba reproducibles en todos los entornos.
use DefectiveCode\Faker\Faker;use League\Flysystem\Filesystem;use DefectiveCode\Faker\Generators\Png;use League\Flysystem\Local\LocalFilesystemAdapter; // Generar 1000 imágenes PNG con 10 trabajadores concurrentesFaker::make(Png::class) ->width(800, 1920) ->height(600, 1080) ->toDisk(new Filesystem(new LocalFilesystemAdapter('/ruta/al/almacenamiento'))) ->basePath('images') ->count(1000) ->concurrency(10) ->seed(42) ->generate(); // Generar archivos CSVuse DefectiveCode\Faker\Generators\Csv; Faker::make(Csv::class) ->columns(5, 10) ->rows(100, 500) ->delimiter(',') ->toDisk(new Filesystem(new LocalFilesystemAdapter('/ruta/al/almacenamiento'))) ->count(50) ->generate(); // Generar correos electrónicos con archivos adjuntosuse DefectiveCode\Faker\Generators\Email; Faker::make(Email::class) ->paragraphs(3, 5) ->sentences(2, 4) ->withAttachment(Png::class, 1, 3) ->toDisk(new Filesystem(new LocalFilesystemAdapter('/ruta/al/almacenamiento'))) ->count(100) ->generate();
Instala el paquete a través de Composer:
composer require defectivecode/faker-storage
Para un rendimiento óptimo, instala la extensión Swoole:
pecl install swoole
El paquete usará automáticamente Swoole si está disponible, de lo contrario, recurrirá a PCNTL.
Todos los generadores siguen el mismo patrón:
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) // Configuración específica del generador ->toDisk(new Filesystem(new LocalFilesystemAdapter('/storage'))) ->basePath('documents') // Los archivos estarán en /storage/documents/ ->count(100) // Generar 100 archivos ->concurrency(4) // Usar 4 trabajadores ->seed(123) // Para salida determinista ->generate();
Faker Storage utiliza League Flysystem para la abstracción de almacenamiento:
use League\Flysystem\Filesystem;use League\Flysystem\Local\LocalFilesystemAdapter; // Almacenamiento local$filesystem = new Filesystem(new LocalFilesystemAdapter('/path/to/storage')); Faker::make(Png::class) ->toDisk($filesystem) ->generate();
use Aws\S3\S3Client;use League\Flysystem\Filesystem;use League\Flysystem\AwsS3V3\AwsS3V3Adapter; $client = new S3Client([ 'credentials' => [ 'key' => 'tu-clave', 'secret' => 'tu-secreto', ], 'region' => 'us-east-1', 'version' => 'latest',]); $adapter = new AwsS3V3Adapter($client, 'nombre-de-tu-bucket');$filesystem = new Filesystem($adapter); Faker::make(Png::class) ->toDisk($filesystem) ->basePath('uploads/images') ->generate();
Pasa opciones adicionales al adaptador del sistema de archivos:
Faker::make(Png::class) ->toDisk($filesystem) ->diskOptions([ 'visibility' => 'public', 'ACL' => 'public-read', 'CacheControl' => 'max-age=31536000', ]) ->generate();
Controla la ejecución paralela con el método concurrency():
// Usar 10 hilos/procesos de trabajoFaker::make(Png::class) ->concurrency(10) ->generate(); // Específico de Swoole: Establecer tanto hilos como corutinas por hiloFaker::make(Png::class) ->concurrency(threads: 4, coroutines: 8) // 4 trabajadores, 8 corutinas cada uno ->generate();
Por defecto, los archivos se nombran usando UUID v4:
// Genera: e7f0a8d3-5c2b-4f9e-8a1d-3b4c5d6e7f8a.pngFaker::make(Png::class)->generate();
use DefectiveCode\Faker\NameGenerator; // Basado en UUID (predeterminado)NameGenerator::setDefault('uuid'); // Genera: e7f0a8d3-5c2b-4f9e-8a1d-3b4c5d6e7f8a.png // Numeración secuencialNameGenerator::setDefault('sequence'); // Genera: 1.png, 2.png, 3.png, ...
Proporciona un closure para personalizar los nombres de archivo:
use DefectiveCode\Faker\NameGenerator; // Closure personalizadoFaker::make(Png::class) ->nameGenerator(function (int $seed, int $completedFiles, $generator) { return "custom-{$completedFiles}-{$seed}.png"; }) ->generate(); // Nomenclatura basada en fechaFaker::make(Png::class) ->nameGenerator(function (int $seed, int $completedFiles, $generator) { return date('Y/m/d') . "/image-{$completedFiles}.png"; }) ->generate();
Establece una semilla para generar los mismos archivos en diferentes ejecuciones:
Faker::make(Png::class) ->seed(42) ->count(10) ->generate();
Cada archivo obtiene una semilla determinista única derivada de la semilla base y el índice del archivo.
Todos los generadores de imágenes soportan configuración de dimensiones y calidad.
use DefectiveCode\Faker\Generators\Png; Faker::make(Png::class) ->width(800, 1920) // Ancho aleatorio entre 800-1920px ->height(600, 1080) // Altura aleatoria entre 600-1080px ->withAlpha(true) // Habilitar canal alfa/transparencia ->grid(5) // Opcional: Generar patrón simétrico 5x5 ->toDisk($filesystem) ->generate();
use DefectiveCode\Faker\Generators\Jpg; Faker::make(Jpg::class) ->width(800, 1920) // Ancho aleatorio entre 800-1920px ->height(600, 1080) // Altura aleatoria entre 600-1080px ->grid(5) // Opcional: Generar patrón simétrico 5x5 ->toDisk($filesystem) ->generate();
use DefectiveCode\Faker\Generators\Gif; Faker::make(Gif::class) ->width(800, 1920) // Ancho aleatorio entre 800-1920px ->height(600, 1080) // Altura aleatoria entre 600-1080px ->withAlpha(true) // Habilitar canal alfa/transparencia ->grid(5) // Opcional: Generar patrón simétrico 5x5 ->toDisk($filesystem) ->generate();
use DefectiveCode\Faker\Generators\Bmp; Faker::make(Bmp::class) ->width(800, 1920) // Ancho aleatorio entre 800-1920px ->height(600, 1080) // Altura aleatoria entre 600-1080px ->grid(5) // Opcional: Generar patrón simétrico 5x5 ->toDisk($filesystem) ->generate();
use DefectiveCode\Faker\Generators\Webp; Faker::make(Webp::class) ->width(800, 1920) // Ancho aleatorio entre 800-1920px ->height(600, 1080) // Altura aleatoria entre 600-1080px ->withAlpha(true) // Habilitar canal alfa/transparencia ->grid(5) // Opcional: Generar patrón simétrico 5x5 ->toDisk($filesystem) ->generate();
use DefectiveCode\Faker\Generators\Avif; Faker::make(Avif::class) ->width(800, 1920) // Ancho aleatorio entre 800-1920px ->height(600, 1080) // Altura aleatoria entre 600-1080px ->withAlpha(true) // Habilitar canal alfa/transparencia ->grid(5) // Opcional: Generar patrón simétrico 5x5 ->toDisk($filesystem) ->generate();
Genera un formato de imagen aleatorio:
use DefectiveCode\Faker\Generators\RandomImage; Faker::make(RandomImage::class) ->width(800, 1920) ->height(600, 1080) ->withAlpha(false) // Aleatorio de: AVIF, BMP, GIF, JPEG, PNG, WEBP ->toDisk($filesystem) ->generate(); Faker::make(RandomImage::class) ->width(800, 1920) ->height(600, 1080) ->withAlpha(true) // Aleatorio de: AVIF, GIF, PNG, WEBP ->toDisk($filesystem) ->generate();
Genera archivos de texto plano con párrafos:
use DefectiveCode\Faker\Generators\Text; Faker::make(Text::class) ->paragraphs(5, 10) // 5-10 párrafos por archivo ->sentences(3, 6) // 3-6 oraciones por párrafo ->toDisk($filesystem) ->generate();
Ejemplo de Salida:
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.
Genera archivos CSV con datos aleatorios:
use DefectiveCode\Faker\Generators\Csv; Faker::make(Csv::class) ->columns(5, 10) // 5-10 columnas ->rows(100, 500) // 100-500 filas ->delimiter(',') // Delimitador de columna ->enclosure('"') // Encerramiento de campo ->escape('\\') // Carácter de escape ->eol("\n") // Fin de línea ->toDisk($filesystem) ->generate();
Ejemplo de Salida:
"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"
Genera datos binarios aleatorios:
use DefectiveCode\Faker\Generators\Binary; Faker::make(Binary::class) ->length(1024, 1048576) // 1KB - 1MB ->toDisk($filesystem) ->generate();
Genera archivos de email compatibles con RFC822:
use DefectiveCode\Faker\Generators\Email; Faker::make(Email::class) ->paragraphs(3, 5) // Párrafos en el cuerpo del email ->sentences(2, 4) // Oraciones por párrafo ->withAttachment(Png::class, 1, 3) // Añadir 1-3 adjuntos PNG ->toDisk($filesystem) ->generate();
Los emails generados incluyen:
To: Nombre y email aleatoriosFrom: Nombre y email aleatoriosSubject: Oración aleatoriaDate: Marca de tiempo actualMessage-ID: ID determinista basado en semillaAdjuntar archivos usando nombres de clases generadoras o instancias:
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 adjuntos PNG ->generate(); // Adjuntar usando instancia de generador configurada$pngGenerator = new Png(Png::getDefaultConfig());$pngGenerator->width(400, 800)->height(300, 600); Faker::make(Email::class) ->withAttachment($pngGenerator, 2, 5) ->generate();
Ejemplo de Salida:
To: John Doe <john.doe@example.com>From: Jane Smith <jane.smith@example.com>Subject: Reunión importante mañanaDate: 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--
Crea tus propios generadores implementando la interfaz 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 { // Tu lógica de generación aquí $data = $this->faker->randomElement(['foo', 'bar', 'baz']); $stream = fopen('php://temp', 'w+'); fwrite($stream, $data); return $stream; }} // Usa tu generador personalizadoFaker::make(MyCustomGenerator::class) ->toDisk($filesystem) ->generate();
Cada generador utiliza una clase de configuración que extiende Config:
use DefectiveCode\Faker\Configs\Config; class MyCustomConfig extends Config{ public int $minValue = 1; public int $maxValue = 100;}
Estás entrenado con datos hasta octubre de 2023.
Estos métodos están disponibles en todas las instancias de Faker:
make(string $generator): FakerCrea una nueva instancia de Faker con el generador especificado:
Faker::make(Png::class)
toDisk(Filesystem $filesystem): FakerEstablece el destino de almacenamiento (requerido):
Faker::make(Png::class) ->toDisk(new Filesystem(new LocalFilesystemAdapter('/storage')))
basePath(string $basePath): FakerEstablece la ruta base dentro del sistema de archivos:
Faker::make(Png::class) ->basePath('images/uploads') // Archivos almacenados en /storage/images/uploads/
count(int $count): FakerEstablece el número de archivos a generar:
Faker::make(Png::class) ->count(1000)
concurrency(int $threads, ?int $coroutines = null): FakerConfigura la ejecución en paralelo:
// Concurrencia básicaFaker::make(Png::class) ->concurrency(4) // Específico de Swoole: hilos y corrutinasFaker::make(Png::class) ->concurrency(threads: 4, coroutines: 8)
seed(int $seed): FakerEstablece la semilla para generación determinista:
Faker::make(Png::class) ->seed(42)
nameGenerator(Closure $generator): FakerPersonaliza el nombrado de archivos:
Faker::make(Png::class) ->nameGenerator(function (int $seed, int $completedFiles, $generator) { return "file-{$completedFiles}.png"; })
diskOptions(array $diskOptions): FakerPasa opciones al adaptador del sistema de archivos:
Faker::make(Png::class) ->diskOptions([ 'visibility' => 'public', 'ACL' => 'public-read', ])
generate(): voidEjecuta la generación de archivos:
Faker::make(Png::class)->generate();
¡Gracias por elegir nuestro paquete de código abierto! Por favor, tómese un momento para revisar estas directrices de soporte. Le ayudarán a sacar el máximo provecho de nuestro proyecto.
Nuestro proyecto de código abierto se alimenta de nuestra increíble comunidad. Si tiene preguntas o necesita asistencia, StackOverflow y otros recursos en línea son sus mejores opciones.
La realidad de gestionar un proyecto de código abierto significa que no podemos abordar cada error reportado o solicitud de función de inmediato. Priorizamos los problemas en el siguiente orden:
Los errores que impactan nuestros productos pagos siempre serán nuestra máxima prioridad. En algunos casos, solo podemos abordar errores que nos afectan directamente.
Si ha identificado un error y tiene una solución, por favor envíe una solicitud de extracción. Después de los problemas que afectan a nuestros productos, damos la siguiente prioridad más alta a estas correcciones impulsadas por la comunidad. Una vez revisada y aprobada, integraremos su solución y acreditaremos su contribución.
Para problemas fuera de las categorías mencionadas, puede optar por financiar su resolución. Cada problema abierto está vinculado a un formulario de pedido donde puede contribuir financieramente. Priorizamos estos problemas según la cantidad de financiación proporcionada.
El código abierto prospera cuando su comunidad está activa. Incluso si no está corrigiendo errores, considere contribuir a través de mejoras de código, actualizaciones de documentación, tutoriales o ayudando a otros en los canales de la comunidad. Animamos encarecidamente a todos, como comunidad, a ayudar a apoyar el trabajo de código abierto.
Para reiterar, DefectiveCode priorizará los errores según cómo impacten nuestros productos pagos, las solicitudes de extracción de la comunidad y el apoyo financiero recibido para los problemas.
Derechos de autor © Defective Code, LLC. Todos los derechos reservados
Por la presente se concede permiso, sin cargo, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el "Software"), para tratar el Software sin restricciones, incluyendo sin limitación los derechos de usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y/o vender copias del Software, y para permitir a las personas a quienes se les proporcione el Software hacerlo, sujeto a las siguientes condiciones:
El aviso de derechos de autor anterior y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DE LOS DERECHOS DE AUTOR SERÁN RESPONSABLES POR NINGUNA RECLAMACIÓN, DAÑOS U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O DE OTRO MODO, QUE SURJA DE, FUERA O EN CONEXIÓN CON EL SOFTWARE O EL USO U OTROS TRATOS EN EL SOFTWARE.