2011-01-06 25 views
8

Tôi đang cố gắng tải tệp lớn hơn 2GB lên máy chủ PHP 5.3.4 cục bộ. Tôi đã thiết lập các biến máy chủ sau:Tải lên tệp lớn hơn 2GB bằng cách sử dụng PHP

memory_limit = -1 
post_max_size = 9G 
upload_max_filesize = 5G 

Tuy nhiên, trong error_log tôi thấy:

PHP Warning: POST Content-Length của 2120909412 byte vượt quá giới hạn của 1073741824 byte trong Unknown on line 0

Bất cứ ai có thể cho tôi biết lý do tại sao điều này liên tục không thành công?

+3

HTTP thực sự không phải là lựa chọn đúng đắn của giao thức để tải lên tệp 2GB. Bạn nên sử dụng (S) FTP cho việc này. –

+3

Bạn đã xác minh đó là các biến được sử dụng chưa? (tức là, thông qua 'phpinfo()') PHP không bao giờ làm tôi ngạc nhiên về tập tin cấu hình nào thực sự đang đọc ... (Ngoài ra, HTTP không có ý nghĩa như vậy ...) – Thanatos

+1

Tại sao bạn muốn sử dụng PHP cho điều này thay vì một số thứ như FTP hoặc bất kỳ số nào hoặc các cách tải lên tệp khác – Earlz

Trả lời

2

Có lẽ điều này có thể xuất phát từ những hạn chế apache vào kích thước POST:

http://httpd.apache.org/docs/current/mod/core.html#limitrequestbody

Dường như hạn chế này trên 2Gb có thể lớn trên 64bits cài đặt, có thể. Và tôi không chắc chắn thiết lập 0 trong directove này không đạt đến giới hạn biên dịch. xem cho ví dụ mà chủ đề:

http://ubuntuforums.org/archive/index.php/t-1385890.html

Sau đó, đừng quên thay đổi cũng như các max_input_time trong PHP.

Nhưng bạn đang đạt đến giới hạn cao :-) có thể bạn có thể thử một khách hàng phong phú (flash? Js?) Ở phía trình duyệt, thực hiện chuyển khối hoặc một số thứ FTP, với chỉ báo tiến trình cho người dùng.

+0

Tôi đã thử cùng một thao tác trên hệ điều hành 64 bit và không gặp bất kỳ vấn đề gì. Cảm ơn bạn đã giúp đỡ. – Reado

3

Tôi không biết về trong 5.3.x, nhưng trong 5.2.x có một số vấn đề int/long trong mã PHP. ngay cả khi bạn đang sử dụng hệ thống 64 bit và có phiên bản PHP được biên dịch với 64 bit, có một số vấn đề. Đầu tiên, mã chuyển đổi post_max_size và số khác từ ascii thành số nguyên lưu trữ giá trị trong int, vì vậy nó chuyển đổi "9G" và đặt kết quả vào int này sẽ bork giá trị vì 9G là số lớn hơn 32 biến -bit có thể giữ.

Nhưng cũng có một số khu vực khác của mã PHP được sử dụng với mô đun Apache, CGI, v.v ... cần được thay đổi từ int thành long.

Vì vậy ... để làm việc này, bạn cần phải chỉnh sửa mã PHP và biên dịch nó bằng tay (hãy chắc chắn bạn biên dịch nó bằng 64-bit). đây là một liên kết đến một danh sách các diffs:

http://www.archive.org/~tracey/downloads/patches/karmic-64bit-post-large-files.patch

tham chiếu từ php lỗi này bài: http://bugs.php.net/bug.php?id=44522

Các tập tin trên là một diff trên 5.2.10 mã, nhưng tôi chỉ cần thực hiện những thay đổi bằng tay đến 5.2.17 mã và tôi chỉ cần tải lên một tập tin duy nhất 3.4gb thông qua apache/php (mà không làm việc trước khi thay đổi).

ope giúp ích.

3

Tôi đã có một vấn đề tương tự, nhưng cấu hình của tôi là:

post_max_size = 1.8G 
upload_max_filesize = 1.8G 

nhưng tôi không thể tải lên một tập tin 1.2 GB.Lỗi này rất giống nhau:

PHP Warning: POST Content-Length of 1347484420 bytes exceeds the limit of 1073741824 bytes in Unknown on line 0 

Tôi đã dành một ngày tự hỏi "giới hạn 1073741824" này ở đâu!

Giải pháp:

Trên thực tế, lỗi là trong phân tích cú pháp php.ini: Nó chỉ hiểu số INTEGER, vì vậy về cơ bản nó đã được phân tích cú pháp 1.8G như 1G !!

Thay đổi giá trị thành ví dụ: 1800M đã sửa nó.

Xin vui lòng đảm bảo khởi động lại máy chủ apache với bên dưới lệnh dịch vụ apache2 restart

+0

Tôi đã nhiều giờ cố gắng tìm hiểu xem vấn đề có thể là vấn đề gì với cài đặt riêng để tải lên các tệp lớn và đây là vấn đề. – Ark74

1

Như phliKtid đề cập, đây là một hạn chế với khuôn khổ PHP. Lưu để chỉnh sửa mã nguồn như đã đề cập trong liên kết phliKtid bug report, có một cách giải quyết liên quan đến việc đặt upload_max_filesize thành 0 trong tệp php.ini.

; Maximum allowed size for uploaded files. 
; http://php.net/upload-max-filesize 
upload_max_filesize = 0 

Bằng cách này, PHP sẽ không sụp đổ khi cố gắng để chuyển đổi "5G" vào một số nguyên 32-bit và bạn sẽ có thể tải lên các tập tin lớn như bạn cho phép với "post_max_size" biến.

0

Chúng tôi đã gặp sự cố tương tự: video tải lên bị dừng ở mức 2 GB.

Theo SLES (SUSE Linux Enterprise Server) 11 SP 2, php53 là vấn đề.

Sau đó, chúng tôi đã thêm một kho lưu trữ mới có php54: http://download.opensuse.org/repositories/server:/php/SLE_11_SP2/

và nâng cấp lên đó, chúng tôi bây giờ có thể tải lên 5GB :-)

1

tôi tìm ra cách để sử dụng http và php tải lên 10G tập tin.

php.ini:

post_max_size = 0 
upload_max_filesize = 0 

Nó hoạt động trong php 5.3.10.

nếu bạn không tải tệp đó vào bộ nhớ, memory_limit không liên quan.

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