Błędy przy odczycie pliku feof(), fgets() expects parameter 1 to be resource

0

Witam,
Mam taki kod:

<?php
			$file = dirname(__FILE__) . '/kopia.txt';
			$file2 = fopen('plik.txt','r');
			$data =  "\r\n".date("H:i:s")." dnia ".date("d.m.y"); 
			file_put_contents($file,$data,FILE_APPEND); 
			
					while(!feof($file2))
					{
						$linia = fgets($file2);
						file_put_contents($file,$linia, FILE_APPEND);
					}
?>

Kod ma za zadanie skopiować dane z pliku plik.tx do pliku kopia.txt
Na windows wszystko działa, natomiast na VPS (linux), wywala mi takie błędy:

[28-Nov-2019 23:12:09 Europe/Berlin] PHP Warning:  fgets() expects parameter 1 to be resource, boolean given in /var/www/html/MOZLIWOSCI/kopiowanie.php on line 9
[28-Nov-2019 23:12:09 Europe/Berlin] PHP Warning:  feof() expects parameter 1 to be resource, boolean given in /var/www/html/MOZLIWOSCI/kopiowanie.php on line 7

Plik kopia.txt się tworzy i zapisze się aktualna data i godzina, natomiast nie skopiuje się zawartość pliku. Ktoś wie jak mi pomóc? Oczywiście plik.txt jest w katalogu

2

Pierwsza rzecz, jaka mi przychodzi do głowy: Linux o wiele bardziej rygorystycznie od Windowsa podchodzi do kwestii kontroli uprawnień zapisu/odczytu. Ponadto Windows nie rozróżnia wielkości liter, natomiast Linux już tak, dlatego dla Linuksa plik.txt oraz Plik.txt są dwoma rożnymi plikami.

Błąd informuje nas o tym, że fgets nie jest w stanie odczytać niczego, ponieważ spodziewa się zasobu z którego ma pobierać treść, a otrzymuje wartość typu boolean.

Z instrukcji polecenia fopen na stronie PHP - https://www.php.net/manual/en/function.fopen.php dowiadujemy się, że to polecenie zwraca file pointer resource on success, or FALSE on failure.

Po połączeniu tych dwóch informacji jasne okazuje się, że problemem jest nie tyle sam odczyt przy pomocy fgets, co wcześniejsze otwarcie pliku. Prawdopodobnie, o czym pisałem na początku, wynika to z braku uprawnień do danego pliku, albo wielkości liter w jego nazwie.

0
cerrato napisał(a):

Po połączeniu tych dwóch informacji jasne okazuje się, że problemem jest nie tyle sam odczyt przy pomocy fgets, co wcześniejsze otwarcie pliku. Prawdopodobnie, o czym pisałem na początku, wynika to z braku uprawnień do danego pliku, albo wielkości liter w jego nazwie.

Wszystkie nazwy są poprawne, cały folder ma maksymalne uprawnienia, wszystko wykonuje na koncie root. I już nie wiem w czym problem bo z utworzeniem pliku i zapisem do niego nie ma problemu, tylko przy tym odczycie jest problem.

2

Może to kwestia na sztywno podanego "/" w ścieżce. Spróbuj użyc stałej DIRECTORY_SEPARATOR https://www.php.net/manual/en/dir.constants.php

0

Spróbowałem odczytać plik inną metodą, taki kod:

<?php

// utworzenie uchwytu do pliku
$plik = fopen('plik.txt','r');

// przypisanie zawartości do zmiennej
$zawartosc = fread($plik, 8192);

echo $zawartosc;

?>

I plik został odczytany prawidłowo, więc pomyślałem że może winą jest wielkość pliku .txt bo ma prawie 1MB, ale jeszcze nie zmniejszając wielkości pliku postanowiłem jeszcze raz uruchomić ten kod co nie działał i okazało się że działa. I wychodzi na to że działa tylko dlatego że spróbowałem raz odczytać tą inną metodą, nie wiem czemu tak, ale tak jest. I teraz za każdym razem działa prawidłowo jeśli wywołuje z poziomu przeglądarki, natomiast jeśli wywołam z poziomu crontab to dalej jest ten sam problem co pisałem w pierwszym poście. I czemu tak?

0

Uprawnienia

1

Odpalając z poziomu przeglądarki, skrypt posiada takie uprawnienia, jakie są przypisane użytkownikowi, pod którym jest odpalony serwer WWW. Odpalając to z Crona masz (prawdopodobnie) to uruchomione jako inny user. Czyli - wracamy do tego, co pisałem w pierwszym poście, czyli kwestia uprawnień w systemie dostępu do plików dla poszczególnych użytkowników.

1 użytkowników online, w tym zalogowanych: 0, gości: 1