Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: @ w funkcjach na nginxie?
Forum PHP.pl > Forum > PHP
warder
Cześć, mam wtyczkę w PHP, która działa dobrze na serwerze Apache, część kodu odpowiedzialna za wykrywanie rozszerzenia zdalnego obrazka:

  1. //#####################################
  2. // determine image type
  3. //#####################################
  4.  
  5. // declare variables
  6. $is_gif = false;
  7. $is_jpg = false;
  8. $is_png = false;
  9.  
  10. $im = @imagecreatefromgif($tempFullPath);
  11. if ($im)
  12. {
  13. $is_gif = true;
  14. }
  15.  
  16. $im = @imagecreatefromjpeg($tempFullPath);
  17. if ($im)
  18. {
  19. $is_jpg = true;
  20. }
  21.  
  22. $im = @imagecreatefrompng($tempFullPath);
  23. if ($im)
  24. {
  25. $is_png = true;
  26. }
  27.  
  28. if ($is_gif == false AND $is_jpg == false AND $is_png == false)
  29. {
  30. $done = 'yes';
  31. }



jednak problem pojawia się, gdy użyje jej na serwerze nginx, a dokładnie gdy obrazek nie ma rozszerzenia JPG tylko PNG, to skrypt nie wykonuje się dalej, a w logach wysypuje błędem:
Kod
ErrorException: Fatal Error: imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error: Not a JPEG file: starts with 0x89 0x50 - library/Andy/ConvertImage/DataWriter.php:216


W php.ini mam wyłączyłem pokazywanie błędów (display_errors Off), jednak to nic nie dało, czy jest jakiś sposób, aby skrypt się wykonywał dalej?
Dokładna linijka odpowiedzialna za błąd to:
Kod
$im = @imagecreatefromjpeg($tempFullPath);


tak jakby małpa nie wyłączała błędów na nginxie... sad.gif
ohm
Ale wiesz że apache i nginx się mają nijak do samego php? One są tylko pośrednikami, nic więcej. Kwestia błędów to mogą być opcje w samym php.

A co do błędu, to polecam jego naprawę a nie ukrywanie smile.gif Swoją drogą, czy na pewno ten plik który przetwarzasz to jest jpeg?
nospor
Cytat
Swoją drogą, czy na pewno ten plik który przetwarzasz to jest jpeg?
@ohm a teraz wez jeszcze raz na spokojnie przeczytaj tresc pytania, tym razem ze zrozumieniem wink.gif Analiza kodu rowniez moze ci pomoc wink.gif

@warder z jakies powodu ty tam masz rzucony wyjatek.
imagecreatefromjpeg() nie rzuca wyjatkiem wiec ten wyjatek musi byc rzucany przez framework, ktorego uzywasz. Tak mi sie zdaje.
sprobuj objac to blokiem TRY CATCH moze pomoze.

@ gasi bledy w standardowej obsludze bledow. Gdy bledy przechodza przez rozne frameworki to juz to nie bedzie dzialac.
bostaf
Zajrzałem do dokumentacji biblioteki gd i okazało się, że w runtime configuration jest tylko jedno ustawienie, które można kontrolować:
Kod
gd.jpeg_ignore_warning

Od php7.1 jest domyślnie ustawione na 1, ale wcześniej było 0. Może masz różne wersje php na różnych serwerach? Albo różne ustawienia w ini?
To ustawienie nazywa się wprawdzie "warning" ale może dotyczy też errorów. Musisz sprawdzić.

Spróbuj do php.ini dodać
Kod
gd.jpeg_ignore_warning=1


albo gdzieś w kodzie dodać
Kod
ini_set('gd.jpeg_ignore_warning', 1);




Ale ja bym zrobił tak jak @nospor napisał - przechwycił ten wyjątek, bo po to wyjątki są.
A najlepiej byłoby zapobiec powstawaniu tego błędu, czyli uzależnić wykonanie wierszy 16-20 od wyniku sprawdzenia, czy plik jest rzeczywiście jpgiem np. funkcją exif_imagetype.
nospor
Cytat
A najlepiej byłoby zapobiec powstawaniu tego błędu, czyli uzależnić wykonanie wierszy 16-20 od wyniku sprawdzenia, czy plik jest rzeczywiście jpgiem

