Bạn đã bao giờ gặp khó khăn với việc tải lên tệp lớn trong PHP chưa?
Ảnh của rawpixel. com trên Unsplash
Tải lên tệp là một nhiệm vụ phổ biến mà chúng tôi thực hiện trong hầu hết các dự án web hiện đại của mình. Với tất cả các công cụ khác nhau có sẵn, không khó để triển khai tính năng tải tệp lên bằng bất kỳ ngôn ngữ nào. Tuy nhiên, khi tải lên tệp lớn, mọi thứ sẽ hơi phức tạp
Giả sử bạn đang cố tải lên một tệp khá lớn. Bạn đã đợi hơn một giờ rồi và tải lên được 90%. Rồi đột nhiên, kết nối của bạn bị ngắt hoặc trình duyệt bị lỗi. Quá trình tải lên bị hủy bỏ và bạn cần bắt đầu lại từ đầu. Bực bội, phải không?
Trong bài đăng này, chúng ta sẽ thấy một nỗ lực để giải quyết vấn đề này trong PHP bằng cách tải lên các tệp trong các khối có thể tiếp tục sử dụng giao thức tus
Tải lên tệp có thể tiếp tục trong PHP — DemoTus là gì?
Tus là một giao thức mở dựa trên HTTP để tải lên tệp có thể tiếp tục. Có thể tiếp tục nghĩa là chúng tôi có thể tiếp tục ở nơi chúng tôi đã dừng lại mà không cần tải lại toàn bộ dữ liệu lên trong trường hợp có bất kỳ gián đoạn nào. Sự gián đoạn có thể xảy ra một cách tự nguyện nếu người dùng muốn tạm dừng hoặc do vô tình trong trường hợp có sự cố mạng hoặc máy chủ ngừng hoạt động
Tại sao vậy?Giao thức Tus đã được Vimeo thông qua vào tháng 5 năm 2017
Trích dẫn từ blog của Vimeo
Chúng tôi quyết định sử dụng tus trong ngăn xếp tải lên của mình vì giao thức tus chuẩn hóa quy trình tải tệp lên theo cách ngắn gọn và cởi mở. Tiêu chuẩn hóa này sẽ cho phép các nhà phát triển API tập trung nhiều hơn vào mã dành riêng cho ứng dụng của họ và ít hơn vào chính quy trình tải lên
Một lợi ích chính khác của việc tải tệp lên theo cách này là bạn có thể bắt đầu tải lên từ máy tính xách tay và thậm chí tiếp tục tải lên cùng một tệp từ điện thoại di động hoặc bất kỳ thiết bị nào khác. Đây là một cách tuyệt vời để nâng cao trải nghiệm người dùng của bạn
ảnh. Kiến trúc Tus cơ bản
Bắt đầu
Hãy bắt đầu bằng cách thêm phụ thuộc của chúng tôi
$ composer require ankitpokhrel/tus-php
tus-php là một triển khai ứng dụng khách và máy chủ PHP thuần túy theo khuôn khổ cho giao thức tải lên có thể tiếp tục tus v1. 0. 0
ankitpokhrel/tus-php
tus-php - 🚀 Máy chủ và máy khách PHP thuần túy cho giao thức tải lên có thể tiếp tục tus v1. 0. 0
github. com
Tạo một máy chủ để xử lý các yêu cầu của chúng tôiCập nhật. Vimeo hiện đang sử dụng TusPHP trong v3 của thư viện PHP chính thức của họ cho API Vimeo
Đây là cách một máy chủ đơn giản trông như thế nào
// server.php$server = new \TusPhp\Tus\Server['redis'];
$response = $server->serve[];$response->send[];exit[0]; // Exit from current PHP process.
Bạn cần định cấu hình máy chủ của mình để phản hồi một điểm cuối cụ thể. Ví dụ, trong Nginx, bạn sẽ làm một cái gì đó như thế này
# nginx.conf
location /files {
try_files $uri $uri/ /path/to/server.php?$query_string;
}
Giả sử rằng URL đến máy chủ của chúng tôi là http. //người phục vụ. tus. địa phương. Vì vậy, dựa trên cấu hình nginx ở trên, chúng ta có thể truy cập các điểm cuối tus của mình bằng cách sử dụng http. //người phục vụ. tus. Tập tin có sẵn
Bây giờ, chúng tôi có sẵn các điểm cuối RESTful sau đây để làm việc với
# Gather information about server's current configuration
OPTIONS /files# Check if the given upload is valid
HEAD /files/{upload-key}# Create a new upload
POST /files# Resume upload created with POST
PATCH /files/{upload-key}# Delete the previous upload
DELETE /files/{upload-key}
Kiểm tra chi tiết giao thức để biết thêm thông tin về các điểm cuối
Xử lý tải lên bằng ứng dụng khách tus-phpNếu bạn đang sử dụng bất kỳ khung nào như Laravel, thay vì sửa đổi cấu hình máy chủ của mình, bạn có thể xác định tuyến đường tới tất cả các điểm cuối dựa trên tus trong tệp tuyến đường khung của mình. Chúng tôi sẽ trình bày chi tiết điều này trong một hướng dẫn khác
Sau khi máy chủ được đặt đúng chỗ, máy khách có thể được sử dụng để tải tệp lên theo khối. Hãy để chúng tôi bắt đầu bằng cách tạo một biểu mẫu HTML đơn giản để nhận đầu vào từ người dùng
Sau khi một biểu mẫu được gửi, chúng tôi cần làm theo một số bước để xử lý việc tải lên
- Tạo một đối tượng máy khách tus-php
// Tus client$client = new \TusPhp\Tus\Client['//server.tus.local'];
Tham số đầu tiên trong đoạn mã trên là điểm cuối máy chủ tus của bạn
2. Khởi tạo ứng dụng khách với siêu dữ liệu tệp
Để giữ cho một lần tải lên là duy nhất, chúng tôi cần sử dụng một số mã định danh để nhận dạng tải lên trong các yêu cầu sắp tới. Đối với điều này, chúng tôi sẽ phải tạo một khóa tải lên duy nhất có thể được sử dụng để tiếp tục tải lên sau này. Bạn có thể cung cấp khóa tải lên một cách rõ ràng hoặc để hệ thống tự tạo khóa
// Set upload key and file meta$client->setKey[$uploadKey]
->file[$_FILES['tus_file']['tmp_name'], 'your file name'];
Nếu bạn không cung cấp khóa tải lên một cách rõ ràng, bước trên sẽ giống như thế này
$client->file[$_FILES['tus_file']['tmp_name'], 'your file name'];$uploadKey = $client->getKey[]; // Unique upload key
3. Tải lên một đoạn
________số 8Lần tới, khi bạn muốn tải lên một đoạn khác, bạn có thể sử dụng cùng một khóa tải lên để tiếp tục
// To resume upload in next request$bytesUploaded = $client->setKey[$uploadKey]->upload[$chunkSize];
Khi quá trình tải lên hoàn tất, máy chủ sẽ xác minh tải lên dựa trên tổng kiểm tra để đảm bảo tệp đã tải lên không bị hỏng. Theo mặc định, máy chủ sẽ sử dụng thuật toán
// server.php$server = new \TusPhp\Tus\Server['redis'];1 để xác minh tải lên
$response = $server->serve[];$response->send[];exit[0]; // Exit from current PHP process.
Xử lý tải lên bằng tus-js-clientViệc triển khai đầy đủ video demo ở trên có thể được tìm thấy tại đây
Uppy là một plugin tải lên tệp kiểu mô-đun, kiểu dáng đẹp được phát triển bởi cùng những người đứng sau giao thức tus. Bạn có thể sử dụng uppy để tích hợp liền mạch tus-js-client chính thức với máy chủ tus-php. Điều đó có nghĩa là chúng tôi đang sử dụng triển khai php của máy chủ và triển khai js của máy khách
// server.php$server = new \TusPhp\Tus\Server['redis'];0
$response = $server->serve[];$response->send[];exit[0]; // Exit from current PHP process.
Tải lên một phầnKiểm tra thêm chi tiết trong tài liệu uppy và triển khai ví dụ tại đây
Máy chủ tus-php hỗ trợ tiện ích mở rộng ghép nối và có khả năng ghép nối nhiều tệp tải lên thành một tệp duy nhất cho phép khách hàng thực hiện tải lên song song và tải lên các đoạn không liền kề
Tải lên một phần tệp bằng tus-phpVí dụ đầy đủ về tải lên một phần có thể được tìm thấy ở đây
Từ cuối cùngBản thân dự án tus-php vẫn đang trong giai đoạn đầu. Một số phần có thể thay đổi trong tương lai. Có thể tìm thấy ba ví dụ triển khai khác nhau trong thư mục ví dụ. Vui lòng thử và báo cáo bất kỳ vấn đề nào được tìm thấy. Yêu cầu kéo và đề xuất dự án được chào đón nhiều hơn