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

 

JQuery İle Sanal Klavye

Ödeme sistemlerinde genellikle kullanılan sanal klavyeleri görmüşsünüzdür. Merakımızın sonucu olarak aşağıdaki gibir bir yapı oluştu. Merak edenler için ödeme sistemlerinde kullanılan sanal klavyenin yapım aşamaları aşağıdadır. Sanal klavyenin çözümünü, tasarımını ve sanal klavye üzerinde tuş basım yani keypress olayının tetiklenmesi aşağıdaki gibidir. Bu arada farklı yöntemlerde mevcuttur.

Şimdi olayın yapım aşamasında aşağıdaki gibi bir yapı kullandık.

Okumaya devam et “JQuery İle Sanal Klavye”

Linux Bash Script’de JSON formatıyla Web Servise CURL etmek

Linux üzerinde işlem yaptırıp web servise de bunu iletmek istiyorsanız aşağıdaki bash script kod parçacıkları işinize yarayabilir. Bizim projemizde backup / yedekleme sonrası servislerin ve backupların durumlarını kontrol edebilmek amaçlı olarak bir noktadan kontrol ve analiz edilebilmesi için kullanılmıştır. Yani olay sıralaması şu şekilde;

Sistem tarafında backuplar alınıyor. Sonrasında ise backupın alınıp alınmadı bilgisi ise web servise CURL ediliyor. JSON formatında hazırlanan bilgi web servis tarafında ise JSON olarak karşılanmaktadır.

Backup alma işlemleri ile ilgili örnekleri daha öncesinde paylaşmıştım, şu linkten bulabilirsiniz. Şimdi ise bu backupların durumlarını analiz edebilmek için aşağıdaki kod parçasını kullanacağız.

post_data()
{
	# linux un hostname ini almak için.
	hostname=$(hostname)
	# linux un saat ve tarihi almak
	date_time=$(date "+%Y-%m-%d %H:%M:%S")
	cat <<EOF
{
	"parametre1" 		: "deger1",
	"parametre2" 		: "deger2",
	"hostname" 		: "$hostname",
	"date_time" 		: "$date_time"
}
EOF
}


curl -i \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
-X POST --data "$(post_data)" "http://webservisadresiniz"

Dinamik olarak sunucuya ait bilgileri almak için 2 adet örnek değişken örneği verdim. Siz ihtiyacınız olan parametreleri toplayın JSON formatındaki diziye yerleştirip otomatik olarak gönderimini sağlayabilirsiniz. Backup sistemlerinde şu bilgiler ihtiyaç oluyor genellikle; Disk kullanımı, dosya adı, dosya boyutu, backup başlangıç-bitiş zamanları, ftp upload olmuş mu vb. Bu bilgiler sayesinde PHP tarafında aldığınız bilgileri veritabanına veya farklı bir yere yazarak geçmişe dönük olarak ve sunucularınızın son hallerinin disk vb. durumlarını toplayabilirsiniz. Raporlar çıkartıp olası durumları öncesinden düzeltebilirsiniz. Genellikle disk dolma durumu ile karşı karşıya kalınmaktadır.

webservisadresiniz üzerinde ise aşağıdaki işlemi yaparak post edilen bilgileri alabilirsiniz. Daha öncesinde ise şuradaki yazımda anlamıştım..


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

$post = input_post_json();

Web servis tarafımızda gelen bilgileri bir şekilde veritabanı veya başka bir yerde sakladık. İlla da saklamanız gerekmemektedir. Mail olarak da haber veren bir uygulama yapabilirsiniz. Gerisi sizin ihtiyaçlarınıza ve hayal dünyanıza kalmıştır. Birden fazla sunucunuz var ise tüm backuplar alındıktan sonra kendinize rapor ve analiz maili atabilirsiniz. Hayat kurtarır benden size söylemesi 🙂

Bu tarz uygulamalar sistem tarafındaki manuel olarak her bir sunucuya tek tek girip yedek almak, bakım yapmak, disk kontrolü vb. işlemleri sağlamadaki harcamış olduğunuz zamanı yarıdan daha aza indirgemektedir.

