![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 12.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Problem polega na optymalizacji operacji w trakcie przetwarzania obrazka - zmiana rozdzielczosci i jego ponowne zapisanie! Przesyłanych pól w formularzu jest 7. Problem zaczyna się kiedy wysyłam pliki graficzne których wielkości przekracza 256 kb - i jest ich kila w pewnym momencie pojawia się błąd o treści: Fatal error: Allowed memory size of 20971520 bytes exhausted (tried to allocate 8704 bytes) in /home/.../ftp/.../spr3.php on line 101 Serwer na którym pracuje ma wprowadzone ograniczenie 20MB. Może znacie sposób obróbki obrazka inny niż ja - lub jak podzielić mój skrypt na operacje aby się zmieścić w limicie?? Oto kod!:
a to wynik działania tego formularza: array ( 'action' => 'd1', 'w' => 'Zapisz', ) array ( 'zdj_p1' => array ( 'name' => 'list motywacyjny1.jpg', 'type' => 'image/jpeg', 'tmp_name' => '/tmp/php9Izb0I', 'error' => 0, 'size' => 258787, ), 'zdj_p2' => array ( 'name' => 'List[Andrzej].GIF', 'type' => 'image/gif', 'tmp_name' => '/tmp/phpjCXT0F', 'error' => 0, 'size' => 183603, ), 'zdj_1' => array ( 'name' => 'error.jpg', 'type' => 'image/jpeg', 'tmp_name' => '/tmp/phpiTN7n4', 'error' => 0, 'size' => 365525, ), 'zdj_2' => array ( 'name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0, ), 'zdj_3' => array ( 'name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0, ), 'zdj_4' => array ( 'name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0, ), 'zdj_5' => array ( 'name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0, ), ) Nazwa - list motywacyjny1.jpg Typ - image/jpeg Wielko�ć kb - 258787 to jest JPG Fatal error: Allowed memory size of 20971520 bytes exhausted (tried to allocate 8704 bytes) in /home/.../ftp/.../spr3.php on line 101 Ten post edytował smarcz 26.02.2007, 13:48:50 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 157 Pomógł: 0 Dołączył: 12.02.2007 Skąd: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
A tu nie powinno być przypadkiem tak ![]()
size określa wielkośc wrzucanego pliku na serwer, łatwe do obejścia, ale jest częstą przyczyną błędów u początkujących. PZDR -------------------- ------
Per Aspera Ad Astra |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 1 033 Pomógł: 125 Dołączył: 17.09.2005 Skąd: Żywiec Ostrzeżenie: (0%) ![]() ![]() |
sprawdź czy wydajność się poprawi gdy zaczniesz stosować imagedestroy" title="Zobacz w manualu PHP" target="_manual
-------------------- "Sumienie mam czyste, bo nieużywane."
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 12.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za podpowiedź Kicok, też czytałem o tym dziś w Manualu - zastosowałem nic z tego. Tu chodzi chyba o pamięć CACHE serwera. Bo czasem jest tak, że pierwszy (1) plik dodawany w formularzu (7 pól input files) ma pojemność większą niż 200 kb i bład Fatal Error pojawia się dla linii kodu:
Że pamięc została przekroczona - tak więc nie wiem od czego to zależy!? ![]() Wygląda to tak, jakby plik który idzie do przetwarzania powiększał się. Może jest jakiś sposób na określenie pamięci dla takiej operacji. Czytałem dziś w Manualu na temat: clearstatcache — Czyści bufor statusu pliku lub memory_get_usage Może jest jakieś polecenie które wyświetla stan pamięci BUFORA. Ja potrzebuje się zmieścić w 20 MB na serwerze. Chyba, że jest jakiś inny sposób na zmianę rozdzielczości obrazka?? ----00.33 27.02.2007---- Tak więc po kilkunastu testach z użyciem funkcji memory_get_usage() - która wyświetla pamięć używaną stwierdzam: Plik jpg który ma wielkość [bajtach] 615184 (601 kb) po wykonaniu poniższego kodu:
zmienia swoją pojemność po stronie serwera następująco: 9780648 - Po ImageCreateFromJpeg($plik); 9780792 - Po zmianie rozdzielczości 11141968 11Mb - Przed imagedestroy 1525056 - Po wykonaniu imagedestroy I tak mnie nie satysfakcjonuje taka wielkość zajmowanej pamięci - prawie 1,5 MB. Stosując [/u]unset($zmienna) zajmowana pamięć się tylko powiększała. Dziwne bo za pomocą tej funkcji usuwa się zmienna z pamięci. Ale może koledzy macie inne doświadczenia - proszę o testy i przykłady jak zrobić aby wyczyścić bufor poniżej 1 MB? Ten post edytował smarcz 27.02.2007, 00:34:24 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 112 Pomógł: 20 Dołączył: 10.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
nie wiem czy to coś pomoże, ale wydaje mi się, że nie musisz zapisywać plików z kompresją ustawioną na 100. Przy zmniejszeniu kompresji do 80-90 (przetestuj) nie zauważysz różnicy w jakości pliku, a jego rozmiar spadnie znacząco - co z kolei powinno mieć wpływ na ilość danych w buforze - właśnie w tym miejscu jest tam największa ilość danych.
pozdr. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 12.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Tak więc po kolejnym dniu prób - stwierdzam - zmiana kompresji -> znikomy efekt (ale zawsze coś) Jeszcze dziś robiłem testy i co dziwnego odkryłem - bawiłem się z dodawaniem plików jpg z aparatu cyfrowego - niektóre pliki o pojemności powyżej 1 MB prawie 2 MB załączały się przez formularz bez problemu mieszcząc się w dozwolonym buforze 20 MB. Owszem w trakcie wczytywania ImageCreateFrom?
![]() ![]() Moje pytanie - jak określić przed wczytaniem do ImageCreateFrom? ![]() Lub inaczej jak stworzyć dla takiego formularza obsługę błędów aby nie pojawiał się komunikat Fatal error i przerywał działanie skryptu - tylko ładnie wcześniej użytkownika poinformować że dodawany plik nie spełnia wymagań? Może to tędy droga - aby wcześniej wywalić błąd a nie przerywać działania skryptu co jest nieporządane w trakcie zapisu wyników do bazy danych MySQL Z góry dzięki za wszelkie podpowiedzi. Jakieś gotowe skrypty - możecie pisać na maila smarcz@interia.pl |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 10:18 |