2011-01-06 13 views
8

Próbuję przesłać plik większy niż 2 GB na lokalny serwer PHP 5.3.4. Mam zestaw następujących zmiennych serwera:Przesyłanie pliku większego niż 2 GB przy użyciu PHP

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

Jednak w error_log znalazłem:

PHP Warning: POST Content-Length of 2120909412 bajtów przekracza limit 1073741824 bajtów w nieznane na linii 0

Czy ktoś może mi powiedzieć, dlaczego to się nie udaje?

+3

HTTP nie jest właściwym wyborem protokołu przesyłania pliku 2 GB. Powinieneś używać tego (S) FTP. –

+3

Czy zweryfikowałeś, że są to zmienne w użyciu? (tj. poprzez 'phpinfo()') PHP nigdy nie przestaje mnie zaskakiwać o tym, który plik konfiguracyjny faktycznie czyta ... (Także, HTTP nie jest tak przeznaczony ...) – Thanatos

+1

Dlaczego chcesz używać PHP do tego zamiast czegoś w rodzaju FTP lub dowolnej liczby lub innych sposobów przesyłania plików – Earlz

Odpowiedz

2

Może ten może pochodzić z ograniczeniami apache od wielkości postu:

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

Wydaje się to ograniczenie 2GB może być większa na instalacjach 64Bits, może. I nie jestem pewien, że ustawienie 0 w tej instrukcji nie osiąga limitu kompilacji. patrz przykłady wątku:

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

to nie zapomnij, aby zmienić jak dobrze max_input_time w PHP.

Ale docierasz do wysokich limitów :-) może możesz wypróbować bogatego klienta (flash? Js?) Po stronie przeglądarki, wykonując transfer w porcjach lub coś w rodzaju FTP, ze wskaźnikami postępu dla użytkownika.

+0

Próbowałem tej samej operacji na 64-bitowym systemie operacyjnym i nie miałem żadnych problemów. Dzięki za pomoc. – Reado

3

Nie wiem o tym w 5.3.x, ale w 5.2.x jest kilka int/długich problemów w kodzie PHP. nawet jeśli używasz 64-bitowego systemu i masz wersję PHP skompilowaną z 64-bitową, jest kilka problemów.

Po pierwsze, kod, który konwertuje post_max_size i inne z ascii na liczbę całkowitą, przechowuje wartość w int, więc konwertowanie "9G" i umieszczenie wyniku w tej int spowoduje korekcję wartości, ponieważ 9G jest liczbą większą niż 32 Zmienna -bit może pomieścić.

Ale istnieje również kilka innych obszarów kodu PHP, które są używane z modułem Apache, CGI itp., Które należy zmienić z int na długie.

Więc ... aby to działało, musisz edytować kod PHP i skompilować go ręcznie (upewnij się, że skompilowałeś go jako 64-bitowy). tu jest link do listy dyferencjału:

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

odwoływać się od tej php bug postu: http://bugs.php.net/bug.php?id=44522

Plik powyżej jest diff na kodzie 5.2.10, ale ja po prostu się zmiany ręcznie do wersji 5.2.17 i właśnie wysłałem pojedynczy plik o wadze 3,4 gb za pośrednictwem apache/php (który nie działał przed zmianą).

ope, które pomaga.

3

miałem podobny problem, ale mój config to:

post_max_size = 1.8G 
upload_max_filesize = 1.8G 

i jeszcze nie mogę przesłać plik 1,2 GB.Błąd był bardzo podobny:

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

Spędziłem dzień zastanawiając się, gdzie jest ten "limit 1073741824" pochodzący z!

Rozwiązanie:

Faktycznie, był błąd w parsera php.ini: Rozumie tylko liczb całkowitych, więc w zasadzie było parsowania 1.8G jako 1G !!

Zmiana wartości na np. 1800M naprawił to.

Pls zapewnić, aby ponownie uruchomić serwer apache z poniższej komendy apache2 serwis restartu

+0

Byłem godzin próbując dowiedzieć się, co może być problem z instalacją owncloud do przesyłania dużych plików, i to był problem mimo wszystko. – Ark74

1

Jak wspomniano phliKtid, jest to ograniczenie z ramami PHP. Zachowaj do edycji kodu źródłowego, o którym mowa w dołączonym phliKtid bug report, istnieje obejście polegające na ustawieniu wartości upload_max_filesize na 0 w pliku php.ini.

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

Dzięki temu, PHP nie padnie podczas próby konwersji „5G” na 32-bitową liczbę całkowitą i będzie można przesyłać pliki jako duże, jak można pozwolić ze zmienną „post_max_size”.

1

I dowiedzieć się, jak korzystać z http i PHP załadować 10G plik.

php.ini:

post_max_size = 0 
upload_max_filesize = 0 

Działa w PHP 5.3.10.

jeśli nie załadujesz tego pliku do pamięci, memory_limit nie ma związku.

Powiązane problemy