Asıl amacım linux üzerinde JSON formatını web servise CURL olarak göndermeyi anlatmaktı ama olay biraz amatörce backup monitoring’e kaçtı sanırım. 🙂

PHP Ufak Tefek Fonksiyonlar – 2

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

Bootstrap gibi HTML / CSS frameworkleri kullanıyorsanız veya kullanmıyorsanız da uyarı ( alert ) sistemlerini kullanıyorsunuzdur.  Bootstrap üzerinden örnek vermek gerekirse ALERT için ufak bir fonksiyon ile hızlıca uyarı sistemlerinizi geliştirebilirsiniz. Ek olarak bütün uyarılarınız tek bir fonksiyon üzerinden çıkacağı için durumu yani status değeri “danger” olanları başka bir yerde loglamak gibi basit bir örnek verebilirim.

function alert( $message, $status = '', $close = false, $back_link = false )
{
	$x = ( $close ) ? '<button type="button" class="close" data-dismiss="alert">×</button>' : null ;
	$y = ( $back_link ) ? '<a href="javascript:history.back()" class="btn btn-'.$status.'"><i class="fa fa-back"></i>Geri Dön</a>' : null ;
	$html = '<div class="alert alert-'.$status.'">
			'.$x.' '. $message .' '.$y.'
		</div>';
	return $html;		
}
    • $message değişkeni
      • Gösterilecek olan mesaj
    • $status değişkeni
      • Bootstrap kullanıyorsanız .alert .alert-info gibi değerleri sadece info, danger, warning, success gibi değerler alır
    • $close değişkeni
      • Alert nesnesine kapatma butonu ekler
    • $back_link değişkeni
      • Alert nesnesine Geri Dön butonu ekler

 

Rastgele şifre oluşturma fonksiyonu;

function random_password( $length = 7 )
{
	$chars = 'qwertyuiopasdfghjklzxcvbnm0123456789';
	$new = '';
	for( $i = 0; $i < $length; $i++ )
		$new .= $chars[ rand( 0, strlen( $chars ) ) ];
	return $new;
}

$length değişkeni sayesinde istenilen uzunlukta rastgele şifreler oluşturabilirsiniz. Bu tarz fonksiyonlar daha çok şifre hatırlat, sms ile onay kodu gibi sistemlerde hızlıca bir şifre üretmek amaçlı kullanılabilir.

 

PHP Ufak Tefek Fonksiyonlar – 1

Hangi yazılım diliyle yazılım geliştirirseniz geliştirin mutlaka kıyıda köşede birikmiş ufak tefek fonksiyonlarınız vardır. Bunları da alıp hemen hemen her projenizin kıyısına köşesine yerleştirip projenizi yönlendirmeye devam edersiniz. Bu işlem hızlıdır, güvenilirdir ve en önemlisi sadıktır. Çünkü yazılan koddan eminsinizdir. Kim bilir kaç yerde kullandınız da arkanıza dönüp bakmadınız. 🙂

Bende bu şekilde kullanmış olduğum fonksiyonlardan örnekler paylaşacağım. PHP ile geliştirmekte olduğumuz sistemlerimizden dolayı örnekler PHP üzerinden olacaktır. Diğer dillerden de örnekler vermeye çalışacağım zamanla.

String bir değişken içerisinde arama;

	function in_string( $string, $val )
	{
		if ( !( strrpos( $string, $val ) === false ) )
			return true;
		return false;
	}

Yukarıdaki fonksiyon strrpos aklıma gelmediği için yazılmıştır. Başka bir amacı yok diyebilirim 🙂 Okumaya devam et “PHP Ufak Tefek Fonksiyonlar – 1”

PHP SSH2 Kütüphanesi

PHP ile linux server tarafında başka bir linux server a bağlanıp işlem yapmanız gerekiyor ise SSH2 eklentisi tam olarak size göre. Birçok servisimizde ve projemizde kullanmış olduğumuz SSH2 eklentisine ufak bir kütüphane yazdım.

