ข้ามไปยังเนื้อหา

ข้อมูลอ้างอิง API ของ Cloudflare

แพ็กเกจ NextPDF\Cloudflare ทำหน้าที่เชื่อมการเรนเดอร์บน edge กระบวนการ PHP จะเก็บ Hypertext Markup Language (HTML) ไว้เอง และ Cloudflare Worker จะเรียกใช้เบราว์เซอร์แบบ headless แพ็กเกจนี้มีตัวเรนเดอร์ HTML ที่ทำงานบน Worker (CloudflareHtmlRenderer) พร้อมออบเจ็กต์ค่าที่ส่งคืน ชั้นการป้องกันคำขอสำหรับปลายทางการเรนเดอร์ (ApiProtection) บริการจัดเก็บถาวร R2 สำหรับไฟล์ Portable Document Format (PDF) ที่เรนเดอร์แล้ว (R2ArchiveManager) และตัวช่วยการขนส่งแบบปักหมุดสำหรับเพิ่มความแข็งแกร่งด้าน Transport Layer Security (TLS) และ Domain Name System (DNS) การกำหนดค่าอยู่ในออบเจ็กต์ที่ไม่เปลี่ยนแปลงสามรายการ (CloudflareRendererConfig, ApiProtectionConfig, R2ArchiveConfig)

เริ่มต้นโดยสร้าง CloudflareRendererConfig เชื่อมเข้ากับ CloudflareHtmlRenderer แล้วเรียก render() การเรียกนี้จะส่ง HTML ไปยัง Worker และคืนค่า CloudflareRenderResult พร้อมไบต์ของ PDF การป้องกัน การจัดเก็บถาวร และการปักหมุดทั้งหมดจะทำงานเป็นชั้นประกอบรอบการเรียกนี้

ตัวอย่างโค้ดเหล่านี้ครอบคลุมเวิร์กโฟลว์ที่ใช้บ่อยที่สุด แต่ละรายการครบถ้วนในตัวเอง ผ่านการตรวจสอบกับ src/Cloudflare/ และอ่านค่าความลับจากสภาพแวดล้อม

เรนเดอร์สตริง HTML เป็น PDF บน edge ด้วยการเรียกมาตรฐาน:

<?php
declare(strict_types=1);
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\HttpFactory;
use NextPDF\Cloudflare\CloudflareHtmlRenderer;
use NextPDF\Cloudflare\CloudflareRendererConfig;
$httpFactory = new HttpFactory();
$renderer = new CloudflareHtmlRenderer(
config: new CloudflareRendererConfig(
workerUrl: 'https://pdf-renderer.example.workers.dev/render',
apiToken: getenv('CF_PDF_TOKEN') ?: throw new RuntimeException('CF_PDF_TOKEN not set'),
),
httpClient: new Client(),
requestFactory: $httpFactory,
streamFactory: $httpFactory,
responseFactory: $httpFactory,
);
$result = $renderer->render('<h1>Hello from the edge</h1>', widthPt: 595.28);
if ($result->isValid()) {
file_put_contents('output.pdf', $result->pdfData);
}

การทำงานนี้ส่ง HTML ไปยัง Worker ผ่าน Hypertext Transfer Protocol Secure (HTTPS) และเขียนไบต์ของ PDF ขนาด A4 ที่คืนค่ามาลงดิสก์หลังจาก isValid() ยืนยันว่าเป็น PDF จริง

จัดเก็บ PDF ที่เรนเดอร์แล้วลงใน R2 และคืนค่าลิงก์อายุสั้น:

<?php
declare(strict_types=1);
use NextPDF\Cloudflare\R2ArchiveConfig;
use NextPDF\Cloudflare\R2ArchiveManager;
$archive = new R2ArchiveManager(
config: R2ArchiveConfig::fromArray([
'bucket_name' => 'pdf-archive',
'account_id' => getenv('CF_ACCOUNT_ID') ?: '',
'access_key_id' => getenv('R2_ACCESS_KEY_ID') ?: '',
'secret_access_key' => getenv('R2_SECRET_ACCESS_KEY') ?: '',
]),
httpClient: $httpClient, // PSR-18 ClientInterface
requestFactory: $requestFactory, // PSR-17 RequestFactoryInterface
streamFactory: $streamFactory, // PSR-17 StreamFactoryInterface
);
$upload = $archive->upload($result->pdfData, 'invoice-1234.pdf');
$signedUrl = $upload->isValid()
? $archive->generateSignedUrl($upload->key, expiresInSeconds: 600)
: null;

