PHP Hata Ayıklama - PHP Kodunuzda Hata Ayıklama (Drupal hata ayıklama teknikleri dahil!)

Yayınlanan: 2019-09-03

Hata ayıklama, biz geliştiricilerin sabırsızlıkla beklediği bir şey değil. Geliştiriciler hatalardan nefret eder, ancak kaliteli bir yazılım oluşturabilmek için hata ayıklama, geliştiricinin hayatının vazgeçilmez bir parçasıdır. Her PHP geliştiricisinin kodlarında hata ayıklamak için farklı bir stili ve başvurulacak yöntemleri vardır. Bu onların deneyimlerine, problem çözme yaklaşımlarına ve en önemlisi - ellerinde ne kadar zamana sahip olduklarına bağlıdır!

Hata ayıklama ne kadar önemlidir ve neden kodunuzda hata ayıklamanız gerekiyor?

Hata ayıklama, kaliteli sonuçlar sağlayan bir yazılım geliştirme yaşam döngüsünün ayrılmaz bir parçasıdır.
Bunu hayal edin - Kod tabanı büyük, Projede yenisiniz, Proje/işlevsellik hakkında fazla ayrıntıya sahip değilsiniz. Ama bir hatayı düzeltmen gerekiyor. Nereden başlıyoruz? Ne yapıldığını ve işlerin nerede yanlış gittiğini anlamak için kodu adım adım analiz ederek başlıyoruz. Bu, arkadaşlarım, Hata Ayıklama. Hata ayıklama, pratik ve deneyimle daha iyi hale gelebilecek bir sanattır.

PHP kodunuzda nasıl hata ayıklanır

Tamam, işte geliştirme kariyerimde karşılaştığım bir vaka. Wordpress üzerine kurulu bir ticaret sitesi var ve ödeme işlemi 5-8 dakika civarında sürüyordu ve çözmem istendi. Bu durumda, işlerin Wordpress ile nasıl çalıştığı hakkında fazla bilgim yok. Bu yüzden, (a) Bir eklenti yüzünden mi? (b) Temayla mı ilgili? (c) Herhangi bir özel kod tabanı var mı? vb.

Php hatalarını ayıklamamda ve bu vakayı çözmemde bana yardımcı olan araç Blackfire. Bu size, tüm süreçteki her bir işlev için geçen süre olan tüm işlevlerin yığın izlemesi için daha kullanıcı tarafından okunabilir bir seçenek sunar. Bunu kullanarak, ödeme sürecini tüketen işlevi buldum. Tek ihtiyacınız olan, anahtarı kod tabanınıza eklemek için bazı kurulumlardır ve hepiniz belgeleri kullanarak herhangi bir işlevi analiz etmeye hazırsınız.
Böylece, birden fazla php hata ayıklama yöntemi hakkında bilginiz varsa, hataları çözebilirsiniz.

Kod Hata Ayıklama Teknikleri

PHP'de hata ayıklamak için kullandığım birkaç teknikten bahsedeyim.
Yazdığınız işlevin veya yöntemin çağrıldığını kontrol etmenin basit ve en yaygın bir yolu, bir çıkış yazın. Bunu kullanmayan hiçbir geliştirici olmazdı!
Bir değişkenin değerini kontrol etmek için print_r(), var_dump(), var_export(). Tamam, farkı görelim.

Örnek:

 Bir dizi varsayalım 
$a = dizi( 1, dizi( "a", "b"));
print_r($a);

 
Sıralamak
(
[ 0 ] => 1
[ 1 ] => Dizi
(
[ 0 ] => 'bir'
[ 1 ] => 'b'
)
)

Bu, insan tarafından okunabilir bir biçim ve değişken hakkında bilgi verir. Ayrıca print_r($var, true) ile bir değişkene kaydedebiliriz.

 var_dump($a);
 dizi ( 3 ) {
[ 0 ]=>
int( 1 )
[ 1 ]=>
  dizi ( 2 ) {
[ 0 ]=>
string( 1 ) "a"
[ 1 ]=>
string( 1 ) "b"
}
}

Bu, her değerin türü ve uzunluğu ile birlikte yazdırılır. Ve bu, print_r() ile karşılaştırıldığında daha hızlıdır.
var_export($a);

 dizi (
  0 => 1 ,
  1 =>
  dizi (
    0 => 'bir' ,
    1 => 'b' ,
),
)

Bu, her değerin türü ve uzunluğu ile birlikte yazdırılır. Ve bu, print_r() ile karşılaştırıldığında daha hızlıdır.
var_export($a);

Bu, geçerli php döndürür, değişken varsa, aksi takdirde false döndürür. Bu, var_export çıktısının doğrudan bir php dosyasında kullanılabileceği anlamına gelir.

Drupal core tarafından sağlanan debug($var, NULL, TRUE) hiç kullandınız mı? Bu, php hata ayıklama işlevine iletilen bağımsız değişkenlere dayalı olarak print_r() veya var_export kullanır.

Hangi kod satırının böyle bir uyarıya neden olduğuna dair hiçbir fikriniz olmayan aşağıdaki gibi uyarılara ne dersiniz?

uyarı: 485 satırındaki /modules/node/node.module içindeki foreach() için geçersiz argüman sağlandı.

