PHP Ufak Tefek Fonksiyonlar – 4

PHP üzerinde ufak tefek fonksiyonlarımdan paylaşmaya devam ediyorum. Bir önceki yazıya buradan ve  buradan tüm ufak tefeklere ulaşabilirsiniz.

Basit ve zaman kazandıran fonksiyonlara yeni bir yazı ile merhaba.

Birkaç yerde tarih işkemi için date( “Y-m-d H:i:s” ) yazıp duruyorum/uz. Kısaltmak lazım. Ne de olsa 3 5 saniye çok önemli. 🙂 datee adında bir fonksiyon ile birkaç karakter fazla yazmaktan kurtuldum diyebilirim. 🙂

function datee( )
{
	return date( 'Y-m-d H:i:s' );
}

Okumaya devam et “PHP Ufak Tefek Fonksiyonlar – 4”

CodeIgniter WebServis Veritabanı Hatalarını Yakalamak

Codeigniter ile yürüttüğümüz birkaç web servisimiz mevcut. Bu servislerimiz arka planda olduğu için genellikle veritabanı sorguları ve çalışan sorgulardaki hataları yakalayamıyoruz. Bunun için system/database/DB_driver.php dosyasında birazcık oynayacağız.

display_error fonksiyonunda hataları gösteren yere farklı bir domain/sub domain altındaki servisimize gönderiyoruz. Bu servis üzerinde ise gelen bilgileri alıp Mail olarak yazılım ekibimize gönderiyoruz. Böylece bir hata olduğunda yakalama şansımız yüksek oluyor.

Mail göndermek yerine farklı senaryolarda yapılabilir. Örneğin telegramdan kendinize bildirim gönderebilirsiniz. Başka bir veritabanına hataları yazabilirsiniz. SMS hadi attırabilirsiniz. Monitoring yazılımınız ile entegre edebilirsiniz. Bildirim servisini aktif etmek tamamıyla sizin ihtiyaçlarınıza kalmış bir durum.

Okumaya devam et “CodeIgniter WebServis Veritabanı Hatalarını Yakalamak”

PHP CodeIgniter İle İmage Cache Yapımı

Hemen hemen herkesin ihtiyacıdır diye düşünüyorum. İmage Cache. Genellikle bir tane PROXY URL oluşturup dosyaya ait cache hali varsa onu çekeriz yoksa cache’leyip cache halini çekeriz. Fakat bu durum sistemde dosyalarınızın gelmesini yavaşlatabilir.

Hali hazırsa orjinal dosyalarınızın bulunduğu bir klasör altında image dosyalarınız var ise aşağıdaki paylaşmış olduğum örnekteki gibi bir yöntem ile dosyaların boyutlandırılmasını orantılı bir şekilde yapabilirsiniz.

Bir önceki yazımda “get_dir_contents” fonksiyonunu paylaşmıştım. Bir dizin altındaki tüm dosyaları getirmek için kullanıyoruz.

$list = get_dir_contents( '/var/www/html/cron/orj_images' );

// hangi boyutlarda oluşturacağımızı belirtiyoruz.
$arr[] = array( 32, 32 );
$arr[] = array( 50, 50 );
$arr[] = array( 64, 64 );
$arr[] = array( 70, 70 );
$arr[] = array( 80, 80 );
$arr[] = array( 90, 90 );
$arr[] = array( 100, 100 );
$arr[] = array( 120, 120 );
$arr[] = array( 150, 150 );
$arr[] = array( 160, 200 );
$arr[] = array( 200, 200 );
$arr[] = array( 300, 300 );
$arr[] = array( 200, 256 );
$arr[] = array( 256, 256 );
$arr[] = array( 500, 500 );
$arr[] = array( 512, 512 );
$arr[] = array( 640, 640 );
$arr[] = array( 1024, 1024 );
$i = 0;
// listemizde döngüye girip image_lib kütüphanesi ile işlemleri başlatıyoruz.
foreach( $list as $key => $value )
{
	if( !file_exists( $value ) )
		continue;
	if( is_dir( $value ) )
		continue;
	
	$this->load->library( 'image_lib' );
	// her bir dosya için boyutlandırma dizisine göre ayrı ayrı işlem yaptırıyoruz.
	foreach ( $arr as $k => $v )
	{
		$ext = pathinfo( $value );

		$new_file = $ext[ 'dirname' ].'/'.$ext[ 'filename' ].'-'.$v[ 0 ].'x'.$v[ 1 ].'.'.$ext[ 'extension' ];				
		$old_file = str_replace( '/var/www/html/cron/orj_images', '/var/www/html/cron/chache_images', $new_file );			
		
		if( file_exists( $old_file ) )
			continue;
		// kaynak dosyamnız $value değişkenindedir.
		$config = array(
			'image_library' => 'gd2',
			'source_image' => $value,
			'new_image' => $old_file,
			'maintain_ratio' => TRUE,
			'create_thumb' => TRUE,
			'thumb_marker' => '',
			'width' => $v[ 0 ],
			'height' => $v[ 1 ]
		);

		$this->image_lib->initialize( $config );
		$this->image_lib->resize();
		$this->image_lib->clear();
		echo $old_file."\n";
	}
}