การทำงานนี้อัปโหลดไบต์ของ PDF ไปยังคีย์ R2 ที่แบ่งพาร์ติชันตามวันที่ และเมื่อสำเร็จจะสร้าง uniform resource locator (URL) แบบ pre-signed อายุ 10 นาทีสำหรับการดาวน์โหลดชั่วคราว

ป้องกันปลายทางการเรนเดอร์ก่อนเริ่มงาน Worker ที่มีต้นทุนสูง:

<?php
declare(strict_types=1);
use NextPDF\Cloudflare\ApiKeyValidator;
use NextPDF\Cloudflare\ApiProtection;
use NextPDF\Cloudflare\ApiProtectionConfig;
$protection = new ApiProtection(
config: new ApiProtectionConfig(maxRequestsPerMinute: 30),
keyValidator: new ApiKeyValidator([getenv('RENDER_API_KEY') ?: '']),
);
$decision = $protection->checkRequest(
clientId: $clientIp,
payloadSize: strlen($html),
apiKey: $presentedApiKey,
);
if (!$decision->allowed) {
// Reject with 429 and rate-limit headers before any render call.
return [429, $decision->toHeaders(), $decision->denialReason];
}

การทำงานนี้ตรวจสอบความถูกต้องของคีย์ API และขนาดเพย์โหลด ตรวจสอบขีดจำกัดอัตราต่อไคลเอ็นต์ แล้วคืนค่าการตัดสินใจหนึ่งรายการพร้อมส่วนหัวการตอบสนองสำหรับแนบเมื่อคำขอถูกปฏิเสธ

ตารางนี้ครอบคลุมความสามารถหลักของตัวเรนเดอร์ ใช้เมื่อต้องสร้างคอนฟิก สร้างตัวเรนเดอร์ หรือเรียกใช้การเรนเดอร์และการตรวจสอบการเข้าถึง

สัญลักษณ์พารามิเตอร์พฤติกรรมเริ่มต้นคืนค่าข้อยกเว้นหรือความล้มเหลวหมายเหตุ
new CloudflareRendererConfig(string $workerUrl, string $apiToken, int $renderTimeout = 30, string $defaultCss = '', int $maxHtmlSize = 5000000, ?string $r2FontBucket = null, bool $fallbackToLocal = true, array $pinnedPublicKeys = [], array $backupPublicKeys = [])URL ของ Worker, bearer token, ค่าหมดเวลา, Cascading Style Sheets (CSS), ขีดจำกัดขนาด, R2 font bucket แบบไม่บังคับ, แฟล็กสำรอง, ชุดการปักหมุดการสำรองแบบโลคัลเปิดใช้งานอยู่ การปักหมุดจะปิดเมื่ออาร์เรย์การปักหมุดว่างเปล่าCloudflareRendererConfigไม่คาดว่าจะเกิดเก็บ API token ไว้เป็นความลับ และควรใช้ URL ของ worker แบบ HTTPS
CloudflareRendererConfig::fromArray(array $config)worker_url, api_token, render_timeout, default_css, max_html_size, r2_font_bucket, fallback_to_local, อาร์เรย์การปักหมุดคีย์แบบไม่บังคับที่ไม่ได้ระบุจะใช้ค่าเริ่มต้นของคอนสตรักเตอร์CloudflareRendererConfigไม่คาดว่าจะเกิดใช้สำหรับอาร์เรย์คอนฟิกของเฟรมเวิร์ก
CloudflareRendererConfig::isValid()ไม่มีต้องมี URL ของ worker และ API token ที่ไม่ว่างเปล่าboolไม่คาดว่าจะเกิดคอนฟิกที่ไม่ถูกต้องจะทำให้ตัวเรนเดอร์ใช้การสำรองหรือล้มเหลว
CloudflareRendererConfig::allPublicKeyPins()ไม่มีรวมการปักหมุดคีย์สาธารณะหลักและคีย์สำรองเข้าด้วยกันlist<string>ไม่คาดว่าจะเกิดรายการที่ว่างเปล่าจะปิดใช้งานการปักหมุด
new CloudflareHtmlRenderer(CloudflareRendererConfig $config, ClientInterface $httpClient, RequestFactoryInterface $requestFactory, StreamFactoryInterface $streamFactory, ?LoggerInterface $logger = null, ?LocalRendererFactoryInterface $localRendererFactory = null, ?HtmlSecurityPolicyInterface $htmlSecurityPolicy = null, ?ResponseFactoryInterface $responseFactory = null)คอนฟิก, การพึ่งพา Hypertext Transfer Protocol (HTTP) แบบ PHP Standards Recommendation (PSR), logger แบบไม่บังคับ, factory สำหรับการสำรองแบบโลคัลที่ไม่บังคับ, นโยบาย HTML แบบไม่บังคับ, response factory แบบไม่บังคับใช้ DefaultHtmlSecurityPolicy เมื่อไม่ได้ระบุนโยบาย HTMLCloudflareHtmlRendererข้อผิดพลาดในการเชื่อมต่อคอนเทนเนอร์response factory จะเปิดใช้งานการขนส่งแบบ cURL ที่ปักหมุดเมื่อจำเป็น
CloudflareHtmlRenderer::render(string $html, float $widthPt = 595.28, float $heightPt = 0, array $fontFiles = [])HTML, ความกว้างของหน้า, ความสูงของหน้า, ไฟล์ฟอนต์ใน R2ความกว้าง A4, ความสูงอัตโนมัติ, ไม่มีไฟล์ฟอนต์CloudflareRenderResultCloudflareNotAvailableException, CloudflareRenderException, ความล้มเหลวในการตรวจสอบความถูกต้องตรวจสอบความถูกต้องของขนาด HTML และ URL ของ worker ก่อนทำ input/output (I/O) ผ่านเครือข่าย
CloudflareHtmlRenderer::getHtmlSecurityPolicy()ไม่มีคืนค่านโยบายชั้นการแยกวิเคราะห์ที่กำหนดค่าไว้HtmlSecurityPolicyInterfaceไม่คาดว่าจะเกิดใช้ควบคู่กับการป้องกันปลายทางและการตรวจสอบความถูกต้องของ URL ของ Worker
CloudflareHtmlRenderer::isAvailable()ไม่มีส่งคำขอ HEAD ไปยัง worker เมื่อคอนฟิกถูกต้องboolคืนค่า false เมื่อเกิดข้อผิดพลาดใช้สำหรับการตรวจสอบความพร้อม ไม่ใช่มาตรการป้องกันขณะรันไทม์เพียงอย่างเดียว

