2011-07-21 47 views
5

Tôi đang phát triển dịch vụ tải tệp lên cho công ty của mình. Người dùng của chúng tôi thường gửi cho chúng tôi các tệp .zip rất lớn chứa đầy các tệp minh hoạ rất lớn. Nói chung các tập tin sẽ không lớn hơn 1.5GB, nhưng tôi cần phải lên kế hoạch xử lý các tập tin lên đến 4GB. Rõ ràng, điều này gây ra rất nhiều lo ngại về cách tôi cấu hình Apache của tôi để cho phép chuyển tập tin lớn như vậy mà không làm quá tải máy chủ của tôi hoặc mở lỗ hổng bảo mật.Định cấu hình Apache cho các tệp tải lên lớn

quan tâm 1: Memory Giới hạn

Một đặc điểm của hệ thống của tôi là người sử dụng sẽ có thể tải về các file của họ trở lại sau khi họ đã tải lên chúng. Tôi đã tránh sử dụng một tải xuống tiêu chuẩn (chỉ cần liên kết đến tệp) vì các vấn đề bảo mật - tôi không thể cho phép người dùng khác tải xuống từng tệp khác. Giải pháp của tôi là giữ các tệp được tải lên trong thư mục được bảo vệ bên ngoài www-root và tải chúng qua một tập lệnh PHP. Tập lệnh PHP đó trông hơi giống như thế này:

$fo = fopen($uploadDir.$file_name, "r"); 
while(!feof($fo)) { 
     $strang = fread($fo, 102400); 
     echo $strang; 
     ob_flush(); 
} 
fclose($fo); 

Tôi đã đặt fread vào vòng lặp và khóa nó vào chỉ tải từng phần nhỏ của tệp tại một thời điểm. Tôi đã làm điều đó bởi vì máy chủ của tôi chỉ có 4GB RAM và cần có khả năng xử lý nhiều người tải xuống đồng thời (có thể là tối đa 20 ppl). Câu hỏi đầu tiên của tôi là số lượng lớn một đoạn tôi nên đọc tại một thời điểm. Ngay bây giờ tải xuống một tập tin 1.5GB là đau đớn chậm vì kích thước chunk đó.

Lo ngại 2: Max Execution Time

Một vấn đề tải lên/tải các tập tin lớn như vậy là tối đa thời gian thực hiện. Trong khi tất cả mọi thứ là khá tốc độ trên mạng nội bộ của tôi, tôi nên chuẩn bị cho người dùng với các kết nối chậm. Tôi đang đặt tốc độ tải lên thấp hơn ở tốc độ 1Mbps, tức là khoảng 35 phút để tải lên .. Hãy hào phóng và nói rằng họ có thể tải xuống gấp đôi tốc độ đó, vì vậy hãy tải xuống 15 phút.

Có rủi ro bảo mật khi đặt max_excution_time thành 30 phút không? Nó sẽ giết bất cứ điều gì trên máy chủ của tôi? Tôi không có lý do gì để nghĩ rằng đó là một ý tưởng tồi, nhưng ruột của tôi chỉ la hét rằng tôi sẽ ngu ngốc để cho phép một kịch bản chạy dài đến vậy. Có cách nào tốt hơn để làm những gì tôi đang cố gắng làm không?


Tôi đã nhìn thấy một vài câu hỏi tương tự khác và hầu hết trong số họ đều đề xuất sử dụng một cái gì đó như java hoặc silverlight. Tôi muốn, nếu có cách nào hợp lý, để tránh java. Tôi hiện đang sử dụng swfupload và plugin jQuery kèm theo.

+2

Đối với vấn đề tốc độ tải xuống tệp có thể là câu trả lời cũ của tôi có thể giúp: http://stackoverflow.com/questions/3697748/fastest-way-to-serve-a-file-using-php/3731639#3731639 –

+0

Yêu phương pháp đó. Nó có hoạt động nếu tôi có các tệp của tôi trong một thư mục được bảo vệ không? Hay họ cần phải có sẵn trên máy chủ web? Tôi đã có nó thiết lập ngay bây giờ nhưng nó không hoạt động .. và không thực sự đưa ra bất kỳ thông tin lỗi. – jwegner

+1

Với "X-SendFile"? Các tập tin chỉ cần có thể đọc được bởi người dùng chạy quá trình máy chủ web. –

Trả lời

1

quan tâm 1: Giới hạn bộ nhớ

readfile suối, vì vậy đây được chuyển thành các phản ứng HTTP khi đang bay và nó sẽ không được nạp vào bộ nhớ hoàn thành.

Tuy nhiên, để tải lên, tập lệnh phải có đủ bộ nhớ vì trong khi tải lên và sử dụng PHP, toàn bộ tệp sẽ được chuyển vào bộ nhớ nếu tôi nhớ đúng.

Lo ngại 2: Max Execution Time

Nếu bạn lo ngại về an ninh, xử lý xác thực và truy cập quyền đã thông qua máy chủ HTTPD. Sau đó, tập lệnh của bạn sẽ không được thực hiện khi yêu cầu không hợp lệ.

Các vấn đề liên quan