Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: flock() - problem ze skryptem
Forum PHP.pl > Forum > Serwery WWW
Kiubus
Witam serdecznie!
Uczę się PHP z książki "PHP i MySQL Tworzenie stron WWW. Vademecum profesjonalisty. Wydanie czwarte". Doszedłem do działu "Przechowywanie i wyszukiwanie danych", podrozdział "Przechowywanie i wyszukiwanie zamówień Janka". Jest tam przykład, który ma za zadanie zapisać złożone zamówienie w pliku *.txt
Ok, przeanalizowałem kod, troszkę objaśnień w książce jest, ale podczas uruchomienia kodu wystąpił następujący błąd:
Cytat
Warning: flock() expects parameter 1 to be resource, boolean given in /.../.../.../.../.../.../.../przetworzzamowienie.php on line 67

Zamówienie Państwa nie może zostać przyjęte w tej chwili. Proszę spróbować póŸniej.


Oto fragment kodu:
  1. // otwarcie pliku w celu dopisywania
  2. @ $wp = fopen("$DOCUMENT_ROOT/form/zamowienia.txt", 'ab');
  3.  
  4. flock($wp, LOCK_EX);
  5.  
  6. if (!$wp) {
  7. echo "<p><strong> Zamówienie Państwa nie może zostać przyjęte w tej chwili.
  8. Proszę spróbować później.</strong></p></body></html>";
  9. }
  10.  
  11. fwrite($wp, $ciagwyjsciowy, strlen($ciagwyjsciowy));
  12. flock($wp, LOCK_UN);
  13. fclose($wp);
  14.  
  15. echo "<p>Zamówienie zapisane.</p>";


Linia błędu to:
  1. flock($wp, LOCK_EX);

Bardzo proszę o pomoc, nie wiem co jest przyczyną tego błędu sad.gif
Liczę na pomoc i pozdrawiam!
_Borys_
fopen()
Kiubus
Błąd będzie dotyczył:
Cytat
"$DOCUMENT_ROOT/form/zamowienia.txt"

? Na moje oko tutaj jest wszystko w porządku.
Na moim serwerze parametr "safe_mode" ma ustawioną wartość "Off" a "open_basedir" ma wartość "no value". Trzeba przełączyć je na "On"?
_Borys_
Coś w ścieżce do pliku masz pomieszane, powinno byś coś w stylu $_SERVER['DOCUMENT_ROOT']
i usuń małpę sprzed $wp = fopen...
Kiubus
Mam na początku pliku przypisanie zmiennej:
  1. $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];

phpinfo() wskazuje, że:
Cytat
DOCUMENT_ROOT /home/kubuss/domains/kubuss.pdg.pl/public_html/php

Plik z phpinfo() jest umieszczony na subdomenie, na której testuję ten skrypt. Skrypt znajduje się na tej subdomenie w folderze /form/.
_Borys_
Czytałeś TO ?
Kiubus
nie, ale po przeczytaniu tego nadal nie widzę rozwiązania problemu ;/
abort
Po pierwsze i najważniejsze: wykasuj "@" z kodu. Ukrywanie błędów to samo zło.

Po drugie, lepszą formą jest:
Kod
$filename = "$DOCUMENT_ROOT/form/zamowienia.txt";
$wp = fopen($filename, 'ab');
if (! $wp) {
  echo "<p><strong> Zamówienie Państwa nie może zostać przyjęte w tej chwili.
        Proszę spróbować później.</strong></p></body></html>";
  exit;
}

flock($wp, LOCK_EX);


Dlaczego? Ano:
1. po pierwsze, mając nazwę pliku w zmiennej łatwiej nam tę nazwę gdzieś póżniej wyświetlić (np. w komunikacie o błędzie, ale tylko w fazie testowania, bo na produkcji już nie), a zawsze łatwiej zmienić smile.gif
2. flock() używamy PO SPRAWDZENIU warunku na możliwość złożenia zamówienia - użytkownik zobaczy tylko komunikat o niemożliwości złożenia zamówienia, a nie zobaczy tekstu "Warning: flock() expects parameter 1 to be resource, boolean given in /.../.../.../.../.../.../.../", który będzie świadczył o (delikatnie mówiąc) nieprzemyśleniu wszystkiego
3. Jeszcze raz o "@" i ukrywaniu błędów: jeśli masz miejsce, w którym może wystąpić błąd, to ZAWSZE można przerobić kod na taki, w którym użycie "@" nie będzie konieczne. Owszem, najczęściej taki kod będzie dłuższy, ale nie będziesz miał takiej sytuacji jak w przykładzie z książki, że błąd odbija się czkawką w zupełnie innym miejscu.

Kiubus
Sorki, że dopiero teraz odpowiadam ale znalazłem chwilę czasu.
Po zmianie na Twój kod otrzymałem błąd następującej treści:
Cytat
Warning: fopen(/home/kubuss/domains/kubuss.pdg.pl/public_html/php/form/zamowienia.txt) [function.fopen]: failed to open stream: Permission denied in /home/kubuss/domains/kubuss.pdg.pl/public_html/php/form/przetworzzamowienie.php on line 66

Błąd dotyczy poniższej linii kodu:
  1. $wp = fopen($filename, 'ab');

Ścieżka do pliku jest na 100% prawidłowa.

Ok, poczytałem w necie na temat tego typu błędów.
Zmieniłem chmody na 666 i działa. Dziękuję wszystkim za pomoc i chęć pomocy smile.gif
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.