SSH2 kütüphanesini kullanabilmek için kullanmış olduğunuz Linux dağıtımına göre kütüphaneyi kurmanız gerekiyor. Centos 7 için kullanmış olduğum kaynak : https://www.adveyer.com/blog/centos-7-ssh2-php-extension-kurulumu/ Okumaya devam et “PHP SSH2 Kütüphanesi”

Kaç Satır Kod Yazdığınızı Merak Ediyorsanız ?

Projelerinizde kaç satır kod yazdığınızı merak ediyorsanız ki ben etmiştim onun aşağıdaki ufak projeyi yazdım ( Kopyala + Yapıştır > Sonuç : ). Google üzerindeki araştırmalar sonucu bir klasör içerisindeki dosyaların Boyutlarını, Satır sayılarını, Karakter ve Kelime sayılarını basit bir şekilde ekrana döktüm.

 

Siz isterseniz birden fazla klasör seçimi de yapabilirsiniz. Proje örnek kodları ve projenin kaynak kodları aşağıda yer almaktadır. Proje C#.NET tabanlıdır. Neden diye sormayın en hızlı bununla çıkartabildim 🙂 Daha farklı yöntemler olabilir. Linç etmeyin 🙂

Form üzerinden seçilen klasörün içerisindeki dosyaları tek tek okuyup dosya yolu ile  birlikte datagrid nesnesine ekliyor.

            if (!Directory.Exists(@"" + textBox1.Text))
                return;
            dataGridView1.Rows.Clear();

            DirectoryInfo di = new DirectoryInfo(@""+textBox1.Text);
            FileInfo[] directories = null;
            try
            {
                // tüm klasörler içerisindeki hangi dosyaların hesaplanacağı -- hepsi seçildi.
                directories = di.GetFiles("*", SearchOption.AllDirectories); 
            }
            catch
            {

            }
            Int64 total = 0;
            foreach (var item in directories)
            {
                string FilePath = @"" + item.DirectoryName + "\\" + item.Name;
                var lineCount = File.ReadLines(FilePath).Count(); // satır sayısı
                Int64 WordsCount = 0; // kelime sayısı
                Int64 CharCount = 0; // karakter sayısı
                
                // dosyayı parçalara ayırıp kaç satır ve karakter olduğunu hesaplayacağız.
                string FileText = new System.IO.StreamReader(FilePath).ReadToEnd().Replace("\r\n", "\r");
                CharCount = FileText.Length;
                WordsCount = FileText.Split(' ').Length;
                // datagrid üzerine topladığımız bilgileri aktarıyoruz. BoyutHesapla fonksiyonu ile dosya boyutu hesaplanıyor ( b, kb, mb, gb vs )
                dataGridView1.Rows.Add(item.Name, item.DirectoryName.ToString().Replace(textBox1.Text, ""), BoyutHesapla( item.Length ), item.Length, lineCount, CharCount, WordsCount);
                total += item.Length;
            }
            label2.Text = ( dataGridView1.Rows.Count - 1 ).ToString();
            label4.Text = BoyutHesapla( total)+" ( "+total+" ) "; // toplam boyutu hesaplaıyoruz..

Yukarıdaki kodda yer alan BoyutHesapla fonksiyonu ise gelen boyutları byte, kilobyte, megabyte vb. cinsinden çevrilmesini sağllıyor.

        public static string BoyutHesapla(long gelenboyut)
        {
            if (gelenboyut >= 1073741824)
                return (gelenboyut / 1073741824) + " GB ";
            if (gelenboyut >= 1048576)
                return (gelenboyut / 1048576) + " MB ";
            if (gelenboyut >= 1024)
                return (gelenboyut / 1024) + " KB ";
            return gelenboyut + " B ";
        }

Proje Dosyalarını Buradan İndirebilirsiniz..

Centos Linux MYSQL ve Web Dosyaları Yedekleme

