‘da genellikle lamp yapısı kullanıyoruz. Tabii php ile ciddi anlamda gelistirme yaptığımız için bazı garipliklerle karşılaştığımız oluyor.
Bu garipliklerden biri yüzünden, Bugunbugece üzerinde çalışırken bir kaç aydır php hatalarını alamıyorduk. Bu da hata yakalama konusunda çok büyük zaman kaybı yaşatıyordu bize. İşin garibi, hataları bazen alıyor bazen alamıyorduk.
Aylardır süren bu duruma yeter artık diyerek dün ve bugün çok ciddi biçimde hata takibine giriştim. Açıkçası, sistem yöneticisi olmamın verdiği deneyim ile öncelikle geliştirme sunucumun ayarlarını tekrar tekrar kontrol ettim.
display_errors on, error_reporting E_ALL, log_errors on, log_file atanmış olduğu halde, ne hatalar ekrana ne de loga gidiyordu. Bu noktadan sonra sorunun sunucu ayarlarında olmadığından emin olmak için php_info() ile php.ini’nin doğru yerden alındığını doğruladım. Hala bir sorun bulunmuyordu. .htaccess veya apache conf içinden de php ayarlarında bir değişiklik yapılmadığından emin olduktan sonra bu isin uygulamadan kaynaklandığına ikna oldum.
Sorunu uygulamada aramaya başlayınca ilk olarak kullandığımız alt yapı olan symfony uygulama ayarlarını kontrol etim. Ne elle yaptığımız bir error_reporting ayarı ne de Symfony’nin kaynak kodunda bir hatalı ayar bulamadım. Ne grep faydalı oldu ne de gözlerim.
Buraya kadar gelince artık hatayı tekrar edip nerede problemin olustuğunu bulmam gerektiğinde karar kıldım. Son yaptığım hatayı aynen yerine koydum. Evet beyaz sayfayı almayı başardım. Ama neden hiç bir hata çıkmıyordu? Hatanın olustuğu satırdan hemen önce ini_get_all ile tüm ayarları aldım.
display_errors, global ve yerel ayarları doğru.
error_logging, global ve yerel ayarları doğru.
error_reporting global ayarı doğru ama yerel ayarı 0!!!! Ama nasıl olur? Ben uygulama ve symfony de hiç error_reporting kodu bulamadım??? Biraz geriye doğru error_reporting değeri takip etmeye başladım. viewler ve layout içinde değer doğruydu.
Kısa süre içinde ilk ipucunu bulmayı başardım. İpucu 1, daha önce farketmediğimiz bir ayrıntı, hatayı view veya layout içinde yaparsak görebiliyoruz. Peki action içinde yaparsak? Evet görüyoruz. Model katmanında yaparsak? Bazen görüyor, bazen görmüyoruz??? En sevdiğim türden hata.
Ardından ipucu 2 geldi, hata model katmanında veya modelleri init ettiğimiz bir noktada.
Burada uygulamızın kendine has bir özelliğinden bahsetmem doğru olacaktır. Uygulamamızda, actionlar içinde kendine has modelleri olan ve partial olarak isimlendirdiğimiz view öğeleri kullanıyoruz. Bu öğelerin nerede ne zaman kullanılacagını da db içerisinde saklıyoruz. Yani bu modelleri dbye bakıp init eden ve actionların başında olan bir kod parçamız var. İşte sorun da bu kod parçasında init edilen modellerde ortaya çıkıyor. Ancak kod içinde error_reporting ayarı yapılmadığına göre bu değer model içinde nasıl bozulabilir?! İşte burada bizim pek kulanmadığımız hatta hiç sevmediğimiz bir php özelliği kullanılmış. Eski bir geliştiricimiz, bu modellerin init edildiği satırın başına bir ‘@’ karakteri koymus!
Hemen svn blame yapalım, 11. ayın başında. Bu @ karakteri kullanıldığı satırda error_reporting değerini 0 lıyor. Tabii bu satır içinde bir model init edildiği için, modelin yerel hata raporlama değeri 0 olarak kalıyor.
İşte bir @ karakteri 5 geliştiricinin 4 ay boyunca hata takibi yapamamasina neden oldu..
Bir @ diyip geçmeyin..