Tracy'ye Başlarken

Tracy kütüphanesi, PHP programcısının günlük olarak kullandığı yararlı bir yardımcıdır. Size yardımcı olur:

  • hataları hızla tespit etme ve düzeltme
  • hataları günlüğe kaydetme
  • değişkenleri yazdırma
  • betiklerin ve veritabanı sorgularının süresini ölçme
  • bellek gereksinimlerini izleme

PHP, geliştiricilere önemli ölçüde özgürlük verdiği için tespit edilmesi zor hatalar oluşturmak için mükemmel bir dildir. Bu nedenle hata ayıklama aracı Tracy daha da değerlidir. PHP için teşhis araçları arasında mutlak zirveyi temsil eder.

Bugün Tracy ile ilk kez karşılaşıyorsanız, hayatınızın Tracy'den öncesi ve sonrası olarak ikiye ayrılacağına inanın. Daha iyi kısma hoş geldiniz!

Kurulum

Tracy'yi kurmanın en iyi yolu en son paketi indirmek veya Composer kullanmaktır:

composer require tracy/tracy

Ayrıca tüm paketi tracy.phar dosyası olarak da indirebilirsiniz.

Kullanım

Tracy'yi programın başlangıcında, herhangi bir çıktı gönderilmeden önce mümkün olan en kısa sürede Tracy\Debugger::enable() metodunu çağırarak etkinleştiririz:

use Tracy\Debugger;

require 'vendor/autoload.php'; // veya tracy.phar

Debugger::enable();

Sayfada fark edeceğiniz ilk şey, sağ alt köşedeki Tracy Bar'dır. Görmüyorsanız, Tracy'nin üretim modunda çalıştığı anlamına gelebilir. Tracy, güvenlik nedenleriyle yalnızca localhost'ta görünür. Çalışıp çalışmadığını test etmek için, Debugger::enable(Debugger::Development) parametresini kullanarak geçici olarak geliştirme moduna geçirebilirsiniz.

Tracy Bar

Tracy Bar, sayfanın sağ alt köşesinde görüntülenen kayan bir paneldir. Fare ile hareket ettirebiliriz ve sayfa yeniden yüklendikten sonra konumunu hatırlar.

Tracy Bar'a başka yararlı paneller eklenebilir. Birçoğunu eklentilerde bulabilir veya hatta kendiniz yazabilirsiniz.

Tracy Bar'ı görüntülemek istemiyorsanız, şunu ayarlayın:

Debugger::$showBar = false;

Hataların ve İstisnaların Görselleştirilmesi

PHP'nin hataları nasıl bildirdiğini kesinlikle iyi biliyorsunuz: sayfanın kaynak koduna şöyle bir şey yazar:

Parse error:  syntax error, unexpected '}' in HomePresenter.php on line 15

veya yakalanmamış bir istisna durumunda:

Fatal error:  Uncaught Nette\MemberAccessException: Call to undefined method Nette\Application\UI\Form::addTest()? in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php:100
Stack trace:
#0 /sandbox/vendor/nette/utils/src/Utils/Object.php(75): Nette\Utils\ObjectMixin::call(Object(Nette\Application\UI\Form), 'addTest', Array)
#1 /sandbox/app/Forms/SignFormFactory.php(32): Nette\Object->__call('addTest', Array)
#2 /sandbox/app/Presentation/Sign/SignPresenter.php(21): App\Forms\SignFormFactory->create()
#3 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(181): App\Presentation\Sign\SignPresenter->createComponentSignInForm('signInForm')
#4 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(139): Nette\ComponentModel\Container->createComponent('signInForm')
#5 /sandbox/temp/cache/latte/15206b353f351f6bfca2c36cc.php(17): Nette\ComponentModel\Co in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php on line 100

Böyle bir çıktıda gezinmek pek kolay değildir. Tracy'yi açarsak, hata veya istisna tamamen farklı bir biçimde görüntülenir:

Hata mesajı kelimenin tam anlamıyla bağırıyor. Hatanın meydana geldiği vurgulanmış satırla birlikte kaynak kodunun bir bölümünü ve Call to undefined method Nette\Http\User::isLogedIn() bilgisini görüyoruz, bu da hatanın ne olduğunu açıkça açıklıyor. Ayrıca tüm sayfa canlıdır, daha fazla ayrıntıya tıklayabiliriz. Deneyin.

Ve biliyor musunuz? Bu şekilde ölümcül hataları bile yakalar ve görüntüler. Herhangi bir eklenti yüklemeye gerek kalmadan.

Değişken adındaki bir yazım hatası veya var olmayan bir dosyayı açma girişimi gibi hatalar, E_NOTICE veya E_WARNING seviyesinde mesajlar üretir. Bunlar sayfa grafiğinde kolayca gözden kaçabilir, hatta hiç görünmeyebilir (sayfa koduna bakmadıkça).

Veya hatalarla aynı şekilde görüntülenebilirler:

Debugger::$strictMode = true; // tüm hataları göster
Debugger::$strictMode = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED; // kullanımdan kaldırma bildirimleri dışındaki tüm hatalar

Not: Tracy etkinleştirildikten sonra hata raporlama seviyesini E_ALL olarak değiştirir. Bu değeri değiştirmek isterseniz, enable() çağrısından sonra yapın.

Geliştirme vs Üretim Modu

