Olan Biten

Bir yıl önceki son yazımdan sonra Doitr  yazısı ile geri döndüm. O zaman biraz da neler olup bittiğinden bahsedeyim. Son iş yerimde üçüncü yılımı doldurmak üzereyim, kendi adıma rekor oldu bu ve o tarafta işler tüm yoğunluğu ile devam ediyor. Farklı bir durum yok açıkcası.

İşin eğlenceli kısmına gelirsek geçen sürede bir kaç başarısız (kime göre, neye göre :)) mobil oyun macerasından sonra Doitr ile ilgilenmeye başladım. Bu arada da mobil uygulama için platformlar denemeye devam ediyorum. Native, Intel XDK, Phonegap. Hepsi çok değerli bilgiler, dersler kattı bu anlamda çok da başarısız değil anlayacağınız oyun denemelerim.

Daha sonra yeniden sosyal bir projeye geri döndüm. Her ne kadar sosyal projelere ciddi bir sermayem olmadan girmeyi düşünmesem de, arada tekrar denemekten kendimi alamıyorum. Şu an Doitr‘dan başka, fikir-prototip aşamasında olan bir mobil uygulama daha bulunmakta ama dediğim gibi vakit almıyor. Sadece bazı temeller ve tartışmalar üzerinde şu an.

Son olarak da güvendiğim ve denemek istediğim hizmet tabanlı bir proje var. Tabi o daha büyük kararlar ve fedakarlıklar gerektiriyor. Şimdilik o yüzden demlenme aşamasında. Bir gelişme olursa tekrar yazarım zaten.

Bu arada Laravel Framework ile liseli aşıklar gibiyiz. Sürekli birlikteyiz, gözümüz başkasını görmüyor.

Şimdilik profesyonel işimden kalan neredeyse tüm zamanım Doitr’a gidiyor. Durumlar böyle, umarım tekrar yazmam bu kadar uzun sürmez 🙂

Not: Resim ne alaka diyebilirsiniz. Hem bloga ferahlık, renk gelsin istedim biraz. Hem de bu aralar doğaya, yeşilliğe hasret kaldım, ona bir atıf.

PHP Long Polling Örneği

Web ve mobil uygulamaların son zamanlardaki olmazsa olmazlarından birisi de bize olayları bildirimler ile iletmesi. Uygulamalar gelen mesajları, beğenileri vs. sayfanın bir yerinde bizim başka bir sayfaya gitmemize gerek kalmadan bize iletiyorlar. Ben de üzerinde çalıştığım bir uygulama+web sayfasında bildirimleri gösterme ihtiyacı hissettim. İlk etapta bunu web socketler ile yapmaya karar verdim. İlk denemem de gayet güzel bir şekilde çalıştı ama bir de mobil uygulama üzerinde denemeye karar verdiğimde hayal kırıklığına uğradım çünkü android WebView’de web socketler desteklenmiyordu. Bu nedenle daha az verimli, daha sorunlu ama yapması gereken işi platform ayırt etmeden yapan eski yöntem long polling ile yapmaya karar verdim. Belki ihtiyacı olanlar olabilir düşüncesiyle burada bir küçük örneğini paylaşmaya karar verdim, temel mantığı göstermekte faydalı olacaktır.  Öncelikle değişiklik olup olmadığını takip eden php dosyamızı yazalım.

polling.php

<?php
$gonderenId=$_POST["gonderenId"];
$pollMu=$_POST["poll"];
if (file_exists($gonderenId.'.txt') == false)
{
    file_put_contents($gonderenId.'.txt', time());
}

if (isset($pollMu))
{
    set_time_limit(150); // Zaman limitini beliliyoruz

    date_default_timezone_set('Europe/Istanbul');
    $time = time();
    $poll = true;
    while ($poll)
    {
        clearstatcache();
        $mtime = filemtime($gonderenId.'.txt');
        if ($mtime > $time) // Eğer dosyanın eklenme/güncellenme zamanı alınan zamandan büyük mü 
        {
            $poll = false;
            //burada veritabanından ilgili değerler çekilecek.
        }
        sleep(1); // Kaynakları tüketmemek için bir süre bekliyoruz
    }

    $arr = array ('mesaj'=>1,'begeni'=>2,'hediye'=>3); // Bunlar veritabanından alınan sonuçlar olacak
    echo json_encode($arr);
    exit;
}
?>