ใช้ตารางนี้สำหรับออบเจ็กต์ค่าของคำขอและผลลัพธ์ (CloudflareRenderResult, CloudflareRenderPayload) และการตรวจสอบชั้นการขนส่งแบบสแตติก ซึ่งตรวจสอบความถูกต้องของ HTML, URL ของ Worker และการปักหมุด DNS ก่อน I/O เครือข่าย

สัญลักษณ์พารามิเตอร์พฤติกรรมเริ่มต้นคืนค่าข้อยกเว้นหรือความล้มเหลวหมายเหตุ
new CloudflareRenderResult(string $pdfData, float $widthPt, float $heightPt, float $contentHeightPx = 0.0, string $renderLocation = '', float $renderTimeMs = 0.0)ไบต์ของ PDF, ความกว้าง, ความสูง, ความสูงของเนื้อหาที่วัดได้, ตำแหน่ง edge, เวลาในการเรนเดอร์ข้อมูลเมตาจะว่างเปล่าเมื่อ Worker ไม่รายงานข้อมูลดังกล่าวCloudflareRenderResultไม่คาดว่าจะเกิดโดยปกติ CloudflareResponseParser::parse() จะคืนค่านี้
CloudflareRenderResult::isValid()ไม่มีตรวจสอบว่าไบต์ของ PDF ไม่ว่างเปล่าและเริ่มต้นด้วยส่วนหัว PDFboolไม่คาดว่าจะเกิดใช้ก่อนการจัดเก็บถาวรหรือส่งไบต์ไปยังชั้นอื่น
CloudflareRenderResult::size()ไม่มีนับไบต์ของ PDF ที่เรนเดอร์แล้วintไม่คาดว่าจะเกิดป้อนเข้าสู่ตรรกะโควตาและการตรวจสอบ
new CloudflareRenderPayload(string $html, float $widthPt, float $heightPt = 0, string $defaultCss = '', ?string $r2FontBucket = null, array $fontFiles = [])HTML, ขนาด, CSS, R2 font bucket แบบไม่บังคับ, รายการไฟล์ฟอนต์ความสูงอัตโนมัติ, ไม่มี CSS เริ่มต้น, ไม่มี R2 font bucket, ไม่มีไฟล์ฟอนต์CloudflareRenderPayloadไม่คาดว่าจะเกิดออบเจ็กต์ค่าเพย์โหลดของคำขอ
CloudflareRenderPayload::toJson()ไม่มีserialize HTML, ขนาด, CSS และการอ้างอิงฟอนต์เป็น JavaScript Object Notation (JSON) สำหรับ Workerstringข้อผิดพลาดในการเข้ารหัส JSONAPI เพย์โหลดของคำขอระดับล่าง
CloudflareResponseParser::parse(ResponseInterface $response, float $requestedWidthPt)การตอบสนองของ Worker และความกว้างที่ร้องขอยอมรับการตอบสนอง PDF แบบไบนารีและการตอบสนอง JSON แบบมีโครงสร้างCloudflareRenderResultCloudflareRenderException สำหรับเอาต์พุตของ Worker ที่ล้มเหลวหรือไม่ถูกต้องตัวแยกวิเคราะห์ส่วนกลางที่ตัวเรนเดอร์ใช้
CloudflareSecurityPolicy::validate(string $html, int $maxSize)อินพุต HTML และขีดจำกัดขนาดใช้นโยบายอินพุต HTML ของแพ็กเกจvoidข้อยกเว้นการตรวจสอบความถูกต้องคงการตรวจสอบอินพุตที่ไม่น่าเชื่อถือไว้นอกขอบเขตของ Worker
CloudflareSecurityPolicy::validateWorkerUrl(string $url)URL ของ Workerแยกวิเคราะห์และตรวจสอบความถูกต้องของปลายทางarrayข้อยกเว้นการตรวจสอบความถูกต้องปิดกั้นรูปแบบปลายทางที่ไม่ปลอดภัยก่อน I/O เครือข่าย
CloudflareSecurityPolicy::assertPinsStillValid(string $host, array $pinnedIps)โฮสต์และรายการ IP ที่ปักหมุดยืนยันการปักหมุด DNS ที่คาดหวังvoidข้อยกเว้นการตรวจสอบความถูกต้องเมื่อการปักหมุดล้าสมัยหรือไม่ถูกต้องใช้ระหว่างการตรวจสอบด้านปฏิบัติการสำหรับการปรับใช้ที่ปักหมุด