Gördüğünüz gibi, Tracy oldukça konuşkan, bu geliştirme ortamında takdir edilebilir, ancak üretim sunucusunda tam bir felakete neden olur. Orada hiçbir hata ayıklama bilgisi yazdırılmamalıdır. Bu nedenle Tracy ortamın otomatik tespiti özelliğine sahiptir ve örnek canlı bir sunucuda çalıştırılırsa, hata görüntülenmek yerine günlüğe kaydedilir ve ziyaretçi yalnızca kullanıcı dostu bir mesaj görür:

Üretim modu, dump() kullanarak gönderdiğimiz tüm hata ayıklama bilgilerinin ve tabii ki PHP tarafından üretilen tüm hata mesajlarının görüntülenmesini engeller. Bu nedenle, kodda bazı dump($obj) unutmuşsanız endişelenmenize gerek yok, üretim sunucusunda hiçbir şey yazdırılmaz.

Modun otomatik tespiti nasıl çalışır? Uygulama localhost'ta (yani IP adresi 127.0.0.1 veya ::1) çalıştırıldığında ve bir proxy mevcut olmadığında (yani HTTP başlığı olmadığında) mod geliştirme modudur. Aksi takdirde üretim modunda çalışır.

Geliştirme modunu diğer durumlarda da etkinleştirmek istersek, örneğin belirli bir IP adresinden erişen programcılar için, bunu enable() metodunun parametresi olarak belirtiriz:

Debugger::enable('23.75.345.200'); // IP adresleri dizisi de belirtilebilir

IP adresini bir çerezle birleştirmenizi kesinlikle öneririz. tracy-debug çerezine gizli bir belirteç, örneğin secret1234 kaydederiz ve bu şekilde geliştirme modunu yalnızca belirli bir IP adresinden erişen ve çerezde belirtilen belirtece sahip olan programcılar için etkinleştiririz:

Debugger::enable('secret1234@23.75.345.200');

Geliştirme/üretim modunu ayrıca Debugger::Development veya Debugger::Production sabitini enable() metodunun parametresi olarak kullanarak doğrudan ayarlayabiliriz.

Nette Framework kullanıyorsanız, onun için modu nasıl ayarlayacağınıza bakın ve bu daha sonra Tracy için de kullanılacaktır.

Hata Günlüklemesi

Üretim modunda, Tracy tüm hataları ve yakalanan istisnaları otomatik olarak bir metin günlüğüne kaydeder. Günlüklemenin gerçekleşebilmesi için, günlükleme dizinine mutlak yolu $logDirectory değişkenine ayarlamamız veya enable() metodunun ikinci parametresi olarak iletmemiz gerekir:

Debugger::$logDirectory = __DIR__ . '/log';

Hata günlüklemesi son derece yararlıdır. Uygulamanızın tüm kullanıcılarının aslında ücretsiz olarak hata bulmada mükemmel bir iş çıkaran beta testçileri olduğunu hayal edin ve onların değerli raporlarını fark edilmeden çöp kutusuna atarak aptallık yapmış olursunuz.

Kendi mesajımızı veya yakaladığınız bir istisnayı günlüğe kaydetmemiz gerekirse, bunun için log() metodunu kullanırız:

Debugger::log('Beklenmedik bir hata oluştu'); // metin mesajı

try {
	kritikOperasyon();
} catch (Exception $e) {
	Debugger::log($e); // istisna da günlüğe kaydedilebilir
	// veya
	Debugger::log($e, Debugger::ERROR); // e-posta bildirimi de gönderir
}

Tracy'nin E_NOTICE veya E_WARNING gibi PHP hatalarını ayrıntılı bilgilerle (HTML raporu) günlüğe kaydetmesini istiyorsanız, Debugger::$logSeverity ayarlayın:

Debugger::$logSeverity = E_NOTICE | E_WARNING;

Gerçek bir profesyonel için hata günlüğü önemli bir bilgi kaynağıdır ve her yeni hatadan hemen haberdar olmak ister. Tracy bu konuda ona yardımcı olur, çünkü günlükteki yeni bir kayıt hakkında e-posta ile bilgi verebilir. E-postaların nereye gönderileceğini $email değişkeni ile belirleriz:

Debugger::$email = 'admin@example.com';

Tüm Nette Framework'ü kullanıyorsanız, bunu ve diğer ayarları yapılandırma dosyasında ayarlayabilirsiniz.

Ancak e-posta gelen kutunuzu doldurmamak için her zaman yalnızca bir mesaj gönderir ve email-sent adlı bir dosya oluşturur. Geliştirici, e-posta bildirimini aldıktan sonra günlüğü kontrol eder, uygulamayı düzeltir ve izleme dosyasını siler, böylece e-posta gönderimi yeniden etkinleştirilir.

Düzenleyicide Açma

Hata sayfası görüntülendiğinde, dosya adlarına tıklayabilirsiniz ve bunlar düzenleyicinizde ilgili satırda imleçle açılır. Ayrıca dosyalar oluşturabilir (eylem create file) veya içlerindeki hataları düzeltebilirsiniz (eylem fix it). Bunun çalışması için tarayıcıyı ve sistemi yapılandırmanız yeterlidir.

Desteklenen PHP Sürümleri

Tracy PHP ile uyumlu
Tracy 2.10 – 3.0 PHP 8.0 – 8.4
Tracy 2.9 PHP 7.2 – 8.2
Tracy 2.8 PHP 7.2 – 8.1
Tracy 2.6 – 2.7 PHP 7.1 – 8.0
Tracy 2.5 PHP 5.4 – 7.4
Tracy 2.4 PHP 5.4 – 7.2

Son yama sürümü için geçerlidir.

Portlar

Bu, diğer frameworkler ve CMS'ler için resmi olmayan portların bir listesidir: