2013-08-26 17 views
9

Mam kod $input = fopen('php://input', 'r'); w moim kodzie do przesłania.Dlaczego php: // input truncate?

Po zakończeniu przesyłania pliku sprawdzam przed $_SERVER['CONTENT_LENGTH'], aby sprawdzić, czy wszystko zostało wysłane zgodnie z oczekiwaniami. Niedawno CONTENT_LENGTH i rozmiar mojego pliku do wysłania zaczęły się losowo nie pasować (około raz na 20 minut, gdy ludzie ładują się bardzo często).

Zalogowałem i zapisałem niezgodności i okazało się, że niektórych plików nie można otworzyć, a niektóre zostały pobrane i zostały obcięte. Jedno, które otworzyłem w Photoshopie, ostrzegało nawet, że dokument został uszkodzony.

Czy istnieje konfiguracja serwera, którego powinienem szukać, który mógł zostać zmieniony?

Próbowałem replikacji przez zamknięcie kart przeglądarki i rzeczy tego rodzaju, ale nadal nie będzie replikować błąd.

Przesyłamy przez AJAX POST. Ciało POST jest źródłem przesyłania.

+0

Przesłane materiały są horyzontalnymi tematami do pracy, w jaki sposób zapisujesz swoje pliki? Zapisywanie ich do bazy danych? lub przechowywanie pliku w folderze i odwoływanie się do ścieżki w bazie danych/ –

+0

Złe kopie są zapisywane w folderze, loguję lokalizację i sprawdzam je –

+1

Bez zrozumienia kodu, który rzeczywiście wysyła żądanie POST do serwera, będzie to niemożliwe do wymyślenia. W jaki sposób wysyłane są dane? Flash, JavaScript, formularz HTML itp.? Napotkano już takie problemy, ale zwykle był to błąd matematyczny podczas budowania fragmentów i wysyłania go do STDIN. – phpisuber01

Odpowiedz

-3

W pliku php.ini znajduje się dyrektywa post_max_size i upload_max_filesize, porównaj wartości z rozmiarem skróconych plików, aby sprawdzić, czy to jest powód.

+0

Nie zaszedłoby tak daleko, gdyby tak było i mogę łatwo załadować 50MB plików i nie powiedzie się na plikach czasami mniej niż meg. –

1

To brzmi dla mnie jak problem z ładowaniem/sieciowaniem. Wystąpił problem z opóźnieniem/przekroczeniem limitu czasu, gdy użytkownicy próbują przesłać dane, a serwer nie odpowiada.

Zazwyczaj to nie wina AJAX, a raczej serwer (może nawet nie PHP). Myślę, że w niektórych miejscach pakietów przychodzą na serwer. Może to być ograniczenie w centrum danych (np. Ograniczenie szerokości pasma) lub ograniczenie samego serwera.

Optymalizujemy nasz serwer, korzystając z następującej konfiguracji. To powinno działać na każdej dystrybucji linuxowej:

Edytuj plik /etc/sysctl.conf. Dodaj poniższe linie na końcu:

net.ipv4.tcp_wmem= 10240 87380 12582912 
net.ipv4.tcp_rmem= 10240 87380 12582912 
net.core.rmem_max=12582912 
net.core.wmem_max=12582912 
net.ipv4.tcp_max_syn_backlog=100000 

można wykorzystywać następujące instrukcje od IBM, aby lepiej zrozumieć, jak dostroić swój Linux: http://www.redbooks.ibm.com/redpapers/pdfs/redp4285.pdf

również

bym zalogować klienta wersja przeglądarki. Możliwe, że format wysyłany do serwera zależy od tego, czy AJAX jest różny w różnych przeglądarkach. Ponieważ nie określiłeś kodu AJAX, trudno jest założyć, co robi AJAX, aby przesłać pliki.

+0

Dzięki! W biurze jutro, więc będę mógł lepiej sprawdzić, co oznaczają te ustawienia konfiguracyjne. Problem występuje we wszystkich przeglądarkach. Wątpię, że to AJAX, ponieważ działało bez zarzutu przez lata. Wprowadziliśmy zmiany na serwerze, ale nic, co powinno wpłynąć na załadowanie ... to był cały zestaw różnych serwerów niż te, które dawały problem. To było bardzo dziwne i wątpię w przypadek, czas. –

+0

Przepraszam, że nie wróciłem! Odpowiedzią było, że może rozwiązać ten problem, lub może rozwiązać ten problem i złamać naszą witrynę, więc nasi devops martwili się o wprowadzenie tej zmiany. –