Düğüm modülünün çağrılacağı çok fazla yer olduğunu biliyoruz. Peki, bunu nasıl çözersiniz? Başka herhangi bir harici kaynak kullanmadan daha hızlı bir yol, PHP debug_backtrace() işlevini kullanmaktır. “drupal_set_message” a gidin, çünkü biliyorsunuz, uyarıyı yazdıran yöntem bu. Aşağıdaki satırı bu fonksiyona koyun

debug_backtrace();

Çıktı:

Sıralamak
(
[ 0 ] => Dizi
(
[dosya] => /includes/common.inc
[satır] => 552
[ işlev ] => drupal_set_message
[ argümanlar ] => Dizi
(
[ 0 ] => uyarı: Geçersiz

foreach() için sağlanan argüman

/modules/node/node.module 504 satırında .
[ 1 ] => hata
)

)

[1] => Dizi
(
[dosya] => /modules/node/node.module
[line] => 504
[fonksiyon] => error_handler
[args] => Dizi
(
[ 0 ] => 2
[ 1 ] => Geçersiz argüman
foreach() için sağlanan
[ 2 ] => /modüller/düğüm/
düğüm.modül
[ 3 ] => 504
[ 4 ] => Dizi
(
[param] =>
[revizyon] =>
[sıfırla] =>
...
)

)

)

[2] => Dizi
(
[dosya] => /sites/all/modules/custom/custom_module
/custom_module.module
[çizgi] => 10
[işlev] => düğüm_yükü
[args] => Dizi
(
[ 0 ] =>
)

)

[3] => Dizi
(
[dosya] => /includes/form.inc
[line] => 365
[fonksiyon] => custom_module_form_alter
[args] => Dizi
(
...

Bu işlev, uyarıya neden olma sürecinde çağrılan tüm işlevlerin yığınını gösterir. Sınırı sınırladığınızdan emin olun, aksi takdirde yığının görüntülenmesi çok uzun sürerse PHP bir "bellek tükendi" mesajı gösterir.

CLI aracılığıyla hata ayıklama:

phpdbg'yi duydum! Evet, komut satırından bir php dosyasında hata ayıklamak için kullanılan PHP 5.6+ sürümünden itibaren kullanılabilen bir php uzantısı vardır.
Terminalinizi açın, “phpdbg” girin. Bu, etkileşimli bir php hata ayıklayıcı kabuğunu başlatır. Ayrıca kesme noktalarını da kullanabilirsiniz! Sadece deneyin - PHP'de hata ayıklamanın gizli yolu.
Tek sorun şu: phpdbg'yi daha iyi kullanmak için komutlarına alışmanız gerekecek.

Drupal aracılığıyla hata ayıklama:

Devel Kint: Drupal geliştiricileri bunu oldukça sık kullanır. Kint, dump() ile birlikte Drupal 8 twig şablonlarında hata ayıklamak için kullanılabilen Devel modülünün bir alt modülüdür;

DB Günlüğü: Bu Drupal modülünden kim haberdar değil?! D7'de watchdog() ve D8'de logger servisidir.

\Drupal::logger( 'my_module' )->debug($message);

Ancak bu modüle aşık olmamıza rağmen bu modülün kullanımını teşvik etmememizin tek sebebi log mesajının her seferinde veritabanına yazılmasıdır!

Ve bunun büyük bir veritabanı olduğunu hayal edin, bu daha da kötü olur ve performansı etkiler. Bu nedenle Üretim sitelerinde DBLOG modülünün kullanılması önerilmez.
Hala DBLog, modül kullanmak ve performans etkilerini azaltmak istiyor musunuz? Bunun için de bir çözüm var - DBlog Filtresi. Bu, veritabanına yazılacak günlük türlerinin sınırlandırılmasına yardımcı olan katkıda bulunan bir modüldür. Örneğin, yalnızca “hata” önem derecesine sahip günlükleri saklamak istiyorsanız, bunları bu modül ile yapılandırabilirsiniz. Yani Dblog modülünden tamamen kurtulmanıza gerek yok. Oh evet, ve bu modül benim tarafımdan sağlanmıştır;)

Web profil oluşturucu

Web profiler, yine Devel tarafından sağlanan katkılı bir modüldür. Modülü etkinleştirdikten sonra, pencerenin altında bir rapor göreceksiniz. Bir sayfa yüklendiğinde, bu rapor bize o sayfadaki sayfa yükleme süresini, sayfada çalışan sorgu sayısını, form sayısını, js/css dosyalarının sayısını vb. verir.

web profili oluşturucu

Evet, Bu, üzerlerine tıklayarak her bölümün ayrıntılarını bile sunar. Örneğin, aşağıdaki resim ana sayfadaki sorguları göstermektedir.

Xdebug

XDebug - IDE aracılığıyla hata ayıklama:

Kodlama için bir IDE kullanıyorlarsa, çoğu insanın tercih ettiği hata ayıklamanın en iyi ve daha kullanıcı dostu yolu XDebug kullanmaktır. XDebug, geliştirmeye ve hata ayıklamaya yardımcı olan ve PHPStorm gibi bir IDE ile kullanabileceğiniz tek adımlı bir hata ayıklayıcı sağlayan bir PHP uzantısıdır. Elbette en iyi sonuçları elde etmek için kullandığınız IDE ile uzantıyı kurmak ve yapılandırmak için daha fazla çaba sarf etmeniz gerekiyor.