Yeni dosya ekleme işlemlerinde upload sırasında bu boyutlar otomatik olarak cachleniyor. Sistemde orjinal dosya direkt olarak kullanılmıyor.

Bu kod parçasını CRON üzerinden bağladığımız için dosyaları mümkün olduğunda güncel kalmasını sağlıyoruz.

Not : “Yapı Codeigniter framework’ü üzerinden örneklendirilmiştir. Sisteminize uygulamadan önce test etmenizi tavsiye ederim.”

 

PHP İle Dizindeki Tüm Dosya ve Klasörleri Listeleme

PHP ile bir projemizdeki tüm dosya ve klasörlerin listesi gerektiği için kullanmış olduğum fonksiyon aşağıdaki gibidir. Kendinize göre düzenleyip kullanabilirsiniz.

	function get_dir_contents($dir, &$results = array())
	{
		$files = scandir($dir);

		foreach($files as $key => $value){
			$path = realpath($dir.DIRECTORY_SEPARATOR.$value);
			if(!is_dir($path)) {
				$results[] = $path;
			} else if($value != "." && $value != "..") {
				get_dir_contents($path, $results);
				$results[] = $path;
			}
		}

		return $results;
	}

PHP Codeigniter İle HTML Çıktısı Sıkıştırma

Yenilenen teknolojilerde her zaman istediğimiz birşey vardır.  “HIZ”

Hep daha hızlı olmasını isteriz. Tıkladığımızda açılsın, hatta tıklayacağımızı hissedip öncesinden haberi varmış gibi hızlıca cevap vermesini bekleriz. Kimlerden bekleriz. Tabi ki yazılımlar, programlardan.

Codeigniter kullandığımız bir sistemde sayfa ( browser taraflı tabiki ) açılış, derleme hızını yükseltmek, bekleme süresini düşürebilmek için uğraşırken HTML çıktısının boşluklarının browserlarımızı ne kadar yorduğunu düşündük. Klasik hızlandırma senaryoları bir çoğumuzun bildiği gibi CSS ve Javascript dosyalarının minify ( küçültülmesi ) edilmesinden geçer. Bunlarda bir yere kadar yeterli olacaktır. Biz ekstra olarakda HTML çıktığımızı da azaltmak istedik.

Bu sayede sayfanın toplam boyutu düşüceği için ufakda olsa bir hız kazanmayı hedefledik. Başarılı olduğumuza inanıyorum. Sizlerde farklı yöntemler kullandıysanız paylaşabilirsiniz.

Codeigniter tarafında biz bu işlemi direkt olarak SYSTEM > CORE > LOADER sıfınının view fonksiyonuna uyguladık. Hem ajax requestlerimizde hemde standart HTML outputlarında oldukça başarılı sonuçlar verdi.

Aşağıdaki gibi düzenlemeniz yeterlidir. Replace fonksiyonu yerine daha hızlı bir metodda tercih edilebilir. Özel bir fonksiyon dahi yazılabilir fakat deneme sürecini preg_replace oldukça iyi atlattı.

	public function view($view, $vars = array(), $return = FALSE)
	{
		$buffer = $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));
		$search = array( '/\n/', '/\>[^\S ]+/s', '/[^\S ]+\</s', '/(\s)+/s' ); $replace = array( ' ', '>', '<', '\\1' );
		
		return preg_replace($search, $replace, $buffer);
	}