ใช้ตารางนี้เมื่อป้องกันปลายทางการเรนเดอร์: การตรวจสอบความถูกต้องของคีย์ API, การตรวจสอบขนาดเพย์โหลดและขีดจำกัดอัตรา รวมถึงออบเจ็กต์ผลลัพธ์และส่วนหัวที่ขั้นตอนเหล่านี้สร้างขึ้น

สัญลักษณ์พารามิเตอร์พฤติกรรมเริ่มต้นคืนค่าข้อยกเว้นหรือความล้มเหลวหมายเหตุ
new ApiProtection(ApiProtectionConfig $config, ?ApiKeyValidator $keyValidator = null, ?Closure $clock = null)คอนฟิกการป้องกัน, ตัวตรวจสอบคีย์แบบไม่บังคับ, นาฬิกาแบบไม่บังคับใช้เวลาระบบเมื่อไม่ได้ระบุนาฬิกาApiProtectionไม่คาดว่าจะเกิดฉีดค่านาฬิกาแบบกำหนดได้แน่นอนในการทดสอบ
ApiProtection::checkRequest(string $clientId, int $payloadSize, string $apiKey = '')ตัวระบุไคลเอ็นต์, ขนาดเพย์โหลด, คีย์ API แบบไม่บังคับคีย์ API ที่ว่างเปล่าได้รับอนุญาตเฉพาะเมื่อคอนฟิกไม่ต้องการคีย์เท่านั้นApiProtectionResultไม่คาดว่าจะเกิดตรวจสอบคีย์ API และขนาด จากนั้นจึงจำกัดอัตรา
ApiProtection::getRateLimit(string $clientId)ตัวระบุไคลเอ็นต์ไม่บันทึกคำขอRateLimitResultไม่คาดว่าจะเกิดใช้เพื่อเพิ่มส่วนหัวขีดจำกัดอัตรา
new ApiKeyValidator(array $validKeys = [])รายการคีย์ข้อความธรรมดาที่ถูกต้องรายการที่ว่างเปล่าจะปฏิเสธคีย์ทั้งหมดApiKeyValidatorไม่คาดว่าจะเกิดจัดเก็บความลับไว้นอกโค้ดและเติมค่าผ่านการกำหนดค่า
ApiKeyValidator::validate(string $key)คีย์ดิบเปรียบเทียบกับคีย์ข้อความธรรมดาที่กำหนดค่าไว้โดยใช้ตรรกะที่ปลอดภัยต่อเวลาboolไม่คาดว่าจะเกิดพารามิเตอร์นี้มีความอ่อนไหว อย่าบันทึกคีย์ดิบลงในล็อก
ApiKeyValidator::addKey(string $key)คีย์ดิบเพิ่มคีย์ที่ผ่านการแฮชลงในอินสแตนซ์ตัวตรวจสอบใหม่selfไม่คาดว่าจะเกิดถือว่าอินสแตนซ์ที่คืนค่ามาเป็นตัวตรวจสอบที่อัปเดตแล้ว
ApiKeyValidator::revokeKey(string $key)คีย์ดิบลบแฮชที่ตรงกันออกจากอินสแตนซ์ตัวตรวจสอบใหม่selfไม่คาดว่าจะเกิดถือว่าอินสแตนซ์ที่คืนค่ามาเป็นตัวตรวจสอบที่อัปเดตแล้ว
ApiKeyValidator::hashKey(string $key)คีย์ดิบสร้างตัวแทนแฮชสำหรับจัดเก็บstringไม่คาดว่าจะเกิดอย่าเปิดเผยแฮชในล็อกหรือการตอบสนองต่อไคลเอ็นต์
ApiKeyValidator::validateHashed(string $key, array $hashedKeys)คีย์ดิบและแฮชที่ใช้ตรวจสอบเปรียบเทียบกับแฮชที่ระบุในเวลาคงที่boolไม่คาดว่าจะเกิดตัวช่วยระดับล่างสำหรับที่เก็บคีย์แบบกำหนดเอง
new ApiProtectionConfig(int $maxRequestsPerMinute = 60, int $maxRequestsPerHour = 1000, int $maxPayloadSizeBytes = 10485760, array $allowedOrigins = [], bool $requireApiKey = true, string $apiKeyHeader = 'X-Api-Key', int $rateLimitWindowSeconds = 60)ขีดจำกัดคำขอ, ขีดจำกัดเพย์โหลด, ออริจินที่อนุญาต, ข้อกำหนดคีย์ API, ชื่อส่วนหัว, ความยาวหน้าต่าง60/minute, 1000/hour, เพย์โหลด 10 MiB, ต้องใช้คีย์ APIApiProtectionConfigไม่คาดว่าจะเกิดสร้างโดยตรงในการทดสอบหรือเติมค่าด้วย fromArray()
ApiProtectionConfig::fromArray(array $data)max_requests_per_minute, max_requests_per_hour, max_payload_size_bytes, allowed_origins, require_api_key, api_key_header, rate_limit_window_secondsคีย์ที่ไม่ได้ระบุจะใช้ค่าเริ่มต้นของคอนสตรักเตอร์ApiProtectionConfigไม่คาดว่าจะเกิดใช้สำหรับการเติมค่าคอนฟิกของเฟรมเวิร์ก
ApiProtectionConfig::isValid()ไม่มีต้องมีขีดจำกัดที่เป็นค่าบวก รวมถึงค่าขนาดและค่าหน้าต่างที่สอดคล้องกันboolไม่คาดว่าจะเกิดตรวจสอบความถูกต้องก่อนเปิดเผยปลายทาง
new ApiProtectionResult(bool $allowed, string $denialReason = '', ?RateLimitResult $rateLimit = null)การตัดสินใจ, เหตุผลการปฏิเสธ, ผลลัพธ์ขีดจำกัดอัตราแบบไม่บังคับเหตุผลการปฏิเสธว่างเปล่าและไม่มีผลลัพธ์ขีดจำกัดอัตราApiProtectionResultไม่คาดว่าจะเกิดโดยปกติ ApiProtection::checkRequest() จะคืนค่านี้
ApiProtectionResult::toHeaders()ไม่มีส่งออกส่วนหัวขีดจำกัดอัตราเมื่อมีข้อมูลอัตราอยู่array<string, string>ไม่คาดว่าจะเกิดแนบกับการตอบสนองของ Worker หรือเฟรมเวิร์ก
new RateLimitResult(bool $allowed, int $remainingRequests, int $retryAfterSeconds, string $clientId)การตัดสินใจ, จำนวนที่เหลือ, การหน่วงเวลาก่อนลองใหม่, ตัวระบุไคลเอ็นต์ (ID)ไม่มีค่าเริ่มต้นRateLimitResultไม่คาดว่าจะเกิดผลลัพธ์ที่ไม่เปลี่ยนแปลงสำหรับการตรวจสอบหนึ่งครั้ง
RateLimitResult::toHeaders()ไม่มีส่งออกส่วนหัวขีดจำกัดที่เหลือและการรีเซ็ตarray<string, string>ไม่คาดว่าจะเกิดใช้สำหรับการสังเกตการณ์และการถอยกลับของไคลเอ็นต์
new RateLimitEntry(string $clientId, int $requestCount = 0, int $windowStart = 0, int $hourlyCount = 0, int $hourlyWindowStart = 0)ID ไคลเอ็นต์และตัวนับที่เปลี่ยนแปลงได้ตัวนับเริ่มต้นที่ศูนย์RateLimitEntryไม่คาดว่าจะเกิดออบเจ็กต์การติดตามในหน่วยความจำ
RateLimitEntry::increment()ไม่มีเพิ่มค่าตัวนับในหน่วยความจำต่อหนึ่ง client/windowvoidไม่คาดว่าจะเกิดตัวช่วยระดับล่างที่ ApiProtection ใช้
RateLimitEntry::isExpired(int $windowSeconds)ความยาวหน้าต่างเป็นวินาทีเปรียบเทียบกับเวลาปัจจุบันboolไม่คาดว่าจะเกิดตัวช่วยการหมดอายุขณะรันไทม์
RateLimitEntry::isExpiredAt(int $now, int $windowSeconds)ค่านาฬิกาและความยาวหน้าต่างเปรียบเทียบกับค่านาฬิกาที่ระบุboolไม่คาดว่าจะเกิดตัวช่วยการทดสอบแบบกำหนดได้แน่นอน
RateLimitEntry::reset()ไม่มีรีเซ็ตจำนวนและเวลาเริ่มต้นหน้าต่างvoidไม่คาดว่าจะเกิดใช้เมื่อหน้าต่างใหม่เริ่มต้น