Bu dosyada öncelikle değişiklikleri takip edilecek kullanıcının idsini alıp, eğer bu idli bir dosya yoksa bir text dosyası oluşturuyoruz.  Daha sonra bir while loop’u içerisinde oluşturulan dosyanın tarihi, while’dan önce alınan tarihten büyük mü diye bakıyoruz. Eğer büyükse dosya güncellenmiştir, dosya güncellemesini ilgili kişiye yapılan işlemlerden önce yapıyoruz. Bir sonraki ekleyeceğimiz dosyada yapılan iş. Eğer bu koşulu sağlıyorsa, while döngüsünden çıkmak için değişkenimize false atıyoruz ve sonrasında veritabanından ilgili sorguları çekiyoruz. Ve bunlarsı json olarak dönüyoruz.

islem.php

<?php

$aliciId=$_POST["aliciId"];
$time = time();
file_put_contents($aliciId.'.txt', $time); // İlgili kullanıcının dosyasına o anı yazıyoruz ki server.php değişikliği yakalayabilsin.
//Burada veritabanında yapacağımız asıl işleri yapıyoruz.

?>

Kodumuzun bu kısmı ise kişileri mesaj attığımızda, beğeni gönderdiğimizde vs çalışacak olan veritabanı kodlarının bulunduğu kısım. Burada veritabanı işlemlerinden hemen önce alıcının idsi ile bulunan dosyaya tarih bilgisini atıyoruz ki dosyanın tarihi güncellensin ve az önce yazdığımız while döngüsündeki koşulu sağlasın.

Son olarak da client sayfamızı yazalım.

client.html

<html>
	<head>
		<title>
			Deneme
		</title>
		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1254">
	<script src="jquery-2.0.3.min.js"></script>
	<script>
		$(document).ready(function() {

			startPolling();

		$("#gonder").click(function(){
			$.ajax({
				type: "POST",
				url: 'islem.php',
				data: {
					aliciId: '123456789' // Diğer kullanıcının bilgisi
				},
				success: function(data) {
					alert("gönderildi.");
				}
			});				
		});	

		});

		function startPolling()
		{
			$.ajax({
				type: "POST",
				url: 'polling.php',
				data: {
					poll: 'evet',
					gonderenId: '123456789' // Login olan kullanıcının bilgisi
				},
				success: function(data) {
					displayNotifications(data);
					startPolling();
				}
			});		
		}

		function displayNotifications(data)
		{
			var obj;
			try {
				obj = jQuery.parseJSON(data);
				if(obj.mesaj > 0)
					$("#mesaj").html("Mesaj="+obj.mesaj);
				if(obj.hediye > 0)
					$("#hediye").html("Hediye="+obj.hediye);
				if(obj.begeni > 0)
					$("#begeni").html("Begeni="+obj.begeni);
			} 
			catch(err)
			{
				return true;
			}

		}
	</script>
	</head>
	<body>
	<div id="mesaj"></div>
	<div id="hediye"></div>
	<div id="begeni"></div>
	<br />
	<input type ="button" id="gonder" value="Etkileşim Gönder" />
	</body>
</html>

Burada öncelikle sayfamız ilk yüklediğinde ajax ile startPolling fonksiyonumuzu çağırıyoruz. gonderenId değişkeni login olan kullanıcıyı, aliciId de mesaj attığımız vs. kullanıcıyı gösterecek. Burada aynı olma sebebi test edebilme amaçlı. Eğer long polling başarı ile tamamlanırsa, yani bir bildirim gelmişse bildirim divlerimizi güncelliyoruz. Sonrasında tekrar startPolling fonksiyonumuzu çağırıyoruz ki dinlemeye devam edebilelim. İşte hepsi bu kadar. İlgili dosyaları lokalinizde oluşturup, kendiniz de deneyebilirsiniz. Jquery dosyasını da aynı dizine koymayı unutmayın.

Bugünlük bu kadar, Çevik Kalın 🙂

socket_create() hatası (PHP Socket)

Php ile bir uygulama geliştiriyorsunuz ve socketleri kullanmaya karar verdiniz. Bütün her şey hazır Command prompttan server uygulamanızı çalıştırıyorsunuz… derken çalıştıramıyorsunuz. Karşınızda bir hata

Fatal error: Call to undefined function socket_create()

Nasıl yani diyorsunuz. Halbuki php.ini dosyasında php_sockets’i enable etmiştiniz. Emin olamıyorsunuz tekrar kontrol ediyorsunuz ama evet işte orada enabled durumda. Durun, sizde herhangi bir sıkıntı yok. Sıkıntının tek sebebi  Command Prompt’un Apache server’dan farklı bir php.ini dosyasına bakması. Apache server Apache/bin/ altındaki php.ini dosyasına bakarken, Command Prompt php\ altındaki php.ini dosyasına bakar. Bu dosya içinde php_sockets extension’ına izin verirseniz hatasız bir şekilde istediğiniz işlemi yapabileceksiniz.