Genelde sistemlerin ve framework’lerin CORE’larında oynamak tehlikelidir. Bazen risk almak lazım.

Codeigniter frameworküne özel değildir. Fonksiyonu farklı yapılarda da yapınıza göre düzenleyip kullanabilirsiniz.

Hızlandırma tekniklerinden ileride bahsedeceğim. SQL sorgularınızdan tutunda sayfada kullanılan değişken temizleme olaylarından bahsedeğim. Bunu ilk adım olarak sayfabilirsiniz. 🙂

Centos 7 PHP 7.2 ile MSSQL Server Bağlantısı

Projelerimizde genellikle PHP alt yapısı kullanmaktayız. Projenin bir bölümü MSSQL server ile bağlantılı çalıştığı için Linux web server’lar ile bağlantı yapamıyorduk. Bunun için Windows bir sunucu üzerinden IIS üzerine apache kurulumunu gerçekleştirip, MSSQL server’a bağlantı için PHP ye ait bir  “.dll ” kullanıp bağlantı sağlıyorduk. MSSQL tarafındaki işlemler için Windows sunucuyu web servis olarak kullanıyorduk.

Ne mi oluyordu ? Güzel oluyordu. Çalışıyor muydu ? Evet, çalışıyordu. İstediğimiz performans varmıydı ? Hayır, yoktu. Rahat mıydı ? Bize göre değildi.

4-5 sene içerisinde birkez defa PHP ile MSSQL’e bağlantılar denemiştik. Fakat çoğu kütüphane de BUG‘lar mevcuttu. Bu BUG‘lardan en sevdiğim ise Linux üzerinden MSSQL’e bağlandığınızda Sunucuda ne kadar RAM varsa hepsini kimseyi düşünmeden kendininmiş gibi kullanması. 🙂

Bizde zaman kaybetmemek adına Windows üzerinden web servis yazmaya başlayıp projelerimizi geliştirdik. Hemen hemen her yazılımcının, sistemcinin bir gece ansızın aklına düşen fikirleri, düşünceleri vardır. Benimkisi ise PHP ile MSSQL’e bağlanabilmek. Üstüne çok fazla düşmemiştim açıkcası.

Aradan günler geçti ve PHP’nin 7 sürümünde bazı güncellemeler olduğunu araştırırken bir abimiz PHP 7 ile MSSQL’e bağlandığını yazmış. Döküman ? Malesef. Sadece yazmış. 🙂

Şimdi geçelim Linux Centos 7 üzerinde PHP 7 ile MSSQL’e nasıl bağlantı kuracağımıza. ( Vesta Control Panel üzerinde de gayet güzel çalışmaktadır )

İşlemlerimizi PECL ile yapıyoruz. Komutlar;
# curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo
# yum update
# ACCEPT_EULA=Y yum install -y msodbcsql mssql-tools unixODBC-devel
# pecl install sqlsrv
# pecl install pdo_sqlsrv

PHP.INI dosyamıza aşağıdaki satırları ekleyip güncelliyoruz;
extension=sqlsrv
extension=pdo_sqlsrv

Web engine olarak ne kullanıyorsanız ( Nginx, Apache, PHP-FPM ) restart ediniz.

Bu kadar. Sonrasında ise kullanmış olduğunuz herhangi bir framework varsa direkt olarak database_driver değiştirirerek kullanabilirsiniz. Yok ise şuaradaki doküman işinize yarayabilir..

Karşılaşabileceğiniz hatalar;
# ACCEPT_EULA=Y yum install -y msodbcsql mssql-tools unixODBC-devel
bu satırda hata alırsanız Şuradaki doküman‘a göre Centos üzerinde aşağıdaki işlemleri sırasıyla gerçekleştiriyoruz ( Centos 7 – Redhat ).

sudo su
curl https://packages.microsoft.com/config/rhel/7/prod.repo &amp;amp;amp;amp;amp;amp;amp;gt; /etc/yum.repos.d/mssql-release.repo
exit
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel
sudo ACCEPT_EULA=Y yum install msodbcsql17
sudo ACCEPT_EULA=Y yum install mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' &amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;gt; ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' &amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;gt; ~/.bashrc
source ~/.bashrc
sudo yum install unixODBC-devel

PECL ile ilgili bir hata alırsanız ;
Şuradaki doküman’a göre aşağıdaki işlemleri yapınız.

