2009-07-30 6 views
9

Próbuję debugować ogromny, przestarzały (około 2001) serwis WWW PHP i napotykam na awarie plików. Wywołanie fopen znajduje się w dołączonym module, wywołujący rejestruje, że pliku nie można otworzyć, ale nie jest rejestrowany żaden powód.Jak wyprowadzić powód otwartego pliku PHP

Kod, który faktycznie robi czynna jest:

// Read the file 
    if (!($fp = @fopen($fileName, 'rb'))) { 
    $errStr = "Failed to open '{$fileName}' for read."; 
    break; // try-block 
    } 

Jak mogę dowiedzieć się, dlaczego fopen powiodło?

Odpowiedz

1

Wielkie odpowiedzi zostały już podane, o @ operator, ale tutaj jest kilka więcej informacji, które mogą być przydatne zarówno dla Ciebie lub kogoś innego:

  • Jeżeli dla celów debugowania, musisz Wyłącz @ operator można zainstalować scream extension- patrz też the manual - co jest bardzo przydatne, gdy jesteś utrzymanie jakieś starej aplikacji nie dobrze zaprojektowane/zakodowany ^^
  • w zależności od PHP konfiguracyjne (jeżeliOpcjajest włączona), możesz być w stanie użyć $php_errormsg, aby uzyskać ostatni komunikat o błędzie.

Biorąc pod uwagę ten kawałek kodu:

// This file doesn't exist 
if ([email protected]('/tmp/non-existant-file.txt', 'r')) { 
    var_dump($php_errormsg); 
} 

// My Apache server doesn't have the right to read this file 
if ([email protected]('/tmp/vboxdrv-Module.symvers', 'w')) { 
    var_dump($php_errormsg); 
} 

co można uzyskać to:

string 'fopen(/tmp/non-existant-file.txt) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory' (length=129) 

string 'fopen(/tmp/vboxdrv-Module.symvers) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: Permission denied' (length=122) 

tak, to prawdziwe, przydatne sensownych, komunikaty o błędach ;-)

9

Zabierz znak @.

Znak @ wyłącza komunikaty o błędach, więc tłumi błąd, który normalnie by funkcja ta powodowała.