Etiketlenmiş Kayıtlar ·

php

·...

Bir karakterin ettikleri

1 yorum

‘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..

Şehir Şehir Apache Log

2 yorum

Hiç sitenize gelen ziyaretçilerin illere göre dağılımını merak ettiniz mi? Eğer dışarıdan bir firmadan istatistik bilgisi almıyorsanız bu tür bilgileri bulmak çok zor olabiliyor.

‘de yaptığımız ve barındırdığımız “Öldür Beni” filminin sitesi için böyle bir istatistik edinmem gerekince MaxMind‘ın ip veritabanlarını kullanarak çok basit bir istatistik yapabilirim diye düşündüm. Bunun için GeoLiteCity ikili dağıtımı, spyc, php ve pear:Net_GeoIP yi kulladım ve cityStatLite ismini verdiğim programcığı hazırladım.

Şu an için apache loglarını ve sıkıştırılmış halerini inceleyerek, Hangi şehirden kaç istek ve hit gelmiş listesini çıkartıyor. Ayrıca birden fazla logu analiz edebiliyor. Sonuçları city.db.yaml.dump isimli dosyada YAML formatında sunuyor.

Unutmadan ekleyeyim Hitleri hesaplarken aynı ip den gelen istekleri log başına bir hit olarak değerlenriyor. Yani 2.bir log ile aynı ip gelirse 2.bir hit olarak değerlendiriliyor.

SSS:
Neden perl/ruby/haskell/python/ [istediğiniz bir programlama dilini ekleyebilirsiniz] dili ile yazmadın?
PHP yi seviyorum. Ve büyük ihtimalle bahsettiğiniz dili bilmiyorum veya bilmek istemiyorum.

Bu işi zaten XYZ programı yapmıyor mu?
Bilmem. Bilseydim belki bunu yazmazdım. Ya da yazardım. Bilmiyorum. Yeni bişeyler öğrenip denemeyi seviyorum. Sylar gibi kimseyi de öldürmem gerekmiyor..

Switch to our mobile site