yum install php-devel
yum provides pecl
yum install php70w-pear
pecl install stats

Kendi tecrübeme göre PHP’nin 7.2 versiyonu daha stabil ve hızlı çalışmakta. 7.2 versiyonu ile birlikte MSSQL’e bağlantılarımız gerçekleşiyor. Hatta Codeigniter framework’ü kullandığımız için Windows üzerindeki projeyi olduğu gibi Linux Centos üzerine aktardığımızda herhangi bir hata vs. almadan ( PHP tarafından ) kullanmaya devam ettik. Fakat sizin projelerinizde farklı veya özel kütüphaneler mevcut ise bunun garantisini veremem. Lütfen aktarım yapmadan önce TEST ortamında kontrol ediniz.

Ufak bir bilgilendirme;
Centos 7 versiyonundan farklı bir versiyonda denemedim. Farklı bir dağıtımda denemedim. Farklı kaynaklar ve kurulum dökümanları mevcut. Aynı zamanda kurulum sırasında UPDATE işlemi mevcut. Linux ( diğerlerinde de mevcut fakat bilen bilir 🙂 ) üzerinde her zaman yapmanız gereken birşey vardır; “Enter’a basmadan önce bir daha düşün” ilkesidir ve herşeyden önce mutalaka YEDEK alınız.

Kaynaklar;

  • https://github.com/Microsoft/msphpsql/issues/726
  • http://fafairuzcode.blogspot.com/2016/08/installing-pecl-on-centos-7.html
  • https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15
  • http://www.shukko.com/x3/2018/12/12/php-ile-mssql-sunucuya-baglanalim/

Windows Server PHP Session Temizleme

Windows sunucu da IIS üzerinde PHP ile web servislerimiz mevcut. PHP ile MSSQL server bağlantıları olduğu için Windows üzerinde PHP koşturuyoruz. Belirli bir zaman sonra sunucunun diski dolması, PHP’nin ağır bir şekilde cevap vermesi gibi problemleri yaşamaya başladıktan sonra araştırmalarımızın verdiği sonuç PHP nin SESSION dosyalarının baya gelişi güzel birikmiş olması. Problem ise session dosyalarının silinmemesinden kaynaklı. Silinmemesinin sebebi ise windowsun kullanıcı – dosya yetkilendirmelerinde problem olmasıymış.

Bu problemi az buçuk araştırma sonucu çözmek yerine aşağıdaki .bat dosyasına yazdığımız kodlarla hızlı bir şekilde çözdük. Problemi çözmek yerine dosyaları silmek çok sağlıklı olmayabilir ama en azından sessionların search and find metodunda daha hızlı çalışmasını sağlıyor. 🙂

.bat dosyasının windows bash kodları;

DEL /F /S /Q /A "C:\Windows\Temp\sess_*"
rd /s /q %systemdrive%\$Recycle.bin -y

 

PHP sessionlarının ayarlarından dolayı farklı bir klasör altında saklanıyor ise komuttaki dosya yolunu değiştirmeyi unutmayın.

.bat dosyasını Zamanlanmış Görevlere ekleyerek her gece veya saat başı gibi opsiyonlarla çalıştırılması sonucu yaklaşık 3 senedir herhangi disk, gecikme problemi yaşanmadan çalışmaktadır. 🙂

 

PHP ile Tarihe Tarih Ekleme ve Çıkarma

Çok basit bir şekilde tarihe tarih ekleme veya çıkarma işlemini göstereceğim. Oldukça basit çünkü genellikle uzun uzun satırlarla yapılan işlemler mevcut. Hatta bazı algoritmalarda bugünden başlayıp o tarihe gidip o tarih üzerine işlem yapanlarda mevcut.

Anlatmak istediğim aşağıdaki gibidir


// 2018-05-07 tarihine 90 gün eklemek.
date( 'Y-m-d', strtotime( '2018-05-07 +90 day' ) );

// 2018-05-07 tarihine 3 ay eklemek.
date( 'Y-m-d', strtotime( '2018-05-07 +3 month' ) );

// 2018-05-07 tarihine 5 yıl eklemek.
date( 'Y-m-d', strtotime( '2018-05-07 +5 year' ) );

// 2018-05-07 tarihine 90 gün çıkarmak
date( 'Y-m-d', strtotime( '2018-05-07 -90 day' ) );

