2009-02-23 31 views
30

Hi im khá mới với PHP, tôi đã tạo một biểu mẫu cho các tệp csv rất lớn được tải lên máy chủ của tôi. Một số người đã đề cập đến tôi rằng trình duyệt có thể hết thời gian do tệp tải lên lớn, điều này có đúng không? và nếu có, nó có thể được ngăn chặn không?Có thể tải lên tập tin hết thời gian trong PHP không?

Cảm ơn sự giúp đỡ của bạn!

Trả lời

50

Bạn cần một giá trị thích hợp cho các thiết lập php.ini như sau: (! không max_execution_time)

  1. max_input_time
  2. upload_max_filesize
  3. post_max_size

và có thể

  1. memory_limit
+6

Tài liệu PHP cho max_input_time cho biết: "Nó được đo từ thời điểm nhận tất cả dữ liệu trên máy chủ đến khi bắt đầu thực thi tập lệnh." Vậy tại sao kích thước tệp lại tạo nên sự khác biệt? Tất cả dữ liệu đã được nhận trước khi bộ hẹn giờ này bắt đầu. – Oscar

+0

Sau khi thử nghiệm, tôi xác nhận rằng 'max_input_time' dường như không ảnh hưởng đến vấn đề này. –

1

Vâng, đó là sự thật. Việc tải lên tệp được thực hiện thông qua yêu cầu POST và các yêu cầu nói chung sẽ bị hết thời gian chờ. Bạn sẽ có thể cấu hình lại môi trường của bạn cho một thời gian chờ yêu cầu dài hơn.

2

Một tập lệnh được phép chạy, theo mặc định, khoảng 30 giây. Bạn có thể sử dụng set_time_limit() function để thay đổi điều này. Ngoài ra, nếu người dùng của bạn cần tải lên các tệp lớn, bạn cần thay đổi giá trị post_max_size và/hoặc upload_max_filesize trong tệp php.ini của mình.

Ngoài ra, nếu bạn muốn mở rộng giới hạn thời gian chờ trên toàn cầu, bạn có thể thay đổi thời gian thực thi tối đa trong php.ini.

+0

rực rỡ, cảm ơn vì điều đó! tôi thậm chí không biết về post_max_size hoặc upload_max_file_size! rất nhiều apreciated –

+1

set_time_limit ảnh hưởng đến cùng một thiết lập như max_execution_time trong php.ini. Tài liệu nói "Thời gian thực thi tối đa không bị ảnh hưởng bởi các cuộc gọi hệ thống, hoạt động truyền trực tuyến, v.v ..." Tải lên tệp có được tính là "hoạt động luồng" không? Nếu có, thì có vẻ như cài đặt này sẽ không hiệu quả. – Oscar

1

Nó không chỉ là timeouts có thể gây ra vấn đề. Có một số giới hạn về kích thước tệp tối đa có thể được tải lên. Các giới hạn này có thể được thay đổi trong file php.ini:

post_max_size
upload_max_filesize memory_limit

Check-out http://uk.php.net/ini.core để biết chi tiết.

27

Có một số chỉ thị cấu hình mà có thể gây ra ảnh upload lớn để thất bại nếu các giá trị của họ quá nhỏ:

PHP

  • max_input_time Thời gian tối đa chỉ trong vài giây một kịch bản được phép phân tích dữ liệu đầu vào, như POST, GET và tải lên tệp
  • upload_max_filesize Kích thước tối đa của tệp được tải lên.
  • post_max_size Cho phép dữ liệu bài đăng tối đa.

Apache

  • TimeOut Lượng thời gian máy chủ sẽ chờ đợi cho các sự kiện nhất định trước khi thất bại trong một yêu cầu
  • LimitRequestBody Hạn chế tổng kích thước của cơ thể yêu cầu HTTP gửi từ khách hàng

Có thể có nhiều hơn điều này.

+0

tôi không có ý tưởng nơi abouts để thậm chí đi để chỉnh sửa các thiết lập apache: ( –

+0

Hãy hỏi nhà cung cấp của bạn nếu các cài đặt này là thích hợp để tải lên các tập tin lớn – Gumbo

3

Khi tải lên các tập tin rất lớn, bạn phải thay đổi 4 biến số cấu hình:

  • upload_max_filesize
  • post_max_size
  • memory_limit
  • time_limit

Thời hạn có thể tăng lên trong thời gian chạy với set_time_limit().

+0

Để biết của tôi không có chỉ thị như vậy trong PHP - time_limit.set_time_limit() đặt max_execution_time. – jayarjo

4

Một cách hay để giải quyết việc xử lý tệp tải lên lớn trong php là sử dụng trình tải lên như JUpload sẽ chia tệp thành nhiều phần trước khi gửi chúng. Điều này cũng có lợi ích cho người dùng của bạn rằng họ nhận được phản hồi tiến độ đúng khi tải lên và họ có thể tải nhiều tệp lên một lần.

1

Câu trả lời của tôi không liên quan trực tiếp đến câu hỏi ban đầu của bạn, nhưng nếu bạn có bộ cân bằng tải ngược proxy trước tập lệnh PHP của bạn, bộ cân bằng tải có thể hết thời gian chờ hoặc chặn tải lên lớn. Luôn kiểm tra cấu hình cân bằng tải của bạn nếu bạn hỗ trợ tải lên tệp. Cũng giống như PHP, hầu hết các bộ cân bằng tải mặc định cho các bản tải lên là khá nhỏ.

1

tôi đã có thể giải quyết vấn đề này bằng cách sử dụng các thiết lập sau đây, bạn có thể sử dụng giá trị khác nhau nhưng bạn sẽ có được ý tưởng:

Đối với máy chủ của tôi, tôi đặt những dòng này trong một tập tin ".user.ini" bên trong kịch bản thư mục, máy chủ của bạn có thể tìm kiếm một tập tin khác nhau, nếu bạn làm một phpinfo ('user_ini.filename') trên máy chủ nó sẽ nhổ ra các tập tin bạn cần phải đặt giá trị của bạn trong

max_execution_time = 1800 
max_input_time = -1 
post_max_size = 100M 
upload_max_filesize = 100M 
memory_limit = 256M 
0

Nếu thay đổi bất kỳ các tham số ở trên dường như không tạo ra bất kỳ sự khác biệt nào, có thể biểu mẫu html ở đâu đó chứa tên MAX_FILE_SIZE là trường ẩn.

<input type="hidden" name="MAX_FILE_SIZE" value="10000000">

Trong ví dụ trên, bất kỳ tập tin trên 10MB sẽ không được tải lên.

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