تخطَّ إلى المحتوى

دليل مطوّري Cloudflare

تنقل حزمة ⁨Cloudflare⁩ تصيير صيغة المستندات المحمولة (⁨PDF⁩) إلى حدّ ⁨Worker.⁩ تعامَل مع تصيير ⁨Worker⁩، والاحتياط المحلي، وحماية واجهة برمجة التطبيقات (⁨API⁩)، وأرشيف ⁨R2⁩ بوصفها قدرات منفصلة، لكل منها معالجة الأعطال الخاصة بها.

استخدم هذا الدليل عند بناء خدمات التصيير على الحافة، أو نقاط نهاية التصيير المحمية، أو مسارات عمل الأرشفة، أو مسارات الاحتياط المحلي باستخدام nextpdf/cloudflare.

الطبقةمملوكة منالمسؤوليةما لا يُوضع هنا
نقطة نهاية التطبيقالتطبيقصرّح للمستدعي، وطبّع طلب التصيير، وافرِض سياسة العمل.رموز ⁨Worker⁩ المميزة المخزَّنة داخل الشيفرة.
حماية ⁨API⁩nextpdf/cloudflare والتطبيقفحوص مفتاح ⁨API⁩، وفحوص حجم الحمولة، وقرارات تحديد المعدّل داخل العملية.الفوترة، أو استحقاق المستأجر، أو فرض الحصص الدائمة.
مُصيّر ⁨Cloudflare⁩nextpdf/cloudflareتحقَّق من لغة ترميز النص الفائق (⁨HTML⁩) ومن محدِّد موقع الموارد الموحَّد (⁨URL⁩) الخاص بـ ⁨Worker⁩، وأرسل حمولة التصيير، وحلِّل الاستجابة.تصيير القوالب أو استعلامات المجال.
⁨Worker⁩نشر التطبيقشغّل التصيير عبر المتصفح وأعِد بايتات ⁨PDF⁩ أو نتيجة مُهيكَلة.سياسة التخزين من جانب ⁨PHP.⁩
الاحتياط المحلينشر التطبيقصيّر عندما يكون ⁨Worker⁩ غير متاح.احتياط صامت يخفي الأعطال التشغيلية.
أرشيف ⁨R2⁩nextpdf/cloudflareارفع ملفات ⁨PDF⁩، وابنِ مفاتيح الكائنات، وأنشئ عناوين ⁨URL⁩ موقَّعة.بيانات وصفية حسّاسة للأعمال دون مراجعة.
المرحلةالسلوكإجراء المطوّر
إنشاء الإعداداتيحمّل عنوان ⁨URL⁩ الخاص بـ ⁨Worker⁩، ورمز ⁨API⁩ المميز، والمهل، وحدود الحجم، والاحتياط، والتثبيتات.احتفظ بالأسرار ضمن إعدادات النشر.
حماية الطلبتتحقَّق ApiProtection الاختيارية من المفتاح، والحجم، وحدّ المعدّل.شغّلها قبل أعمال التصيير المكلفة.
استدعاء المُصيّرتتحقَّق CloudflareHtmlRenderer من ⁨HTML⁩ ومن عنوان ⁨URL⁩ الخاص بـ ⁨Worker⁩، ثم ترسل ترميز كائنات ⁨JavaScript⁩ (⁨JSON⁩).عالِج عدم توافر ⁨Worker⁩ وأعطال التصيير كلّاً على حدة.
تحليل الاستجابةتقبل CloudflareResponseParser::parse() مُخرجات ⁨PDF⁩ الثنائية أو مُخرجات ⁨JSON⁩ المُهيكَلة.ارفض المُخرجات غير الصالحة أو التي ليست ⁨PDF.⁩
الاحتياط المحلييعالج مُصيّر محلي اختياري عطل ⁨Worker.⁩احقِن مصنع مُصيّر محلياً فقط عندما يدعمه المضيف.
أرشيف ⁨R2⁩تخزّن R2ArchiveManager بايتات ⁨PDF⁩ وتنشئ عناوين ⁨URL⁩ موقَّعة.أبقِ البيانات الوصفية غير حسّاسة ما لم تخزّنها عن قصد.
المسارالغرض
app/Pdf/Cloudflare/*غلاف التطبيق لـ CloudflareHtmlRenderer.
app/Pdf/Workers/*كائنات نقل بيانات طلب ⁨Worker⁩ (⁨DTOs⁩) والسياسة الخاصة بنقطة النهاية.
app/Pdf/Archive/*تنسيق أرشيف ⁨R2⁩ وقرارات الاحتفاظ.
app/Pdf/Fallback/*تنفيذ LocalRendererFactoryInterface للاحتياط المسموح.
tests/Pdf/Cloudflare/*اختبارات تعطّل ⁨Worker⁩، والرمز المميز غير الصالح، والحمولة، والأرشيف.

أبقِ رمز ⁨API⁩ المميز الخاص بـ ⁨PHP⁩ منفصلاً عن رمز ⁨Worker⁩ المميز. يصادِق ⁨PHP⁩ على ⁨Worker.⁩ وينبغي أن يصادِق ⁨Worker⁩ على الطلبات الواردة قبل أن يبدأ عمل المتصفح.

<?php
use NextPDF\Cloudflare\ApiProtection;
use NextPDF\Cloudflare\ApiProtectionConfig;
use NextPDF\Cloudflare\ApiKeyValidator;
$protection = new ApiProtection(
new ApiProtectionConfig(maxRequestsPerMinute: 30),
new ApiKeyValidator([$expectedApiKey]),
);
$result = $protection->checkRequest(
clientId: $clientId,
payloadSize: strlen($html),
apiKey: $presentedApiKey,
);
if (!$result->allowed) {
return new JsonResponse(['error' => $result->denialReason], 429, $result->toHeaders());
}

ابنِ المُصيّر باستخدام تبعيات توصيات معايير ⁨PHP⁩ (⁨PSR⁩) من إطار عملك، بما في ذلك ⁨PSR-18⁩ و⁨PSR-17⁩. أبقِ الاحتياط المحلي صريحاً حتى يتمكّن المشغّلون من معرفة متى يتوقّف النظام عن استخدام ⁨Worker.⁩

<?php
use NextPDF\Cloudflare\CloudflareHtmlRenderer;
use NextPDF\Cloudflare\CloudflareRendererConfig;
$renderer = new CloudflareHtmlRenderer(
config: CloudflareRendererConfig::fromArray([
'worker_url' => getenv('NEXTPDF_CLOUDFLARE_WORKER_URL'),
'api_token' => getenv('NEXTPDF_CLOUDFLARE_API_TOKEN'),
'render_timeout' => 30,
'max_html_size' => 1_000_000,
'fallback_to_local' => false,
]),
httpClient: $httpClient,
requestFactory: $requestFactory,
streamFactory: $streamFactory,
);
$rendered = $renderer->render($html, widthPt: 595.28);

لا تؤرشف إلا بعد نجاح التصيير وموافقة السياسة على النتيجة. تعامَل مع عناوين ⁨URL⁩ العامة وعناوين ⁨URL⁩ الموقَّعة بوصفها قرارين منفصلين.

<?php
use NextPDF\Cloudflare\R2ArchiveManager;
$upload = $archive->upload(
pdfData: $rendered->pdfData,
filename: 'invoice-1234.pdf',
metadata: [
'document_type' => 'invoice',
],
);
if ($upload->isValid()) {
$temporaryUrl = $archive->generateSignedUrl($upload->key, 600);
}

لا تضع أسماء العملاء، أو عناوين البريد الإلكتروني، أو إجماليات الفواتير، أو المعرّفات المُنظَّمة في البيانات الوصفية للكائن ما لم تسمح سياسة الاحتفاظ والوصول لديك بذلك صراحةً.

نقطة التوسيعاستخدمها من أجلالقيد
LocalRendererFactoryInterfaceالاحتياط المحلي عبر ⁨Artisan⁩ أو مُصيّر آخر.يجب أن يُعيد كائناً يطبّق LocalRendererInterface.
ApiProtectionConfigمفتاح ⁨API⁩، وحجم الحمولة، وسياسة تحديد المعدّل.تنطبق الحدود في الذاكرة لكل عملية.
ApiKeyValidatorالتحقق من المفتاح بأمان زمني ثابت ومساعِدات تدوير المفاتيح.خزّن الأسرار خارج الشيفرة المصدرية.
R2ArchiveConfigالدلو، والاعتمادات، وبادئة المسار، ونقطة النهاية، وحدود الحجم.يجب ألا تُسجَّل الاعتمادات أبداً.
PinnedCurlTransportفرض تثبيت بروتوكول الإنترنت (⁨IP⁩) ومعلومات المفتاح العام للموضوع (⁨SPKI⁩).يتطلّب بيئة تشغيل تدعم ⁨cURL⁩ ومصنع استجابة.
CloudflareResponseParserتحليل استجابة ⁨Worker.⁩يرفض مُخرجات ⁨PDF⁩ غير الصالحة أو استجابات الخطأ.
  1. ابنِ مسار تصيير محلياً أولاً.
  2. أضِف تصيير ⁨Worker⁩ باستخدام مادة اختبار ⁨HTML⁩ صغيرة ومُمثِّلة.
  3. فعّل حماية الطلب قبل كشف نقاط النهاية العامة.
  4. أضِف رفع ⁨R2⁩ فقط بعد استقرار تدفقات التصيير والاستجابة.
  5. اختبر مسارات تعطّل ⁨Worker⁩، والرمز المميز غير الصالح، والحمولة المفرطة الحجم، وحدّ المعدّل، وفشل ⁨R2.⁩
  6. أضِف سجلات تميّز بين تصيير ⁨Worker⁩، وتصيير الاحتياط، ورفع الأرشيف، وإنشاء عنوان ⁨URL⁩ الموقَّع.
العطلأين ينبغي معالجتهالاستجابة المُوصى بها
مفتاح ⁨API⁩ مفقود أو غير صالحطبقة حماية ⁨API.⁩ارفض الطلب قبل بدء عمل التصيير.
حمولة مفرطة الحجمحماية ⁨API⁩ أو التحقق في المُصيّر.أعِد فشل تحقق دون أي استدعاء لـ ⁨Worker.⁩
عنوان ⁨URL⁩ غير آمن لـ ⁨Worker⁩سياسة أمان المُصيّر.أفشِل الإعدادات أو الطلب قبل ⁨input/output⁩ الشبكة (⁨I/O⁩).
⁨Worker⁩ غير متاححدّ المُصيّر.استخدم الاحتياط الصريح فقط عندما يكون مسموحاً به؛ وإلا فأفشِل بشكل ظاهر.
فشل رفع ⁨R2⁩حدّ الأرشيف.أعِد استجابة ⁨PDF⁩ إذا كان الأرشيف اختيارياً؛ وأفشِل العملية إذا كان الأرشيف مطلوباً بحسب السياسة.
فشل تدوير التثبيتالنشر والعمليات.دوِّر باستخدام تثبيتات احتياطية وخطة تراجع.

الإعدادات الافتراضية الآمنة

قسم بعنوان «الإعدادات الافتراضية الآمنة»
الشأنالافتراضيمتى تُلغى
الاحتياطمُفعَّل افتراضياً بحسب الإعدادات.عطّله عندما يخالف التصيير المحلي عزل النشر.
الحد الأقصى لحجم ⁨HTML⁩5,000,000 بايت.اخفضه لنقاط النهاية العامة.
مدة بقاء عنوان ⁨URL⁩ الموقَّع (⁨TTL⁩)3600 ثانية.اختصرها لملفات ⁨PDF⁩ الحسّاسة.
مجموعات التثبيتفارغة.أضِف التثبيتات فقط مع خطة تدوير وتثبيتات احتياطية.
اشتراط مفتاح ⁨API⁩مُفعَّل افتراضياً بحسب إعدادات الحماية.عطّله فقط للاستدعاءات الداخلية الخاصة المُصادَق عليها مسبقاً.
  • تغطّي اختبارات المُصيّر ⁨HTML⁩ صالحة، و⁨HTML⁩ مفرطة الحجم، وعنوان ⁨URL⁩ غير صالح لـ ⁨Worker⁩، واستجابة خطأ من ⁨Worker.⁩
  • تغطّي اختبارات حماية ⁨API⁩ مفتاحاً مفقوداً، ومفتاحاً غير صالح، وحمولة كبيرة جداً، وحدّ معدّل متجاوَزاً.
  • تغطّي اختبارات ⁨R2⁩ الرفع الناجح، والرفع الكبير جداً، وحالة بروتوكول نقل النص الفائق (⁨HTTP⁩) الفاشلة، والدلو غير الصالح، وإنشاء عنوان ⁨URL⁩ الموقَّع.
  • تتحقق اختبارات الاحتياط من أن مسار المُصيّر المحلي صريح وقابل للملاحظة.
  • تغطّي اختبارات النقل عناوين ⁨IP⁩ المثبَّتة، وتثبيتات المفتاح العام، والمهلة، وإعادة التوجيه المُعطَّلة وفقاً للسياسة.
  • تؤكّد اختبارات قابلية الملاحظة أحداث سجل متمايزة للتصيير، والاحتياط، والأرشيف، وإنشاء عنوان ⁨URL⁩ الموقَّع.