// 2018-05-07 tarihine 3 ay çıkarmak
date( 'Y-m-d', strtotime( '2018-05-07 -3 month' ) );

// 2018-05-07 tarihine 5 yıl çıkarmak
date( 'Y-m-d', strtotime( '2018-05-07 -5 year' ) );

Harici fonksiyonlar kullanmadan hızlıca tarih işlemlerinde ekle ve çıkarma yapabilirsiniz. Tabi bu yöntem işinizi görüyor olmalı 🙂
Örneklerimde Yıl-Ay-Gün kullandım. Siz format değiştirip kullanabilirsiniz..

PHP Ufak Tefek Fonksiyonlar -3

PHP üzerinde ufak tefek fonksiyonlarımdan paylaşmaya devam ediyorum. Bir önceki yazıya buradan ve buradan ulaşabilirsiniz.

Web servis olarak JSON formatında karşılamakta olduğunuz bir sayfanız mevcut ise aşağıdaki fonksiyon tam olarak size göre.

Web servis tarafında geliştirme yaptığımızı düşünelim. Web servislerde her zaman klasik yöntemler yani GET, POST olarak bilgiler gelmeyebilir. XML, JSON gibi farklı formatlarda gelen istekleri karşılayıp dizi veya obje nesnesi olarak almamız gerekebilir. Aşağıdaki fonksiyon da dizi olarak geri döndürülmüştür. Ekstra olarak dizi içerisine client tarafın IP adresi de eklenmiştir.

	function input_post_json()
	{
		$data = json_decode(file_get_contents('php://input'), true);
		$data[ 'ip' ] = $_SERVER[ 'REMOTE_ADDR' ];
		return $data;
	}

Daha saf hali diyebiliriz;

	function input_post_json()
	{
		return json_decode(file_get_contents('php://input'), true);
	}

PHP de validasyonlar için çok farklı yöntemler mevcut bazıları ise tekrar tekrar yazmak yerine bu şekilde daha kullanışlı ve hızlıca erişebileceğimiz pozisyonda oluyor.

	function ip_control( $ip )
	{
		if( !$ip )
			return false;
		if (!filter_var($ip, FILTER_VALIDATE_IP) === false)
			return true;
		return false;
	}

Bir çok yerde kullandığım uzun yazıları kısaltmak amaçlı yazdığım bir fonksiyon. Kısaltmaktan kastım sonuna “. . .” üç nokta ile birlikte uzantı ekleyebilmek. Örn : Bir tablonuz var. Hücre içerisinde en fazla 50 karakter yazabiliyorsunuz. Yoksa alt satıra geçiyor veya tablo dağılıyor. Bunun için bu fonksiyona 47 değeri verdiğinizde elinizdeki metinden 0 ile 47 karakter arasını alıp sonuna üç nokta ekliyor.

	function three_point( $text, $par )
	{
		return mb_substr( $text, 0, $par ).( strlen( $text ) > $par ? '...' : null );
	}

 

Bir sonraki ufak tefek fonksiyonlarda görüşmek üzere.

 

JQuery Ajax Error Handling / Hataları Toplamak

Jquery Ajax kullandığımız birçok projenin backend tarafında oluşan hataları AJAX tarafında genellikle yakalamak oldukça zordur. Hele birde dataType’ınız JSON gibi farklı formatlar da ise zorluk dereceniz bir tık daha artacaktır.

Fakat her AJAX işleminde success, error işlemlerini yakalamak oldukça zahmetli bir iş. Ekstra fazladan kodlar, bulunamayan satırlar bunlar hep dert.

Aşağıdaki kod parçacağımız sayesinde sistemimizdeki AJAX işlemlerine ekstra olarak error event vermek yerine tüm sisteminizdeki error eventları tek bir yerde topluyoruz ve isterseniz de tekrar başka bir yöntem veya yine AJAX ile herhangi bir yere LOG olarak yazabilirsiniz.

AJAX Error Handling

$( document ).ajaxError( function( event, jqxhr, settings, thrownError )
{
	console.log( jqxhr.responseText.trim() );
});

 

Ben kısaca özetleyip, kullanımını belirttim. Console.log ile ekranda görünmesini sağladım.  Gerisi sizde. 🙂 Bu hareketi gördükten sonra bir çok hatayı hızlıca çözmeye başladım / başladık.