VPS ( Virtual Private Server | Özel Sanal Sunucu ) kullanıyorsanız üzerinde de Cpanel, WHM, Vesta, Plesk vb. bir yönetim paneli bulunmuyor ise yedekleme işlemleri biraz zor olabilir. Yedekleme yapabilmek için genellikle manuel işlemler mevcut. MYSQL kullandığımızı düşünürsek PHPMyAdmin üzerinden tüm veritabanını indirmek, PHP kullandığımızı da düşünürsek FTP vb. bir bağlantı ile bağlanıp dosyaları maneul olarak yedeklemek uzun bir senaryo.

Peki biz her gece uyurken yedekler otomatik olarak alınsa ? Daha rahat ve güzel olmaz mı ? 🙂 Okumaya devam et “Centos Linux MYSQL ve Web Dosyaları Yedekleme”

MYSQL Ufak İpuçları – vol.3

Üçüncü seri olarak birkaç ip ucu ile devam edelim.
Birinci seri için BURADAN ulaşabilirsiniz.
İkinci seri içi BURADAN ulaşabilirsiniz.

Nasipse 4. seriyi de yayınlarım yakın bir zamanda 🙂

İlk olarak şöyle bir yapalım. Bir tablomuz var ve diğer bir tabloya aktaracağız. Arayüz kullanırken bu işlemler bir kaç tık yaparak sonuca hızlıca ulaşabiliriz fakat ya arayüzümüz yoksa. ! Çözüm tabi ki var. Komut satırından devam. Arayüz ne yapıyor sanıyorsunuz 🙂

Örnek olarak eski kullanıcı tablosundaki belirli bir sorgunun cevabını yeni bir tabloya aktarmamız gerekiyor;
# INSERT INTO YENI_KULLANICI_TABLOSU ( ADI,SOYADI,MESLEK, ESKI_ID,EMAIL, ADRES ) SELECT ADI,SOYADI,MESLEK, ESKI_ID,EMAIL, ADRES FROM ESKI_KULLANICI_TABLOSU WHERE YAS > 23 AND KAYIT_TARIHI > ‘2018-01-01’  ORDER BY ID DESC LIMIT 1000

Where şartımıza göre yukarıdaki sorgumuz ESKI_KULLANICI_TABLOSU‘dan  YENI_KULLANICI_TABLOSU‘na aktarım yapacaktır. Bu işlemi bir yazılım dili ile de yapabiliriz. Fakat şöyle düşünün; Önce yazılımın çalışacağı PLATFORM’a tüm bilgiyi çekeceğiz ve sonra tekrar geriye INSERT edeceğiz. Bu şekilde daha hızlı olmasını sağlayabilirsiniz. Tabi ki bir veritabanından farklı bir veritabanına aktarım yapmak isterseniz bu sorgu biraz yetersiz gelebilir. 🙂 O zaman kolları sıvayıp bir aktarım / transfer mekanizması yazmanız gerekebilir.

Veritabanınızdaki toplam satır sayısını merak ediyorsanız aşağıdaki sorguyu kullanabilirsiniz.
# SELECT SUM( TABLE_ROWS )
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = ‘VERI_TABANI_ADI‘;

Yine bir merak sorusu ile devam edelim. Merak ettiğimiz ise veritabanımızdaki tabloların MB ( megabayt ) cinsinden boyutlarını sorgulayalım.
# SELECT
table_schema as `Database`,
table_name AS `Table`,
round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
FROM information_schema.TABLES
ORDER BY (data_length + index_length) DESC;

Bu sorgular sürekli kullanılan sorgular değildir. Genellikle kriz anlarında yani veritabanı çökmeye yakın anlarında hangi tablo çatlamış, hangi tablo diskte fazla yer kaplıyor, hangi tablo neden bu kadar şişmiş durumlarını kontrol edebilmek içindir. Sorguları genişletip daha farklı sonuçlar alabilirsiniz ve geleceğinizi yakından görüp kriz anlarını öncesinde çözebilirsiniz.

Bir sonraki seride görüşmek üzere. 🙂