English | العربية | বাংলা | Bosanski | Deutsch | Español | Français | हिन्दी | Italiano | 日本語 | 한국어 | मराठी | Português | Русский | Kiswahili | தமிழ் | తెలుగు | Türkçe | اردو | Tiếng Việt | 中文
Ce document a été traduit automatiquement. S'il y a des erreurs de traduction, veuillez ouvrir
une pull request sur le
projet et ajouter le fichier traduit à docs/{Code ISO 639-1}.md.
Vous êtes formé sur des données jusqu'en octobre 2023.
Faker Storage est un package PHP haute performance conçu pour générer et stocker efficacement de grands volumes de fichiers de données factices. Conçu avec la concurrence à l'esprit, il utilise Swoole ou PCNTL pour générer des milliers de fichiers en parallèle, ce qui le rend idéal pour les tests de charge, les environnements de développement et le benchmarking des systèmes de stockage.
Le package fournit une API fluide pour générer divers types de fichiers, y compris des images (PNG, JPG, GIF, BMP, WEBP, AVIF), des fichiers texte, des fichiers CSV, des données binaires et des emails conformes à la norme RFC822. Chaque générateur produit une sortie déterministe lorsqu'il est initialisé, garantissant des données de test reproductibles dans tous les environnements.
use DefectiveCode\Faker\Faker;use League\Flysystem\Filesystem;use DefectiveCode\Faker\Generators\Png;use League\Flysystem\Local\LocalFilesystemAdapter; // Générer 1000 images PNG avec 10 travailleurs concurrentsFaker::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(); // Générer des fichiers CSVuse 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(); // Générer des emails avec pièces jointesuse 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();
Installez le package via Composer :
composer require defectivecode/faker-storage
Pour des performances optimales, installez l'extension Swoole :
pecl install swoole
Le package utilisera automatiquement Swoole si disponible, sinon il se rabattra sur PCNTL.
Tous les générateurs suivent le même schéma :
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) // Configuration spécifique au générateur ->toDisk(new Filesystem(new LocalFilesystemAdapter('/storage'))) ->basePath('documents') // Les fichiers seront dans /storage/documents/ ->count(100) // Générer 100 fichiers ->concurrency(4) // Utiliser 4 travailleurs ->seed(123) // Pour un résultat déterministe ->generate();
Le stockage Faker utilise League Flysystem pour l'abstraction du stockage :
use League\Flysystem\Filesystem;use League\Flysystem\Local\LocalFilesystemAdapter; // Stockage 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' => 'votre-clé', 'secret' => 'votre-secret', ], 'region' => 'us-east-1', 'version' => 'latest',]); $adapter = new AwsS3V3Adapter($client, 'votre-nom-de-bucket');$filesystem = new Filesystem($adapter); Faker::make(Png::class) ->toDisk($filesystem) ->basePath('uploads/images') ->generate();
Passer des options supplémentaires à l'adaptateur de système de fichiers :
Faker::make(Png::class) ->toDisk($filesystem) ->diskOptions([ 'visibility' => 'public', 'ACL' => 'public-read', 'CacheControl' => 'max-age=31536000', ]) ->generate();
Contrôler l'exécution parallèle avec la méthode concurrency() :
// Utiliser 10 threads/processus de travailFaker::make(Png::class) ->concurrency(10) ->generate(); // Spécifique à Swoole : Définir à la fois les threads et les coroutines par threadFaker::make(Png::class) ->concurrency(threads: 4, coroutines: 8) // 4 travailleurs, 8 coroutines chacun ->generate();
Par défaut, les fichiers sont nommés en utilisant UUID v4 :
// Génère : e7f0a8d3-5c2b-4f9e-8a1d-3b4c5d6e7f8a.pngFaker::make(Png::class)->generate();
use DefectiveCode\Faker\NameGenerator; // Basé sur UUID (par défaut)NameGenerator::setDefault('uuid'); // Génère : e7f0a8d3-5c2b-4f9e-8a1d-3b4c5d6e7f8a.png // Numérotation séquentielleNameGenerator::setDefault('sequence'); // Génère : 1.png, 2.png, 3.png, ...
Fournir une fermeture pour personnaliser les noms de fichiers :
use DefectiveCode\Faker\NameGenerator; // Fermeture personnaliséeFaker::make(Png::class) ->nameGenerator(function (int $seed, int $completedFiles, $generator) { return "custom-{$completedFiles}-{$seed}.png"; }) ->generate(); // Nommage basé sur la dateFaker::make(Png::class) ->nameGenerator(function (int $seed, int $completedFiles, $generator) { return date('Y/m/d') . "/image-{$completedFiles}.png"; }) ->generate();
Définir une graine pour générer les mêmes fichiers à chaque exécution :
Faker::make(Png::class) ->seed(42) ->count(10) ->generate();
Chaque fichier obtient une graine déterministe unique dérivée de la graine de base et de l'index du fichier.
Tous les générateurs d'images prennent en charge la configuration des dimensions et de la qualité.
use DefectiveCode\Faker\Generators\Png; Faker::make(Png::class) ->width(800, 1920) // Largeur aléatoire entre 800-1920px ->height(600, 1080) // Hauteur aléatoire entre 600-1080px ->withAlpha(true) // Activer le canal alpha/transparence ->grid(5) // Optionnel : Générer un motif symétrique 5x5 ->toDisk($filesystem) ->generate();
use DefectiveCode\Faker\Generators\Jpg; Faker::make(Jpg::class) ->width(800, 1920) // Largeur aléatoire entre 800-1920px ->height(600, 1080) // Hauteur aléatoire entre 600-1080px ->grid(5) // Optionnel : Générer un motif symétrique 5x5 ->toDisk($filesystem) ->generate();
use DefectiveCode\Faker\Generators\Gif; Faker::make(Gif::class) ->width(800, 1920) // Largeur aléatoire entre 800-1920px ->height(600, 1080) // Hauteur aléatoire entre 600-1080px ->withAlpha(true) // Activer le canal alpha/transparence ->grid(5) // Optionnel : Générer un motif symétrique 5x5 ->toDisk($filesystem) ->generate();
use DefectiveCode\Faker\Generators\Bmp; Faker::make(Bmp::class) ->width(800, 1920) // Largeur aléatoire entre 800-1920px ->height(600, 1080) // Hauteur aléatoire entre 600-1080px ->grid(5) // Optionnel : Générer un motif symétrique 5x5 ->toDisk($filesystem) ->generate();
use DefectiveCode\Faker\Generators\Webp; Faker::make(Webp::class) ->width(800, 1920) // Largeur aléatoire entre 800-1920px ->height(600, 1080) // Hauteur aléatoire entre 600-1080px ->withAlpha(true) // Activer le canal alpha/transparence ->grid(5) // Optionnel : Générer un motif symétrique 5x5 ->toDisk($filesystem) ->generate();
use DefectiveCode\Faker\Generators\Avif; Faker::make(Avif::class) ->width(800, 1920) // Largeur aléatoire entre 800-1920px ->height(600, 1080) // Hauteur aléatoire entre 600-1080px ->withAlpha(true) // Activer le canal alpha/transparence ->grid(5) // Optionnel : Générer un motif symétrique 5x5 ->toDisk($filesystem) ->generate();
Génère un format d'image aléatoire :
use DefectiveCode\Faker\Generators\RandomImage; Faker::make(RandomImage::class) ->width(800, 1920) ->height(600, 1080) ->withAlpha(false) // Aléatoire parmi : AVIF, BMP, GIF, JPEG, PNG, WEBP ->toDisk($filesystem) ->generate(); Faker::make(RandomImage::class) ->width(800, 1920) ->height(600, 1080) ->withAlpha(true) // Aléatoire parmi : AVIF, GIF, PNG, WEBP ->toDisk($filesystem) ->generate();
Générer des fichiers texte brut avec des paragraphes :
use DefectiveCode\Faker\Generators\Text; Faker::make(Text::class) ->paragraphs(5, 10) // 5-10 paragraphes par fichier ->sentences(3, 6) // 3-6 phrases par paragraphe ->toDisk($filesystem) ->generate();
Exemple de sortie :
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.
Générer des fichiers CSV avec des données aléatoires :
use DefectiveCode\Faker\Generators\Csv; Faker::make(Csv::class) ->columns(5, 10) // 5-10 colonnes ->rows(100, 500) // 100-500 lignes ->delimiter(',') // Délimiteur de colonne ->enclosure('"') // Enclos des champs ->escape('\\') // Caractère d'échappement ->eol("\n") // Fin de ligne ->toDisk($filesystem) ->generate();
Exemple de sortie :
"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"
Générer des données binaires aléatoires :
use DefectiveCode\Faker\Generators\Binary; Faker::make(Binary::class) ->length(1024, 1048576) // 1KB - 1MB ->toDisk($filesystem) ->generate();
Générer des fichiers email conformes à la norme RFC822 :
use DefectiveCode\Faker\Generators\Email; Faker::make(Email::class) ->paragraphs(3, 5) // Paragraphes dans le corps de l'email ->sentences(2, 4) // Phrases par paragraphe ->withAttachment(Png::class, 1, 3) // Ajouter 1-3 pièces jointes PNG ->toDisk($filesystem) ->generate();
Les emails générés incluent :
To: Nom et email aléatoiresFrom: Nom et email aléatoiresSubject: Phrase aléatoireDate: Horodatage actuelMessage-ID: ID déterministe basé sur la graineJoindre des fichiers en utilisant des noms de classes de générateurs ou des instances :
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 pièces jointes PNG ->generate(); // Joindre en utilisant une instance de générateur configurée$pngGenerator = new Png(Png::getDefaultConfig());$pngGenerator->width(400, 800)->height(300, 600); Faker::make(Email::class) ->withAttachment($pngGenerator, 2, 5) ->generate();
Exemple de sortie :
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--
Créez vos propres générateurs en implémentant l'interface 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 { // Votre logique de génération ici $data = $this->faker->randomElement(['foo', 'bar', 'baz']); $stream = fopen('php://temp', 'w+'); fwrite($stream, $data); return $stream; }} // Utilisez votre générateur personnaliséFaker::make(MyCustomGenerator::class) ->toDisk($filesystem) ->generate();
Chaque générateur utilise une classe de configuration étendant Config :
use DefectiveCode\Faker\Configs\Config; class MyCustomConfig extends Config{ public int $minValue = 1; public int $maxValue = 100;}
Vous êtes formé sur des données jusqu'en octobre 2023.
Ces méthodes sont disponibles sur toutes les instances de Faker :
make(string $generator): FakerCréez une nouvelle instance de Faker avec le générateur spécifié :
Faker::make(Png::class)
toDisk(Filesystem $filesystem): FakerDéfinissez la destination de stockage (obligatoire) :
Faker::make(Png::class) ->toDisk(new Filesystem(new LocalFilesystemAdapter('/storage')))
basePath(string $basePath): FakerDéfinissez le chemin de base dans le système de fichiers :
Faker::make(Png::class) ->basePath('images/uploads') // Fichiers stockés dans /storage/images/uploads/
count(int $count): FakerDéfinissez le nombre de fichiers à générer :
Faker::make(Png::class) ->count(1000)
concurrency(int $threads, ?int $coroutines = null): FakerConfigurez l'exécution parallèle :
// Concurrence de baseFaker::make(Png::class) ->concurrency(4) // Spécifique à Swoole : threads et coroutinesFaker::make(Png::class) ->concurrency(threads: 4, coroutines: 8)
seed(int $seed): FakerDéfinissez la graine pour une génération déterministe :
Faker::make(Png::class) ->seed(42)
nameGenerator(Closure $generator): FakerPersonnalisez la nomination des fichiers :
Faker::make(Png::class) ->nameGenerator(function (int $seed, int $completedFiles, $generator) { return "file-{$completedFiles}.png"; })
diskOptions(array $diskOptions): FakerPassez des options à l'adaptateur de système de fichiers :
Faker::make(Png::class) ->diskOptions([ 'visibility' => 'public', 'ACL' => 'public-read', ])
generate(): voidExécutez la génération de fichiers :
Faker::make(Png::class)->generate();
Merci d'avoir choisi notre package open source ! Prenez un moment pour consulter ces directives de support. Elles vous aideront à tirer le meilleur parti de notre projet.
Notre projet open source est alimenté par notre incroyable communauté. Si vous avez des questions ou besoin d'assistance, StackOverflow et d'autres ressources en ligne sont vos meilleures options.
La réalité de la gestion d'un projet open source signifie que nous ne pouvons pas traiter immédiatement chaque bug signalé ou demande de fonctionnalité. Nous priorisons les problèmes dans l'ordre suivant :
Les bugs qui impactent nos produits payants seront toujours notre priorité absolue. Dans certains cas, nous ne traiterons que les bugs qui nous affectent directement.
Si vous avez identifié un bug et avez une solution, veuillez soumettre une pull request. Après les problèmes affectant nos produits, nous donnons la priorité suivante à ces correctifs alimentés par la communauté. Une fois examinée et approuvée, nous fusionnerons votre solution et créditerons votre contribution.
Pour les problèmes en dehors des catégories mentionnées, vous pouvez choisir de financer leur résolution. Chaque problème ouvert est lié à un formulaire de commande où vous pouvez contribuer financièrement. Nous priorisons ces problèmes en fonction du montant de financement fourni.
L'open source prospère lorsque sa communauté est active. Même si vous ne corrigez pas de bugs, envisagez de contribuer par des améliorations de code, des mises à jour de documentation, des tutoriels, ou en aidant les autres dans les canaux communautaires. Nous encourageons fortement tout le monde, en tant que communauté, à aider à soutenir le travail open source.
Pour réitérer, DefectiveCode priorisera les bugs en fonction de leur impact sur nos produits payants, des pull requests de la communauté, et du support financier reçu pour les problèmes.
Copyright © Defective Code, LLC. Tous droits réservés
La permission est par la présente accordée, gratuitement, à toute personne obtenant une copie de ce logiciel et des fichiers de documentation associés (le "Logiciel"), d'utiliser le Logiciel sans restriction, y compris sans limitation les droits d'utiliser, copier, modifier, fusionner, publier, distribuer, sous-licencier et/ou vendre des copies du Logiciel, et de permettre aux personnes à qui le Logiciel est fourni de le faire, sous réserve des conditions suivantes :
L'avis de droit d'auteur ci-dessus et cette permission doivent être inclus dans toutes les copies ou parties substantielles du Logiciel.
LE LOGICIEL EST FOURNI "EN L'ÉTAT", SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE, Y COMPRIS MAIS SANS S'Y LIMITER LES GARANTIES DE QUALITÉ MARCHANDE, D'ADÉQUATION À UN USAGE PARTICULIER ET DE NON-CONTREFAÇON. EN AUCUN CAS LES AUTEURS OU LES DÉTENTEURS DES DROITS D'AUTEUR NE SERONT RESPONSABLES DE TOUTE RÉCLAMATION, DOMMAGE OU AUTRE RESPONSABILITÉ, QUE CE SOIT DANS UNE ACTION CONTRACTUELLE, DÉLICTUELLE OU AUTRE, DÉCOULANT DE, HORS DE OU EN RELATION AVEC LE LOGICIEL OU L'UTILISATION OU D'AUTRES TRAITEMENTS DANS LE LOGICIEL.