ใช้ตารางนี้เมื่อจัดเก็บ PDF ที่เรนเดอร์แล้วใน Cloudflare R2: บริการจัดเก็บถาวร, คอนฟิกของบริการและชนิดคีย์ออบเจ็กต์ รวมถึงผลลัพธ์การอัปโหลดที่ต้องตรวจสอบก่อนเปิดเผย URL

สัญลักษณ์พารามิเตอร์พฤติกรรมเริ่มต้นคืนค่าข้อยกเว้นหรือความล้มเหลวหมายเหตุ
new R2ArchiveManager(R2ArchiveConfig $config, ClientInterface $httpClient, RequestFactoryInterface $requestFactory, StreamFactoryInterface $streamFactory)คอนฟิก R2 และ HTTP factories/client แบบ PSRไม่มีการเรียกเครือข่ายระหว่างการสร้างR2ArchiveManagerข้อผิดพลาดในการเชื่อมต่อคอนเทนเนอร์บริการจัดเก็บถาวรหลัก
R2ArchiveManager::upload(string $pdfData, string $filename, array $metadata = [])ไบต์ของ PDF ดิบ, ชื่อไฟล์เดิม, ข้อมูลเมตาแบบสตริงข้อมูลเมตาว่างเปล่า คีย์ที่แบ่งพาร์ติชันตามวันที่R2UploadResultคืนค่าผลลัพธ์ที่ไม่สำเร็จเมื่อเกิดความล้มเหลวด้านคอนฟิก ขนาด, HTTP หรือการขนส่งไม่เกิดข้อยกเว้นสำหรับความล้มเหลวในการอัปโหลดตามปกติ
R2ArchiveManager::generateSignedUrl(string $key, int $expiresInSeconds = 3600)คีย์ออบเจ็กต์และเวลาคงอยู่ (TTL) ของ URLURL ที่ลงนามแล้วอายุหนึ่งชั่วโมงstringข้อผิดพลาดในการลงนามจากคอนฟิกที่ไม่ถูกต้องใช้ TTL ที่สั้นสำหรับ PDF ที่มีความอ่อนไหว
R2ArchiveManager::buildObjectKey(string $filename)ชื่อไฟล์เดิมใช้คำนำหน้าเส้นทางที่กำหนดค่าไว้และวันที่ปัจจุบันR2ObjectKeyไม่คาดว่าจะเกิดใช้สำหรับการแบ่งพาร์ติชันการจัดเก็บถาวรที่คาดการณ์ได้
R2ArchiveManager::createPutRequest(R2ObjectKey $key, string $data, array $metadata = [])คีย์ออบเจ็กต์, ไบต์ดิบ, ข้อมูลเมตาลงนามคำขอ PUTRequestInterfaceข้อผิดพลาดในการสร้างคำขอAPI ระดับล่างสำหรับการขนส่งแบบกำหนดเอง
new R2ArchiveConfig(string $bucketName, string $accountId, string $accessKeyId, string $secretAccessKey, string $endpoint = '', string $pathPrefix = 'pdfs/', int $maxFileSizeBytes = 104857600)บัคเก็ต, ID บัญชี, ข้อมูลรับรอง, การแทนที่ปลายทาง, คำนำหน้าคีย์, ขนาดออบเจ็กต์สูงสุดปลายทางที่สร้างขึ้น, คำนำหน้า pdfs/, ขนาดออบเจ็กต์สูงสุด 100 MiBR2ArchiveConfigInvalidArgumentException สำหรับชื่อบัคเก็ตที่ไม่ถูกต้องถือว่าข้อมูลรับรองเป็นคอนฟิกที่มีความลับ
R2ArchiveConfig::fromArray(array $data)ID บัญชี, บัคเก็ต, ข้อมูลรับรอง, คำนำหน้าเส้นทาง, การแทนที่ปลายทาง, ขนาดสูงสุดค่าที่ขาดหายไปจะใช้ค่าเริ่มต้นของคอนสตรักเตอร์R2ArchiveConfigชื่อบัคเก็ตไม่ถูกต้องเมื่อมีการระบุใช้สำหรับการเติมค่าคอนฟิกของแอปพลิเคชัน
R2ArchiveConfig::isValid()ไม่มีต้องมีบัญชี, บัคเก็ต, คีย์การเข้าถึง และคีย์ลับที่ไม่ว่างเปล่าboolไม่คาดว่าจะเกิดคอนฟิกที่ไม่ถูกต้องจะทำให้การอัปโหลดล้มเหลวพร้อมผลลัพธ์แบบมีโครงสร้าง
R2ArchiveConfig::getEndpoint()ไม่มีใช้ปลายทางที่ระบุไว้อย่างชัดเจนหรือสร้างปลายทาง Cloudflare R2 จาก ID บัญชีstringไม่คาดว่าจะเกิดใช้สำหรับการสร้างคำขอที่ลงนามแล้ว
new R2ObjectKey(string $key, string $bucket)คีย์ออบเจ็กต์แบบเต็มและบัคเก็ตไม่มีการทำให้เป็นมาตรฐานR2ObjectKeyไม่คาดว่าจะเกิดโดยปกติ R2ObjectKey::generate() จะสร้างค่านี้
R2ObjectKey::generate(string $prefix, string $filename, ?DateTimeInterface $date = null)คำนำหน้า, ชื่อไฟล์เดิม, วันที่แบบไม่บังคับคีย์ออบเจ็กต์ที่แบ่งพาร์ติชันตามวันที่และผ่านการทำความสะอาดแล้วR2ObjectKeyไม่คาดว่าจะเกิดฉีดวันที่ในการทดสอบเพื่อให้ได้คีย์ที่กำหนดได้แน่นอน
R2ObjectKey::fullPath()ไม่มีเชื่อมเส้นทางพาร์ติชันและชื่อไฟล์ออบเจ็กต์เข้าด้วยกันstringไม่คาดว่าจะเกิดจัดเก็บค่านี้เป็นคีย์ออบเจ็กต์
new R2UploadResult(bool $success, string $key, string $etag = '', int $size = 0, string $error = '')แฟล็กความสำเร็จ, คีย์ออบเจ็กต์, entity tag (ETag), ขนาดไบต์, ข้อความแสดงข้อผิดพลาดETag ว่างเปล่า, ขนาดเป็นศูนย์, ข้อผิดพลาดว่างเปล่าR2UploadResultไม่คาดว่าจะเกิดโดยปกติ R2ArchiveManager::upload() จะคืนค่านี้
R2UploadResult::isValid()ไม่มีถูกต้องเมื่อการอัปโหลดสำเร็จและมีทั้งคีย์และ ETag อยู่boolไม่คาดว่าจะเกิดตรวจสอบก่อนเปิดเผย URL
R2UploadResult::publicUrl(string $customDomain = '')โดเมนสาธารณะแบบกำหนดเองที่ไม่บังคับคืนค่าคีย์ออบเจ็กต์เปล่าเมื่อไม่ได้ระบุโดเมนแบบกำหนดเองstringไม่คาดว่าจะเกิดหลีกเลี่ยงการใช้ URL สาธารณะสำหรับเอกสารที่มีความอ่อนไหว เว้นแต่นโยบายจะอนุญาต