Ale on wlasnie przy pomocy wierszy 16-20 sprawdza, czy plik to jpg czy nie . Ot taka logika wink.gif
bostaf
Cytat(nospor @ 25.04.2017, 15:18:42 ) *
Ale on wlasnie przy pomocy wierszy 16-20 sprawdza, czy plik to jpg czy nie . Ot taka logika wink.gif

No racja. Ale za słabo sprawdza smile.gif
nospor
Alez ja nie mowie ze to jest dobre, ja tylko mowie ze autor obral sobie taka beznadziejna droge smile.gif
Oczywiscie ze funkcja ktora podales jest o niebo lepsza smile.gif
trueblue
Plik, który poddajesz obróbce to PNG, a nie JPEG.
Z jakiegoś powodu i raczej nie pod wpływem powyższego fragmentu kodu poddajesz ten plik obróbce przy pomocy imgecreatefromjpeg w klasie DataWriter (czyli tam wpuszczasz JPEG, który jest PNG - ma tylko rozszerzenie jpg/jpeg).
nospor
Kurcze, ile razy mozna to powtarzac: on tak robi, poniewaz on w ten sposob rozpoznaje typ plikow. No spojrzcie na jego kod. On bierze w ten sposob kazdy plik i sprawdza czy da sie otworzyc jako png. Jak sie da, znaczy ze to png. Potem sprawdza czy da sie otworzyc jako .jpg. Jak sie da, znaczy ze to jpg itd....
trueblue
nospor,
kurczę, nie przeczę i widzę to.
Tyko co z tego, że sprawdza, skoro poddaje obróbce przy pomocy funkcji imagecreatefromjpeg plik, który nie jest JPEGiem. Albo więc fragment kodu, który pokazał nie ma związku (nie używa go wcale) z wykorzystaniem klasy DataWriter, albo źle interpretuje/wykorzystuje wynik ($is_png).
nospor
Ale on blad dostaje juz na typ etapie:

$im = @imagecreatefromjpeg($tempFullPath);

a ten etap sluzy mu do sprawdzanie czy jest to jpg czy nie. Jedne z nas czegos nie widzi (i nie, nie pije do ciebie, ja tez moge nie widziec choc na chwile obecna bardziej mi sie wydaje ze ty) wink.gif

Tak, ja wiem, ze to jest beznadziejny sposob, na sprawdzanie czy cos jest jpg png czy gif. Ale tak ma, tak to robi, nic na to nie poradze.
trueblue
Najzwyczajniej nie widzisz, że mam inny tok myślenia. Mianowicie opieram go na tym, że uważam kod, który podał autor za fragment, który nie wywołuje błędu (jest innym fragmentem DataWriter.php lub całkowicie innym skryptem). Ale może się mylę.
nospor
Cytat
Mianowicie opieram go na tym, że uważam kod, który podał autor za fragment, który nie wywołuje błędu
No a ja wlasnie wrecz przeciwnie wink.gif

Ta linia:
- library/Andy/ConvertImage/DataWriter.php:216

to linia 16 z pierwszego posta autora. Jak widzisz w tym kodzie z pierwszego posta, on uzywa

imagecreatefromgif by sprawdzic czy to gif
imagecreatefromjpeg by sprawdzic czy to jpeg
imagecreatefrompng by sprawdzic czy to png

On to uzywa bezwarunkowo, za kazdym razem, dla kazdego pliku niezaleznie od tego czy to gif, jpeg czy png. On to uzywa by dopiero sprawdzic czy to jest gif a moze jpg a moze png.
Dlatego dostaje blad bo uzywa tego zawsze niezaleznie od typu pliku.

Jak to poprawic juz pisalismy
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.