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. كل مولد ينتج مخرجات حتمية عند تهيئته، مما يضمن بيانات اختبار قابلة للتكرار عبر البيئات.
الميزات الرئيسية
- التزامن عالي الأداء: اختيار تلقائي بين 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(); // إنشاء ملفات 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(); // إنشاء رسائل بريد إلكتروني مع مرفقات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@example.com","555-1234","نيويورك","مهندس""جين سميث","jane@example.com","555-5678","لوس أنجلوس","مصمم""بوب جونسون","bob@example.com","555-9012","شيكاغو","مدير"
مولد ثنائي
توليد بيانات ثنائية عشوائية:
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();
مثال على المخرجات:
إلى: جون دو <john.doe@example.com>من: جين سميث <jane.smith@example.com>الموضوع: اجتماع مهم غدًاالتاريخ: الجمعة، 03 يناير 2026 10:30:00 +0000معرف الرسالة: <3e92e5c2b0d632b3a36fbbb17484b7fe@example.com>نوع المحتوى: multipart/mixed; boundary="----=_Part_123" ------=_Part_123نوع المحتوى: text/plain; charset=utf-8ترميز المحتوى: quoted-printable Lorem ipsum dolor sit amet, consectetur adipiscing elit... ------=_Part_123نوع المحتوى: image/png; name="attachment.png"توزيع المحتوى: attachment; filename="attachment.png"ترميز المحتوى: 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، قرص محلي) للملفات المؤقتة قبل التحميل
- إدخال/إخراج الشبكة: عند استخدام 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 License
حقوق الطبع والنشر © Defective Code, LLC. جميع الحقوق محفوظة
يتم منح الإذن بموجب هذا، مجانًا، لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة (الـ"برنامج")، للتعامل في البرنامج دون قيود، بما في ذلك بدون حصر الحقوق في الاستخدام والنسخ والتعديل والدمج والنشر والتوزيع والتراخيص الفرعية و/أو بيع نسخ من البرنامج، والسماح للأشخاص الذين تم تقديم البرنامج لهم بذلك، بشرط الالتزام بالشروط التالية:
يجب تضمين إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو الأجزاء الجوهرية من البرنامج.
يتم توفير البرنامج "كما هو"، دون أي ضمان من أي نوع، صريح أو ضمني، بما في ذلك ولكن لا تقتصر على ضمانات القابلية للتسويق، والملاءمة لغرض معين وعدم الانتهاك. في أي حال من الأحوال، لا يتحمل المؤلفون أو أصحاب حقوق الطبع المسؤولية عن أي مطالبة أو أضرار أو مسؤوليات أخرى، سواء كانت في إطار عقد أو ضرر أو خلاف ذلك، ناشئة عن أو نتيجة عن أو تتعلق بالبرنامج أو الاستخدام أو التعاملات الأخرى في البرنامج.