ใช้ตารางนี้สำหรับการเชื่อมต่อระดับล่างเท่านั้น: การปักหมุด Internet Protocol (IP) และ SubjectPublicKeyInfo (SPKI) ในระดับ cURL รวมถึงสัญญาของ local-renderer ที่ใช้เป็นเส้นทางสำรองเมื่อไม่สามารถเข้าถึง Worker ได้

สัญลักษณ์พารามิเตอร์พฤติกรรมเริ่มต้นคืนค่าข้อยกเว้นหรือความล้มเหลวหมายเหตุ
new PinnedCurlTransport(ResponseFactoryInterface $responseFactory, StreamFactoryInterface $streamFactory, array $pinnedIps = [], array $pinnedPublicKeys = [], int $timeoutSeconds = 30)factory แบบ PSR-17, IP ที่ปักหมุด, คีย์สาธารณะที่ปักหมุด, การหมดเวลาไม่มีการปักหมุดและใช้การหมดเวลา 30 วินาทีPinnedCurlTransportไม่คาดว่าจะเกิดใช้เฉพาะเมื่อต้องการการปักหมุดในระดับ cURL เท่านั้น
PinnedCurlTransport::sendRequest(RequestInterface $request)คำขอแบบ PSR-7ส่งผ่าน cURL พร้อมการหมดเวลาและการควบคุมการปักหมุดที่กำหนดค่าไว้ResponseInterfaceข้อยกเว้นการขนส่งแบบ PSR-18ใช้เฉพาะเมื่อไคลเอ็นต์ HTTP ของเฟรมเวิร์กไม่สามารถบังคับใช้นโยบายการปักหมุดเดียวกันได้
PinnedCurlTransport::buildCurlOptions(RequestInterface $request, string $host, int $port)คำขอ, โฮสต์เป้าหมาย, พอร์ตเป้าหมายสร้างอาร์เรย์ตัวเลือก cURL ที่ sendRequest() ใช้arrayคำขอที่ไม่ถูกต้องหรือข้อผิดพลาดในการกำหนดค่าการปักหมุดฮุกการทดสอบและการวินิจฉัยระดับล่าง
LocalRendererInterface::render(string $html, array $options = [])HTML และตัวเลือกของตัวเรนเดอร์เป็นสัญญาเท่านั้น การนำไปใช้งานจะกำหนดค่าเริ่มต้นstringข้อผิดพลาดในการเรนเดอร์เฉพาะของการนำไปใช้งานใช้เป็นการสำรองแบบโลคัลเมื่อการเรนเดอร์ด้วย Worker ไม่พร้อมใช้งาน
LocalRendererFactoryInterface::create()ไม่มีสร้างการนำตัวเรนเดอร์แบบโลคัลไปใช้งานLocalRendererInterfaceข้อผิดพลาดด้าน factory หรือการพึ่งพาแยกการสร้างตัวเรนเดอร์สำรองออกจาก CloudflareHtmlRenderer
  • ถือว่า URL ของ Worker เป็นขอบเขตเครือข่าย ตรวจสอบความถูกต้องของปลายทาง ขนาด และการรับรองความถูกต้องก่อนการเรนเดอร์
  • ใช้ผลลัพธ์การป้องกัน API เป็นเอาต์พุตของนโยบาย ไม่ใช่เป็นโฟลว์การควบคุมด้วยข้อยกเว้น
  • การอัปโหลด R2 จะคืนค่าผลลัพธ์ความสำเร็จหรือข้อผิดพลาดแบบมีโครงสร้าง ให้จัดการทั้งสองเส้นทาง