Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dziwny problem z fopen
Forum PHP.pl > Forum > PHP
jajcarzd1
Witam

Mam takie dziwny problem. Otóż używam poniższej konstrukcji do sprawdzenia czy istnieje plik graficzny na zdalnym serwerze.

  1. if(fopen('http://subdomena.serwer.pl/studio/500_348214-222@b.jpg','r')) return true; else return false;


Oczywiście plik ten istnieje ale w trakcie wywoałania funkcji wywala mi warninga

  1. Warning: fopen(http://...@b.jpg) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in ..


tak jakby obcinał mi nazwę pliku do małpy. Co ciekawe wywołanie np. getimagesize zwraca mi podobny błąd

  1. getimagesize('http://subdomena.serwer.pl/studio/500_348214-222@b.jpg');
  2. Warning: getimagesize(http://...@b.jpg) [function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found


Wystepuje to na serwerze produkcyjnym jak lokalnie nakompie odpalam skrypt jest ok. Ale co ciekawsze jeśli na serwerze produkcyjnym wywoła fopen do innego serwera na kórym jest to samo zdjęcie to ta druga instrukcja już błędu nie zwraca

  1.  
  2. if(fopen('http://subdomena.serwer.pl/studio/500_348214-222@b.jpg','r')) return true; else return false;
  3. if(fopen('http://subdomena.serwer2.pl/studio/500_348214-222@b.jpg','r')) return true; else return false;
  4.  
  5. //poprawka żeby nie wprowadzać w błąd w rzeczywistości testowałem z echem czyli:
  6.  
  7. if(fopen('http://subdomena.serwer.pl/studio/500_348214-222@b.jpg','r')) echo "jest na serwer 1"; else echo "nie ma na serwer 1";
  8.  
  9. echo "<br>";
  10.  
  11. if(fopen('http://subdomena.serwer2.pl/studio/500_348214-222@b.jpg','r')) echo "jest na serwer 2 "; else echo "nie ma na serwer 2";


wiec juz pojęcia nie mam co to może być bo sądziłem że może jakieś ograniczenia ale wtedy odwołanie do serwer2.pl też by mi wywalało błąd.

Dodam że allow_url_fopen = ON

Co o tym sądzicie ?
Quadina
Z tego co mi wiadomo, nie można w systemach uniksowych używać znaku @ więc dziwie się, że zwraca Ci błąd. Znak @ wykorzystuje się w takiej sytuacji łączenia się ze stroną do której wymagany jest HTTP Auth np.:
Kod
http://login:haslo@domena.pl

Zatem system zwraca ci błąd poprawnie, nie masz pliku b.jpg w folderze lokalnym.

Co do sytuacji z dwoma linijkami, to pamiętaj, że linijkę wyżej robisz return, zatem druga linijka już się nie wykona, bo funkcja zakończy działanie z odpowiednim wynikiem.
jajcarzd1
Cytat(Quadina @ 19.12.2010, 22:17:02 ) *
Z tego co mi wiadomo, nie można w systemach uniksowych używać znaku @ więc dziwie się, że zwraca Ci błąd. Znak @ wykorzystuje się w takiej sytuacji łączenia się ze stroną do której wymagany jest HTTP Auth np.:
Kod
http://login:haslo@domena.pl

Zatem system zwraca ci błąd poprawnie, nie masz pliku b.jpg w folderze lokalnym.


Ok też to brałem pod uwagę ale tak jak pisałem odwołanie z tego samego skryptu ale do innego serwera już zwraca poprawny wynik.

Cytat(Quadina @ 19.12.2010, 22:17:02 ) *
Co do sytuacji z dwoma linijkami, to pamiętaj, że linijkę wyżej robisz return, zatem druga linijka już się nie wykona, bo funkcja zakończy działanie z odpowiednim wynikiem.


Tu akurat wrzuciłem z returnami ale normalnie w celach testowych miałem ech-a więc to nei jest problemem, bo wyglada tak
  1. if(fopen('http://subdomena.serwer.pl/studio/500_348214-222@b.jpg','r')) echo "jest na serwer 1"; else echo "nie ma na serwer 1";
  2.  
  3. echo "<br>";
  4.  
  5. if(fopen('http://subdomena.serwer2.pl/studio/500_348214-222@b.jpg','r')) echo "jest na serwer 2 "; else echo "nie ma na serwer 2";
  6.  


Dodam jeszcze że na innym serwerze uniksowym wywołuje ten sam kod i działa bez problemu
mls
Ustaw w php.ini na lokalnym serwerze ERROR_REPORTING = E_ALL oraz DISPLAY_ERRORS = On to zobaczysz, że lokalnie też takie błędy będzie wyświetlało. I znak "@" w nazwie pliku nie ma nic do rzeczy, jeśli już, to ma znaczenie użycie go przed fopen (czyli @fopen(...))
jajcarzd1
Cytat(mls @ 20.12.2010, 11:32:11 ) *
Ustaw w php.ini na lokalnym serwerze ERROR_REPORTING = E_ALL oraz DISPLAY_ERRORS = On to zobaczysz, że lokalnie też takie błędy będzie wyświetlało. I znak "@" w nazwie pliku nie ma nic do rzeczy, jeśli już, to ma znaczenie użycie go przed fopen (czyli @fopen(...))


Ale gdyby sypało błędem to by nie ciagnęło pliku. Poza tym tak jak pisałem w tym samym skrypcie przecięz sa 2 identyczne linijki gdzie pierwsza wali warninga a druga juz nie bo przeciez jest otwierany plik
surrealistic
Spróbuj użyć przed fopen '@'.
jajcarzd1
Cytat(surrealistic @ 20.12.2010, 12:15:36 ) *
Spróbuj użyć przed fopen '@'.


Chyba nie czytałeś postu dokładnie. NIe interesuej mnie maskowanie błędu tylko kwestia występowania błędu dla jednego linku a dla drugiego poniżej już nie. Jeden jest linijkę niżej od drugiego. I w pierwszym jest obcinany adres a w drugim zdjęcie jest poprawnie otwierane
franki01
Jeżeli @ powoduje błąd, to go zastąp:

  1. if(fopen('http://subdomena.serwer.pl/studio/500_348214-222%25b.jpg','r')) return true; else return false;
jajcarzd1
Cytat(franki01 @ 20.12.2010, 13:46:05 ) *
Jeżeli @ powoduje błąd, to go zastąp:

  1. if(fopen('http://subdomena.serwer.pl/studio/500_348214-222%25b.jpg','r')) return true; else return false;


Tez tego próbowałem ale wtedy mimo ze adres jest już pełny to jednak nie widzi pliku

A może serwer zdalny z którego ciągnięte jest zdjęcie ma jakieś ustawienie które wpływa na takei zachowanie.
Próbowałem jeszcze CURL-em no i oczywiście z tego pierwszega serwera zdjęcia nie ciągnie tylko zapisuje mi w pliku do którego miałobyć zapisane zdjęcie tekst HTML

  1. The requested URL /studio/500_348214-222@b.jpg was not found on this server.


a linijkę niżej robię wywołanie dla tego drugiego serwera no i fotkę oczywiście ciągnie i zapisuje do pliku.
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.