Archive for the ‘Programowanie PHP’ Category

Piekło die();

Author: Krzysztof Wawoczny (Krzysztof Wawoczny) | listopad 29th, 2009

Natchnęło mnie dziś do pomyślenia jak uchronić się przed niebezpieczeństwami związanymi z stosowaniem die() w kodzie…tak wiem że była o tym parę razy mowa, że to zło w najczystszej postaci,  że najlepiej korzystać z xdebug, a najlepiej nigdy nie korzystać z die() w kodzie.

Wszystko ma jednak swoje wady i zalety – o ile w pracy xdebuga mogę sobie skonfigurować pod netbeansa to w domu nie korzystam z tego IDE (połączenie przez OpenVPN i dość częste skanowanie projektu jest nader uciążliwe). Dlatego zaczerpnąłem nieco mocy googla i po kilku testach przedstawiam:  FirePHP.

FirePHP to całkiem zgrabny logger dla PHP wykorzystujący Firebuga – ku mojemu zdziwieniu jest to całkiem niezły plugin, do jego działania wystarczy mieć zainstalowaną wtyczkę Firebug z włączoną zakładką sieć i konsola. Instalując FirePHP trzeba jeszcze pamiętać o zaciągnięciu biblioteki FirePHPCore, którą rozpakowujemy do katalogu roota (w moim przypadku to katalog web w symfony).  FirePHP pokaże się jako niebieski robal (widoczny na poniższym zrzucie).

Mając to wszystko jesteśmy niemal gotowi by bezpiecznie debugować skrypty. Do skryptu dołączamy:

require_once('FirePHPCore/FirePHP.class.php');

Teraz już poprzez wywołanie w postaci:

$firephp = FirePHP::getInstance(true);
$firephp->log($var, 'nieobowiazkowy opis dla loga');

Zobaczymy w zakładce konsola Firebuga wartość zmiennej $var poprzedzoną opisem podanym jako drugi parametr funkcji log.
Dla własnej wygody napisałem krótką funkcję ustawiającą podstawowe parametry debugowania:

/**
* Function is used for debuging this scrypt, in prod environment change
* $firephp->setEnabled(true); to false.
*
* @param object $var
* @param string $desc[optional]
*/
public function keep($var, $desc = null)
{
  $options = array(
  'maxObjectDepth' => 10,
  'maxArrayDepth' => 20,
  'useNativeJsonEncode' => true,
  'includeLineNumbers' => true);

  $firephp = FirePHP::getInstance(true);
  $firephp->setEnabled(true);
  $firephp->setOptions($options);
  $firephp->log($var, $desc);
}

Ważne aby pamiętać iż dla własnego bezpieczeństwa należy w środowisku produkcyjnym ustawić setEnabled na false.

Posłużę się Jobeetem, zatem moja funkcja index wygląda tak:

public function executeIndex(sfWebRequest $request)
{
  $vars = 0;
  $this->categories = Doctrine::getTable('JobeetCategory')->getWithJobs();
  $this->keep($vars, "at line: ".__LINE__);
  $vars = 12;
  $this->keep($vars, "at line: ".__LINE__);
}

drugi parametr funkcji keep służy mi jako informacja pozwalająca szybko odnaleźć miejsce z wywołaniem logera. Wynik logowania prezentuje się następująco:

Debugowanie z użyciem FirePHP

Ciekawsze wyniki można uzyskać deklarując przykładową tablicę z danymi – najeżdżając kursorem myszy na wynik debugowania tablicy ukaże się okienko jak na poniższym zrzucie – możemy tutaj nieco dokładniej przyjrzeć się zwróconym wartościom.

Debugowanie z FirePHP 2

Na koniec chciałbym zauważyć, że odświeżenie strony nie zawsze powoduje odświeżenie wyników debugowania, prowadzi to wręcz do ich utraty – należy wówczas kliknąć w Firebugu opcję Off a następnie On dzięki czemu zobaczymy aktualne dane.

Zachęcam do korzystania z FirePHP i testowania jego pozostałych funkcjonalności.

http://www.firephp.org/HQ/Use.htm