PHP Dosyasının Derlenip HTML Çıktısı Alınması

PHP ile geliştirme sırasında PHP dosyasının derlenip HTML halinin geriye RETURN edilmesi gerektiği yerler olur. Bunu Codeigniter gibi framework’ler yapmaktadır. Bilenler anlayacaktır -> $this->load->view( ‘dosya_yolu’, ‘dizi_degiskeni’, true ); yaptığımızda geri bize gönderilmiş parametreler ile birlikte derlenmiş string hali gelir.

Bu işlem çok basit olmakla birlikte genellikle sayfa yapılarında kullanılır. Peki düz bir PHP sayfası hazırlarken elinizde framework olmadığında ne yapacaksınız ? Aşağıdaki kod parçasını kendinize göre düzenleyip kullanmanız yeterli olacaktır.

function load_html( $file_path, $data )
{
extract( $data );
ob_start();
include( $file_path );
$buffer = ob_get_contents();
@ob_end_clean();
return $buffer;
}

 

Bunu yaparken dikkat etmeniz gereken tek şey include etmiş olduğunuz dosyanın yolu ve gönderilen $data değişkeninin extract edilirkenki halinin KEY değerlerinin artık birer değişken olarak kullanılmasıdır. Değişkenleri include etmiş olduğunuz dosyada rahatlıkla kullanabilirsiniz.

Bu işlemde PHP olarak derlenmeyi sağlayan olay ise ob_XX fonksiyonları sağlamaktadır.

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/

Centos 7 Üzerinde Vesta Panel PHP 7 Upgrade Etme

Projelerimizin FTP / HOST hesaplarını daha rahat yönebilmek amacıyla VESTA Panel kullanmaktayız. Vesta gayet hoş, basit, hafif ve çok fazla uğraştırmadan sunucu üzerine kurulum yapıp kullanabilirsiniz.
Vesta Panel kurulumu için — > https://vestacp.com/install/  
İhtiyaçlarınıza göre vesta seçeneklerini seçerek kurulumu Console üzerinden yapabilirsiniz.

Şuanda Vesta kurulumu yapıldığında PHP sürümü 5.6 olarak gelmekte. Bu sürümün desteği bittiği için ve birçok hazır framework sitelerde hata göstermektedir ( WordPress, opencart vs. ) . Yakında bunu düzeltirler sanırım. PHP 7 versiyonu daha sağlıklı, hızlı ve stabil çalışmasından dolayı genel sistemlerimizi de güncellemekteyiz.

Güncelleme işlemi yaparken aşağıdaki adımları sırayla uygulayabilirsiniz.

  • wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  • wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
  • rpm -Uvh remi-release-7.rpm epel-release-latest-7.noarch.rpm
  • yum install yum-utils
  • yum-config-manager –enable remi-php72
  • yum-config-manager –disable remi-php56
  • yum-config-manager –disable remi-php70
  • yum-config-manager –disable remi-php71
  • yum update -y
  • php -v

Yukarıdaki işlemleri CLI / Console üzerinden yapmanız gerekir.
Hatasız update ler dilerim. 🙂

Kaynak

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