FİL:PHP ve TEKNOLOJİ

Page 1

Composer Fırat AĞDAŞ

FİL:PHP ve Teknoloji

Yeni Nesil CV'ler Ceyda ANIL

fil.php-tr.com Eylül 2013 Sayı 1

PHP ile MongoDB Kullanımı İbrahim HIZLIOĞLU

(Ücretsizdir)

Sphinx Search ile Hızlı Arama Sistemi Caner GÜMÜŞ

PHP Uzmanları Hakkında İnfografik

Arama Motoru Optimizasyonu Duygu TÜMER

PHP 5.5 ile Gelen Yenilikler Berke Ediz DEMİRALP

PDO - PHP Data Objects Musa AVCI

GIT Versiyon Kontrol Sistemi Okan YEDİBELA


https://play.google.com/store/apps/details?id=com.phptr.dergi&hl=tr Android uygulaması e-dergi sayılarının listesini veren ve e-dergiyi indirmenizi sağlayan bir arayüz sunar.


<?

Başlarken Değerli Arkadaşlar, PHP-TR 2010 yılında kurulan PHP Geliştiricileri topluluğudur. 3 yılı aşkın bir süredir PHP-TR üyesi gönüllü arkadaşlar ve sponsor firmalar ile PHP üzerine çeşitli etkinlikler düzenledik. Başlangıçta arkadaşın arkadaşı şeklinde görüşmeler, kahve içerken yapılan teknik sohbetler vardı. Grou.ps sayfası Facebook grubu derken gün geçtikçe büyüdük. Sorular sorduk, yardımlaştık, fikir tartışmaları yaptık. İş arayan PHP Geliştiricileri ile İş veren firmaların birbirini bulmasında aracı olduk. Geçen süre içinde PHP-TR grubumuz Facebook üzerinde 1.400+ PHP meraklısına ulaştı. Topluluğun sesine kulak verdik gönüllü arkadaşlar ile 25 Mayıs 2013 tarihinde Nişantaşı Üniversitesi'nde Türkiye'de ilk defa kapsamlı bir PHP etkinliğini (PHP Günleri 2013 #1 , phpgunleri.org) 1 tam gün, 2 salon, 10 konuşmacı ile hayata geçirdik. Çok şey öğrendik ve öğrettik. Bildiklerimizi topluluk ile paylaşmaya E-Dergi ile devam etmeyi düşündük ve http://fil.php-tr.com adresinde yayınlanacak olan şu anda ilk sayısını okuduğunuz "FİL , Aylık PHP ve Teknoloji Dergisi"projemizi hayata geçirdik. FİL’de bolca PHP bulacaksınız. Bunun yanında oyun, ik, istatistikler, seo gibi farklı bölümlere de yer vereceğiz.

İlk sayıda emeği olan tüm gönüllülere ve yazarlarımıza teşekkür ediyoruz. FİL'in devamı için de sizlerden destek bekliyoruz. Teşekkürler

fil.php-tr.com

PHP-TR bilgi@php-tr.com http://www.php-tr.com http://forum.php-tr.com

groups/tr.developers @php_tr

#phptr

2


Fırat AĞDAŞ firatagdas@gmail.com Triodor Software

<?

Önsöz Composer konusunu giriş seviyesinde işleyeceğim. Eğer gelişmiş seviyede döküman arıyorsanız bu makalenin size göre olmadığını belirtmek isterim. Ayrıca bu makalede kullandığım komutlar unix tabanlı bir işletim sistemi üzerinde çalışacaktır. Eğer windows kullanıyorsanız http://getcomposer.org/doc/00-intro.md#installation-windows sayfasını ziyaret edip kurulum kısmını oradan yapmanızı tavsiye ederim.

Composer Eğer Zend Server gibi php binary ‘sini kendi dizininde tutan bir sunucu kullanıyorsanız, komut aşağıdaki gibi olmalı. curl -sS http://getcomposer.org/installer | /usr/local/zend/bin/php

Composer nedir? Composer, birbirine bağımlılığı olan paketlerin yüklenmesi ve güncel tutulmasını sağlayan bir araçtır. Her ne kadar paketlerle uğraşsa da, bir paket yönetim sistemi değil sadece bağımlılık yönetim sistemidir. Çünkü sisteminize global olarak herhangi bir dosya yüklemez. Sadece yüklemeyi çalıştırdığınız klasörde “vendor” adında bir klasör oluşturur ve bu klasöre yükler.

Composer için kütüphaneleri “composer.json” dosyasında belirtiyoruz. Web projemde kullanacağımız kütüphaneler:

İyi güzel de, nerede kullanılacak bu Composer? Diyelim ki bir web projesi üzerinde çalışıyorsunuz ve farklı kütüphaneler kullanacaksınız. Her bir kütüphaneyi indirip, projenize eklemeniz gerekmektedir. Tüm bu kütüphanelerin güncelliğini tek tek takip etmek bir yana, projenizin boyutunun anormal bir şekilde büyütmesi de bir sorun olacaktır. İşte composer projenizin boyutunu büyütmezken tüm bu işleri sizin yerinize tek bir komutla yapar. Peki nereden başlarım? Composer ‘ı kurarak. İsterseniz global olarak, isterseniz çalıştığınız web projenizin klasörüne yükleyip kullanabilirsiniz. Genel olarak kullanım projesinin ana dizinine kurulup oradan çalıştırma yönünde olduğu için ben de bu yöntemi kullanacağım. Şimdi bir web projesi üzerinde adım adım örneklerle composer ‘ı nasıl kullanırız işleyelim. Adım adım örneklerle Composer! Öncelikle web projemizin root dizinine gidip klasör oluştuyoruz.

fil.php-tr.com

mkdir composer-rocks cd composer-rocks/

*Silex (Framework) *Twig (Şablon Servisi) (Silex Servisi) *URL Oluşturucu (Silex Servisi) Proje ile işimiz bittiğinde projemiz aşağı yukarı şu dizin ağacına sahip olacaktır. composer.phar composer.json composer.lock (Composer ‘ın veri tabanı, kendisi tarafıdan otomatik oluşturuluyor) library/ ComposerRocks VersionHelper.php vendor/ silex silex projesi. ... twig ... public/ .htaccess index.php template index.html.twig

Öncelikle composer.json ‘a silex‘i yerleştirip üzerinde biraz açıklama yapalım.

{ "require": { "silex/silex": "1.0.0" } }

Şimdi composer ‘ı yükleyebiliriz. curl -sS http://getcomposer.org/installer | php

Yüklenmesini istediğimiz paketi, paketin ismi ve paketin versiyonu şeklinde “require” bloğunda belirtiyoruz. (Paket isimlerini https://packagist.org/ ‘dan aratabilirsiniz.)

3


Paketin ismi <yayımcı>/<proje> şeklinde yayımlanır. Dolayısıyla paket isminde, yayımcı ve proje isminin aynı olması da olası. Buradaki yayımcı bir klasör adı olarak, proje; composer kuruluma başladıktan sonra vendor klasörüne yüklenir. Paketin versiyonunu aşağıdaki kriterlerle projemizin ihtiyacına göre şekillendirebiliriz. Kesin versiyon: Projede kullandığımız gibi paketin kesin

<?

versiyonunudur. Örnek: 1.1.2 Versiyon aralığı: >, <, >=, <=, != operatörlerini kullanarak versiyon aralığı belirtebiliriz. Örneğin 1.1.0 ve 2.0 aralığını projemizin desteklediğini varsayarsak, versiyonu >=1.1.0,<2.0 olarak belirlememiz gerekir. Bir başka örnek 2.0 ‘dan aşağı tüm versiyonları kullanacağımızı düşünersek yalnızca <2.0 olarak belirtebiliriz. Wildcard: * ile belirlediğimiz alandaki tüm versiyon numaraları kullanabiliriz. Örneğin 1.0 ‘ın tüm bug-fix yayımlarını almak istiyoruz, o halde 1.0.* olarak belirtmemiz gerekir. Ya da milestone yayımlarını almak istediğimizde 1.* (1.1, 1.2, 1.9.1 vs...) olmalı. Bir sonraki önemli yayım: ~ operatörü ile belirtilir. Örneğin: ~1.0 ifade olarak >=1.0,<2.0 ‘ın aynısıdır. Bir başka örnek olarak ~1.3.4 ifade olarak >=1.3.4,<1.4 ‘ün aynısıdır.

Symfony ve pimple, silex ‘in bağımlı olduğu paketler ve silex/silex paketi tanımlandığında beraber yüklenir. Dolayısıyla elle kurulumlardaki gibi diğer paketleri tek tek indirip sizin entegre etmenize gerek yok. autoload.php, composer tarafından indirilen paketlerin içerisinde bulunan Class ‘ları otomatik olarak load ederek kullanabilmenizi sağlayan bir php dosyasıdır. Yani çalıştıracağınız web dosyanın başında önce bu dosyayı include etmelisiniz. Şimdi klasörü imajdaki şekilde public/.htaccess, public/index.php ve template/index.html.twig dosyalarını oluşturalım.

O halde Silex için de 1.0.* kullanabiliriz. S i l e x ‘ i n d ö k ü m a n t a s y o n a g ö r e (http://silex.sensiolabs.org/doc/providers/twig.html) twig ile uyumlu versiyon aralığı >=1.8,<2.0-dev. Ayrıca twig şablonlarının içerisinde servis fonksiyonlarını kullanabilmek için de symfony/twigbridge kullanacağız. composer.json ‘ımızın son hali.

{ "require": { "silex/silex": "1.0.*", "twig/twig": ">=1.8,<2.0-dev", "symfony/twig-bridge": "~2.3" }

public/index.php

<?php

}

Şimdi install komutunu çalıştıralım. php composer.phar install

use Silex\Provider\TwigServiceProvider; use Silex\Provider\UrlGeneratorServiceProvider; use Symfony\Component\HttpFoundation\Request; // composer autoload require_once(__DIR__ . '/../vendor/autoload.php'); // silex $app = new Silex\Application(); // debug modu $app['debug'] = true; // twig servisini kaydet $app->register(new TwigServiceProvider(), array( 'twig.path' => __DIR__ . '/../template', // twig path 'twig.options' => array( 'strict_variables' => false, 'cache' => false, 'debug' => true ) ));

Dizinin içeriğine baktığımızda vendor klasörü ve composer.lock klasörü oluşmuş olmalı.

// url generator serivisini kaydet $app->register(new UrlGeneratorServiceProvider());

fil.php-tr.com

// silex route $app->get('/hello-world/{forWhat}', function(Request $request) use ($app) { $viewParams = array( 'forWhat' => $request->get('forWhat') );

Şimdi composer ‘ı yükleyebiliriz.

return $app['twig']>render('index.html.twig', $viewParams); })->bind('hello-world-route');

vendor klasörünü görüntülediğimiz taktirde silex ve twig haricinde symfony, psr, pimple, composer, autoload.php dosyaları da oluştu.

// calistir $app->run();

4


public/.htaccess <?php namespace ComposerRocks; RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L]

class VersionHelper { const VERSION = '1.0.0'; }

template/index.html.twig

<?

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Composer Örnek</title> </head> <body>

şimdi bir class ‘ımız var. Bunu autoload ‘a ekleyebilmek için composer.json ‘a aşağıdaki şekilde değiştirelim.

{ "require": { "silex/silex": "1.0.*", "twig/twig": ">=1.8,<2.0-dev", "symfony/twig-bridge": "~2.3" }, "autoload": { "psr-0": { "ComposerRocks": "library/" } }

<h1>Hello World, <a href="{{ path('hello-worldroute', { forWhat: 'Cooommpoooseeerrrrr' }) }}">{{ forWhat }}</a>!</h1> </body> </html> }

Şimdi URL ‘yi ziyaret edelim. http://localhost/composer-rocks/public/hello-world/composer

Burada autoload, psr-0 standardları ile library klasörünün altındaki ComposerRocks namespace ‘i ile başlayan tüm class ‘ları autoload edecektir. Dizin belirtirken burada [] literalleri ile birden fazla dizin belirtebilirsiniz. Şimdi composer ‘da update ‘i çalıştıralım.

php composer.phar update

ve işte! Projemiz geliştirilmeye hazır!

vendor/composer/autoload_namespace.php ‘i incelerseniz en alt satıra ComposerRocks namespace ‘inin eklendiğini göreceksiniz.

Bu noktadan sonra silex ‘in ve diğer paketlerin yeni versiyonları çıktığında güncellemek için çalıştırmamız gereken komut:

php composer.phar update

Bir başka yöntemle de ekleyebiliriz.

// composer autoload $loader = require_once(__DIR__ . '/../vendor/autoload.php'); $loader->add(‘ComposerRocks’, __DIR__ . ‘/../library’);

fil.php-tr.com

Şuan yeni kurulum yaptığımız için herhangi bir güncelleme yok. Peki Composer ‘ın autoload ‘unu kullanırsam kendi class ‘larımı nasıl load edeceğim? Şimdi library/ComposerRocks/VersionHelper.php dosyasını oluşturalım ve aşağıdaki kodları girelim.

Eğer kullandığınız kütüphane de namespace kullanmak istemiyor, PEAR kodlama stilini kullanmak istiyorum diyorsanız classmap ‘i kullanmalısınız.

{ “autoload”: { “classmap” : [‘dizin1’, ‘dizin2’, ‘dizin3’, ‘dizin4/phpdosyasi.php’] } }

5


Composer ilgili dizinlerdeki tüm class ‘ları haritalayıp, size hazır olarak sunacaktır.

Versiyon kontrol sistemiyle nasıl kullanırım?

Şimdi index.php ‘yi aşağıdaki şekilde değiştirelim.

Bir .gitignore dosyası oluşturalım ve içerisine aşağıdakileri ekleyelim.

<?php use use use use

<?

ComposerRocks\VersionHelper; Silex\Provider\TwigServiceProvider; Silex\Provider\UrlGeneratorServiceProvider; Symfony\Component\HttpFoundation\Request;

composer.phar compoer.lock vendor/

Daha sonrasında composer.json, library/, template/ ve public/ dosyaları bize ait olduğu için onları git ‘e ekleyelim.

// composer autoload require_once(__DIR__ . '/../vendor/autoload.php'); // silex $app = new Silex\Application(); // debug modu $app['debug'] = true; // twig servisini kaydet $app->register(new TwigServiceProvider(), array( 'twig.path' => __DIR__ . '/../template', // twig path 'twig.options' => array( 'strict_variables' => false, 'cache' => false, 'debug' => true ) )); // url generator serivisini kaydet $app->register(new UrlGeneratorServiceProvider()); // silex route $app->get('/hello-world/{forWhat}', function(Request $request) use ($app) { $viewParams = array( 'forWhat' => $request>get('forWhat'), 'version' => VersionHelper::VERSION );

Şimdi commit ‘leyip push ‘layabiliriz. İmajda görünen kod bizim repository ‘de saklayacağımız kodun kendisi. Test vakti! Tüm bu yaptıklarımızı kısa yoldan test etmek için repository ‘sinden kodu çekelim. git clone https://github.com/php-tr/composerrocks.git

return $app['twig']>render('index.html.twig', $viewParams); })->bind('hello-world-route'); // calistir $app->run();

index.html.twig dosyasını da aşağıdaki şekilde düzenleyin.

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Composer Örnek</title> </head> <body>

fil.php-tr.com

<h1>Hello World, <a href="{{ path('hello-worldroute', { forWhat: 'Cooommpoooseeerrrrr' }) }}">{{ forWhat }}</a>!</h1> <p>Version: {{ version }}</p> </body> </html>

İşte son hali!

Composer ‘ı dizine kuralım.

curl -sS http://getcomposer.org/installer | php

ve yükleme komutunu çalıştıralım.

php composer.phar install

Sonuç Gördüğünüz gibi, yazılım hayatınızı kolaylaştıracak bir araç. Hem kolay hem de kullanışlı. Daha da önemlisi gerekli. İleride composer ‘da biraz daha gelişmiş konulara girip, yazdığınız kütüphaneleri nasıl yayımlayabileceğinizi anlatacağım. Herhangi bir sorunuz olduğu taktirde, bana facebook grubundaki PHP-TR grubundan ya da http://forum.php-tr.com üzerinden ulaşabilirsiniz. Bir dahaki makalede görüşmek üzere. Kaynak kodlar: https://github.com/php-tr/composer-rocks

6


Ceyda ANIL www.ceydaanil.com E-nerjik

Yeni Nesil CV’ler

<?

Yazılım dünyası içerisinde nefes alanlar bilir; yazılımcılar gerekirse tüm altyapıyı tek başına hayata geçirebilir, en zorlu projelere imza atabilirler. Ancak hiçbir zaman sevmedikleri aksiyonların başında cv hazırlamak gelir. CV hazırlamak neden sevilmez? Çünkü birçok kişi için CV gereksiz kağıt parçasından ibarettir. CV kelimesi duyulduğu anda, yazılımcının tüyleri diken diken bile olabilir! :) Birçok sağlam yazılımcı CV’si istendiği için kaybedilebilir! Ancak iş arama süreçlerinde cv kısaca sizin hakkınızda bilgi verir. CV’de bulunması gereken olmazsa olmaz bilgiler;  Doğum tarihi Adres (Açık adresinizi yazmak zorunda değilsiniz, ancak lokasyon

olarak nerede yaşadığınızı yazmanız yeterli.) Mezun olunan üniversite ve bölüm bilgileri Hangi şirkette hangi pozisyonda çalışıldığı (Görev tanımı için; hangi

programlama dillerini kullandığınızı, gerçekleştirdiğiniz projelerinizi yazabilirsiniz.) Projeler (Freelance projelerinizi yazmaktan çekinmeyin, ancak içinize sinmeyen projeleri yazmak zorunda değilsiniz.) Program bilgileri Hangi şirketlerde çalıştığınızı yazarken tarih eklemeyi unutmayın. Tarihi yazarken gününü yazmanıza gerek yok, ay ve yıl belirtmeniz yeterli. Birden fazla şirkette çalıştıysanız çalışma sıranızı, en son çalıştığınız yerden ilklere doğru sıralayın. Unutmayın; CV yalnızca word veya pdf sayfasından ibaret değildir.

fil.php-tr.com

Örneğin; İnfografik ile özgeçmişinizi yaratabilirsiniz (Sağ taraf)

Kaynak: http://kootation.com/

7


Ya da kendi tarzınızı yansıtabilirsiniz:

<?

Kaynak: http://kootation.com

fil.php-tr.com

Yaratıcılığınızı kullanın, fark yaratmak hoşunuza gidecek! :)

8


İbrahim HIZLIOĞLU www.ibrahimhizlioglu.com Rabarba PHP Developer

<?

PHP ile MongoDB Kullanımı Dosyayı çalıştırdığınızda “extension_dir” yazan bölümde php sürücülerinin, “Loaded Configuration File” yazan bölümde ise php.ini dosyanızın bulunduğu dizini görebilirsiniz.

MongoDB, 10Gen isimli şirket tarafından açık kaynaklı olarak geliştirilen NoSQL veritabanıdır. Anlık çok fazla işlem yapmanız gerektiğinde veya önbellekleme yapmak istediğinizde tercih edilebilir. Mobil platformlarda yer bildirimi (check-in) yapmak için çoğumuzun kullandığı foursquare altyapısında MongoDB kullanıyor. Bildiğim kadarıyla link kısaltma servisi olarak sıkça kullanılan bit.ly’de MongoDB’yi tercih ediyor. Ben bu makalede varolan bir MongoDB sunucusuna PHP ile bağlanmayı ve kod örneklerini paylaşmaya çalışacağım. Eğer M o n g o D B k u r m a k i s t i y o r s a n ı z http://www.mongodb.org/downloads adresinden işletim sisteminize uygun sürümü indirebilir ve kurabilirsiniz.

ADMIN UI (YÖNETİM ARAYÜZÜ) MySQL kullandığım projelerde veritabanı yönetimi için eğer 3306 portundan remote mysql yetkim varsa Navicat ( http://www.navicat.com/ ) isimli yazılımı kullanıyorum. Navicat ile MyS Q L, S Q L Server, S Q Lite, Oracle ve PostgreS Q L veritabanlarında işlem yapılabiliyor. MongoDB kullanmam gerektiğinde mongo için Admin UI araçlarını incelemeye başladım. Bir çok aracı denedim ancak çoğu yeterli ve kullanıcı dostu değildi. Denediklerim arasından kötünün iyisi olarak MongoV U E (http://www.mongovue.com/ ) isimli aracı önerebilirim. “Keşke Navicat’in Mongo desteği bulunsaydı” dediğim zamanlar çok olduğuna göre; ya ben alışkanlıklarımı değiştirmekte zorlandım, ya da gerçekten Mongo’nun UI araçları

PHP MongoDB Sürücüsü Kuralım MongoDB sunucusuna bağlanabilmek için php’ye mongodb sürücüsünü tanıtmanız gerekiyor. Eğer Linux kullanıyorsanız https://github.com/mongodb/mongo-php-driver github üzerinden kurulumu tamamlayabilirsiniz. Windows ortamında MongoDB ile çalışmak istiyorsanız öncelikle https://github.com/mongodb/mongo-php-driver/downloads adresinden çalışacağınız ortamın php sürümü, 32 / 64 bit gibi özelliklerini dikkate alarak dll dosyalarını indirin. İndirdiğiniz dll dosyaları arasından size uygun olanı seçin. (Ben Php 5.4 sürümünü barındıran 64 bit makinede çalıştığım için php_mongo-1.3.2RC1-5.4vc9-x86_64.dll dosyasını seçtim) Ardından seçtiğiniz dosyayı Php sürücülerinin bulunduğu dizine php_mongo.dll ismiyle kopyalayın. Son olarakta php.ini dosyanıza; sisteminize uygun sürümü indirebilir

fil.php-tr.com

extension=php_mongo.dll

satırını ekleyin. Web sunucunuzu yeniden başlattığınızda mongodb sürücüsünün php ile kullanıma hazır olduğunu göreceksiniz. Not : php.ini dosyasının ve php sürücülerinin hangi dizinde bulunduğunu bilmiyorsanız info.php isimli bir dosya oluşturun.

<?php

MONGODB BAĞLANTISI KURMAK MongoD B sürücümüzü P H P’ye tanıtarak kullanmaya başladığımıza göre ilk olarak mongo sunucusuna bağlanmayı deneyelim. MongoDB sunucusu ilk kurulduğunda varsayılan olarak 27017 portundan çalışıyor. Ayrıca Authentication (Kimlik Doğrulama) özelliği kapalı olarak geldiği için kullanıcı adı ve şifre bilgisi de girmeniz gerekmiyor. Host ve port bilgilerini yazarak hızlıca bağlanabilirsiniz.

<?php try { // Mongo Sunucusuna bağlanalım $mongo = new MongoClient('mongodb://127.0.0.1:27017'); // Veritabanını Seçelim $db = $mongo->selectDB('TestDb'); } catch(MongoConnectionException $e) { die('Baglanti Kurulamadi:'.$e->getMessage()); } ?>

phpinfo(); ?>

9


Eğer Mongo sunucunuzda kimlik doğrulama özelliği aktif edilmişse bağlantı satırını aşağıdaki şekilde düzenleyebilirsiniz.

$mongo = new MongoClient('mongodb://user:pass@127.0.0.1:27017');

// Sıralamayı belirliyorum.(1:ASC, -1:DESC) $orderBy = array('kayitTarihi' => 1); // Kayıtları Çekiyorum. $uyeListesi = $uyeler->find($where)->limit(10)>sort($orderBy); ?>

<?

MONGODB İLE KAYITLARI LİSTELEME Collection’lar MongoDB doküman gruplarıdır. Collection terimini MySQL'de ki tablo olarak düşünebilirsiniz. Collection’larda ortak şema, alan adları mecburiyeti yoktur fakat genel olarak uygulama bütünlüğü için normal veritabanı tabloları gibi ortak alan adları kullanılır. MongoDB'de kayıtlar Collection'ların içerisinde yer alır. Bir Collection içerisinde yer alan kayıtları php ile listelemeye geçmeden önce bir kaç ipucu vereyim. Eğer konsol üzerinden çalışıyorsanız;

komutu ile Collection oluşturabilirsiniz. Varolan collection'ları listelemek için;

collections

satırını çalıştırmanız yeterlidir. Ben mongo sunucumda "uyeler" isminde bir collection oluşturdum. Bunun içerisine yine mongo konsolundan;

try

{

$uyeler->insert($yeniUye); } catch(MongoCursorException $e){ die('Yeni uye eklenirken teknik bir sorun olustu! > ' . $e->getMessage()); } ?>

MONGODB İLE KAYIT GÜNCELLEME Collection içerisinden kaydı güncellemek istiyorsanız;

db.uyeler.insert({"nick":"ibrahimhizlioglu","web":"ww w.ibrahimhizlioglu.com"});

<?php // Güncelleyeceğim kaydın koşulunu $where = array('nick' => 'ibrahimhizlioglu');

satırını çalıştırarak kayıtlar oluşturdum. Makalenin alt bölümlerinde PHP ile collection'a kayıt ekleme örnekleri de yer almaktadır. Şimdi uyeler collection'ı içerisinde yer alan kayıtları listeleyelim. (Yukarıda yer alan try-catch kodunu genişleterek devam edebilirsiniz)

// Güncellenecek alanını belirliyorum $yeniBilgi = array('nick' => 'ibo');

<?php // Üyeler $uyeler =

İsimli Collection'ı Seçelim new MongoCollection($db, 'uyeler');

// Toplam Üye Sayısını printf('<p>Toplam Uye : >count());

// Kaydı değiştiyorum $uyeler->update($where, ?>

belirliyorum

$yeniBilgi);

MONGODB İLE KAYIT SİLME Varolan Collection içerisinden kaydı silmek istiyorsanız;

Ekrana Basalım %s</p>',$uyeler<?php // Sileceğim kaydın koşullarını belirliyorum $where = array('nick' => 'ibrahimhizlioglu');

// Tüm uyeleri cekelim. $uyeListesi = $uyeler->find(); // Çektiğimiz kayıtları listeleyelim. foreach($uyeListesi as $uye) { printf('Nick : %s | Web : %s $uye['nick'], $uye['web']); } ?>

fil.php-tr.com

MONGODB İLE KAYIT EKLEME Varolan Collection içerisine yeni kayıtlar eklemek için;

<?php // Üye bilgilerini tanımlıyorum $yeniUye = array( 'nick' => 'ibrahimhizlioglu', 'web' => 'www.ibrahimhizlioglu.com' );

db.createCollection('uyeler');

show

komutlarını çalıştırabilirsiniz. Eğer sadece tek bir kayıt çekecekseniz find() yerine findOne() fonksiyonunu tercih edebilirsiniz.

<br>',

Collection içerisinde yer alan tüm kayıtları çekerek döngüye dahil ettik ve ekrana bastırdık. Eğer adı "İbrahim" olan kişileri kayıt tarihine göre sıralayarak ilk 10 kişiye ulaşmak istiyorsanız;

<?php // Koşulu tanımlıyorum. $where = array('ad' => 'İbrahim');

// Kaydı collection içerisinden $uyeler->remove($where); ?>

siliyorum

Php ile MongoDB veritabanı üzerinde CRUD (Create Read Update Delete) işlemleri özetle bu şekilde yapılabiliyor. D a h a f a z l a d e t a y i ç i n ; http://www.php.net/manual/en/class.mongodb.php , http://www.php.net/manual/en/class.mongocollection.php adreslerini inceleyebilirsiniz. MongoDB kullandığım bir projenin hem NodeJS hem de PHP kodlamasını yapmıştım. Eğer MondoDB'yi NodeJS ile kullanmak istiyorsanız Mongoose ( http://mongoosejs.com/ ) isminde çok güzel bir ORM bulunuyor. Bu ORM üzerine de fırsat bulabilirsem başka bir makale hazırlayacağım. Aylardır "Yazılacak Makaleler" listemde yer alan bir konuyu sonunda fırsat bulup, hazırlayabildim, umarım faydalı olmuştur. :)

10


Caner GÜMÜŞ caner@elemanonline.net Bilgi Teknolojileri Direktörü

<?

Günümüzde Google ve diğer arama motorlarından edinilen alışkanlıkların da etkisiyle kullanıcılar aradıkları bilgiye metin girecekleri bir kutu (text input) ve bir buton ile ulaşmayı tercih ediyorlar. Hatta birçok intenet kullanıcısı için internet Google'ın arama kutusu ve butonundan ibaret. Hal böyle olunca başarılı web siteleri için de site içi metin aramanın önemi fazlalaşmıştır. Metin arama özellikle e-ticaret ile ilan ve liste siteleri için çok önemlidir. Geliştirdiği web sitesinde metin arama özelliği koymak isteyen birçok geliştiricinin ilk tercihi genellikle kullanılan veritabanı sunucusunun bu işe uygun özelliklerini kullanmaktır. Örneğin Mysql için sorgularda ilgili metin alanlarda 'LIKE' kullanmak veya daha gelişmiş bir metin arama için full-text (tam metin) indeks kullanmak sıklıkla uygulanan yöntemlerdendir. LIKE yapısı gereği çok kısıtlı arama seçenekleri sunar (belli bir metni içeren satırları bulmak gibi). Ayrıca büyük tablolarda ve yüksek trafik altında performans sıkıntıları olmaktadır. Full-text index LIKE'dan daha fazla özellik sunsa da yüksek trafikli sitelerde ciddi performans sorunlarına neden olur. Bu nedenle Mysql gibi bir veritabanını tam metin aramalarda kullanmak uygun olmayabilir. Bu iş için geliştirilmiş arama sunucularını kullanmak hem yüksek performans hem de yüksek arama kalitesi için tercih edilebilir. Sphinx ( http://sphinxsearch.com/ ) C++ ile yazılmış açık kaynaklı bir tam metin (full-text) arama sunucusudur. Sphinx geliştirilirken hız, arama kalitesi ve entegrasyon basitliği ön planda tutulmuştur. Windows, MacOS ve Linux ile bazı diğer işletim sitemlerinde çalışmaktadır. Bugün birçok yüksek trafikli ve çok fazla veri içeren sitede arama sunucusu olarak Sphinx kullanılmaktadır [1].

Sphinx ile ilgili bu yazı dizimizde işlemleri LAMP (Linux, Apache, Mysql, Php) ortamında gerçekleştireceğiz. Sphinx Kurulumu http://sphinxsearch.com/downloads/release/ adresinde çeşitli işletim sistemleri için kurulum paketleri bulunmakta. Bunlardan en üstteki kaynak kodu (Source tarball) indirelim. Dosyanın bulunduğu dizine gidip kurulum dosyalarını çıkartalım:

Sphinx Search ile Hızlı Arama Sistemi $ cp -r libstemmer_c/. sphinx-2.0.8release/libstemmer_c

Şimdi libstemmer'ı da etkinleştirerek kurulumu yapabiliriz:

$ cd sphinx-2.0.8-release $ ./configure --prefix=/usr/local/sphinx --withlibstemmer $ make $ make install

Burada /usr/local/sphinx klasörüne kurulumu yaptık. Fakat isterseniz farklı bir klasöre de kurulum yapabilirsiniz. Kurulum klasörüne girdiğimizde bin, etc ve var şeklinde klasörler görmemiz gerekli. Bunlardan bin klasöründe Sphinx uygulama dosyaları (indexer, searchd vb.), etc klasöründe ayar dosyası, var klasöründe ise indeks verileri ile log dosyaları bulunur. Devam etmeden önce var klasörüne yazma izni vermeyi unutmayın. Ayarlar, İndeksleme ve Sunucu Sphinx'i kullanabilmek için öncelikle arama yapacağımız verileri i nd e k s l e m e m i z ge re k i r. Te s t ve ri s i ol arak http://dev.mysql.com/doc/index-other.html sayfasından 'world database'i indirip Mysql sunucunuzda oluşturduğunuz world isimli veritabanına yükleyin. İlk olarak veritabanındaki City tablosundan şehir adları ve ülke kodlarını indeksleyeceğiz. Bunun için Sphinx'i kurduğumuz yerde etc klasöründe sphinx.conf isimli dosya oluşturalım ve içine aşağıdaki kodu yazalım:

source city { type = mysql sql_host = localhost sql_port = 9306 sql_user = sph_user sql_pass = sph_pass sql_db = world sql_query_pre = SET NAMES utf8 sql_query_pre = SET SESSION query_cache_type=OFF

fil.php-tr.com

$ tar xvzf sphinx-2.0.8-release.tar.gz

Kuruluma başlamadan önce libstemmer kütüphanesi de indirelim. Bu kütüphane ile aramalarımızda Türkçe kök-ayırıcı (stemmer) kullanabileceğiz. Arama ayarlarını uygun şekilde yaparsak 'php ilanları' şeklindeki bir arama 'php ilanı' içeren satırları da arama sonucunda listeleyecektir. Libstemmer kütüphanesini http://snowball.tartarus.org/download.php adresinden indirebiliriz. Burada Tarballs kısmında en üstteki C versiyonunu indirip dosyayı açalım. Daha sonra libstemmer_c klasörünü Sphinx kurulum dosyalarının bulunduğu klasöre kopyalayalım.

sql_query = \ SELECT \ ID, \ Name, \ CountryCode, \ Population \ FROM \ City sql_attr_uint = Population }

11


Yukarıdaki kısım oluşturacağımız indeksin kaynağını gösterir. Her Sphinx indeksinin bir kaynağı olmalıdır. Farklı indeksler bir kaynağı kullanabilirler. Kaynak ayar kısmında sunucu bilgilerini (host, user, port vs.) kendi sunucunuza göre değiştirmeyi unutmayın.

Ayarları kaydettikten sonra ilk indeksimizi oluşturabiliriz. Bunun için Sphinx kurulum dizininde aşağıdaki kodu çalıştıralım:

$ bin/indexer city

<?

Kaynak kısmında indekslenecek veri sql_query parametresine yazılan bir SELECT sorgusu ile belirtilir. Ters bölü (\) karakteri ile sorguyu satırlara ayırabilrsiniz. Buradaki sorguda okumayı kolaylaştırmak için sorguyu satırlara böldük ve girintilerini ayarladık. sql_query_pre ise adından da anlaşılacağı gibi sql_query'den önce çalıştırmak istediğimiz sorgular için kullanılır. Biz burada karakter kodlamamızı utf8 olarak ayarladık ve sunucuya yapacağımız sorguları önbelleğe almamasını söyledik. Genellikle Sphinx indeks sorguları sık çalıştırılmaz, çok miktarda veri çeker ve çekilen veriler farklı olur. Bu nedenlerle önbelleğe almaya uygun değillerdir. Kaynak sorgumuzda City tablosundan ID, Name, CountryCode ve Population alanlarını istedik. Kaynak sorgularında ilk değer eşsiz bir tamsayı olmalıdır. Bu sebeple tablolardaki primary index sütunları bu iş için çoğunlukla daha uygundur. sql_attr_uint ile Population alanının metin değil tamsayı olduğunu belirttik. Eğer alan tipi belirtilmezse Sphinx o alanı metin olarak kabul eder. Sphinx'tek alan tiplerine dizinin sonraki yazısında değinilecektir. Şimdi de indeks ayarlarını yapalım. Bunun için aşağıdaki kodu sphinx.conf dosyasına ekleyelim:

Komut sonucu aşağıdakine benzer olmalı:

Sphinx 2.0.8 Copyright (c) 2001-2013, Andrew Aksyonoff Copyright (c) 2008-2013, Sphinx Technologies Inc (http://sphinxsearch.com) using config file 'sphinx.conf'... indexing index 'city'... collected 4079 docs, 0.0 MB sorted 0.0 Mhits, 100.0% done total 4079 docs, 47486 bytes total 0.023 sec, 2016133 bytes/sec, 173183.88 docs/sec total 4 reads, 0.000 sec, 46.4 kb/call avg, 0.0 msec/call avg total 11 writes, 0.000 sec, 28.0 kb/call avg, 0.0 msec/call avg

Şimdi de sunucuyu çalıştıralım: $ bin/searchd

index city { source = city path = /usr/local/sphinx/var/data/ilan charset_type = utf-8 charset_table = A->a, B->b, C->c, U+C7->c, U+E7->c, D..G->d..g, U+11E->g, U+11F->g, H->h, I>i, U+131->i, U+130->i, J..O->j..o, U+D6->o, U+F6>o, P..S->p..s, U+15E->s, U+15F->s, T..U->t..u, U+DC->u, U+FC->u, V..Z->v..z, a..z, 0..9, _, -, & min_word_len = 2 dict = keywords expand_keywords = 1

Komutun sonucu aşağıdakine benzer olmalı: $ Sphinx 2.0.8 Copyright (c) 2001-2013, Andrew Aksyonoff Copyright (c) 2008-2013, Sphinx Technologies Inc (http://sphinxsearch.com) using config file 'sphinx.conf'... listening on all interfaces, port=9312 listening on all interfaces, port=9306 precaching index 'city' precached 1 index in 0.422 sec

}

fil.php-tr.com

İndeks ayarında ilk olarak kullanılacak kaynağı ve indeks dosyalarının kaydedileceği yeri belirtiyoruz. Karakter setimizi utf8 olarak ayarlayıp Türkçe karakterleri tablo olarak veriyoruz. Burada indekslenecek karakterleri harfler, rakamlar ile alt çizgi, çizgi ve & ile sınırlandırıyoruz. En küçük kelime uzunluğunu 2 olarak belirtiyoruz.

Şimdi Mysql arayüzünü kullanıp indekste ilk sorgumuzu çalıştıralım. Sphinx PHP, Python vs. diller için çeşitli API'ler sunmakta fakat biz daha fazla önerilen SphinxQL ile arama sunucusundan istekte bulunacağız. $ mysql --user=root --port=9306 --host=127.0.0.1

Son olarak sunucu ve indeksleyici ayarlarını sphinx.conf dosyasına ekleyelim:

Welcome to the MySQL monitor. or \g. Your MySQL connection id is 1 Server version: 2.0.8

indexer { mem_limit = 32M }

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

searchd { listen = 9312 listen = 9306:mysql41 log = /usr/local/sphinx/var/log/searchd.log query_log = /usr/local/sphinx/var/log/query.log pid_file = /usr/local/sphinx/var/log/searchd.pid binlog_path = /usr/local/sphinx/var/log max_matches = 1000 compat_sphinxql_magics = 0 workers = threads

Commands end with ;

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>

Burada Mysql arayüzünü kullanarak Sphinx sunucusuna bağlandık. Şimdi indeksleri listeleyelim:

}

12


mysql> SHOW TABLES; +------------+-------+ | Index | Type | +------------+-------+ | city | local | +------------+-------+ 1 row in set (0.00 sec)

Şimdi de city indeksi üzerinde bir arama yapalım:

<?

mysql> SELECT * FROM city; +------+------------+ | id | population | +------+------------+ | 1 | 1780000 | | 2 | 237500 | | 3 | 186800 | | 4 | 127800 | | 5 | 731200 | | 6 | 593321 | | 7 | 440900 | | 8 | 234323 | | 9 | 201843 | | 10 | 193238 | | 11 | 172701 | | 12 | 160398 | | 13 | 153491 | | 14 | 152463 | | 15 | 149544 | | 16 | 148772 | | 17 | 142465 | | 18 | 138020 | | 19 | 135621 | | 20 | 129170 | +------+------------+ 20 rows in set (0.00 sec)

Gördüğünüz gibi 20 kayıt döndü. Sphinx'in varsayılan limiti 20'dir ve herhangi bir limit belirtilmese dahi sunucu tarafından sonuçlar sınırlandırılır. Burada ayrıca metin alanlar döndürülmedi. Sphinx sorgu sonucunda tam metin alanları döndürmemektedir. Sorgu sonucunda metin alanlar da isteniyorsa indekste farklı alan tipi belirtilmeli veya arama sonucunda dönen id değerlerini kullanarak istenilen değerler Mysql sunucusundan istenilmelidir. Sphinx yazı dizimizin bu bölümünde bir Sphinx sunucusu kurduk ve ilk indeksimizi oluşturup sorgumuzu çalıştırdık. Sonraki bölümde PHP ile ilk Sphinx uygulamamızı yapacağız ve indeksler üzerinde farklı alan tiplerini inceleyeceğiz.

[1] http://sphinxsearch.com/about/sphinx/

fil.php-tr.com

linkedin.com/in/canergumus

13


fil.php-tr.com

<?

14


Duygu TÜMER duygu.tumer@umww.com Universal McCann

<?

Günümüzde artık bütün işyeri sahipleri şirketlerini anlatacak bir web siteleri olması gerektiğinin farkındalar. Çünkü web sitesi bir işyerinin kartvizitidir. Bir kullanıcı şirketiniz ya da sizinle ilgili bir bilgi bulmak istediği zaman arama motorlarını kullanıyor. Eğer web siteniz yoksa kullanıcılar sizin yerinize web sitesi olan rakiplerinizin hizmetleri ile ilgili bilgileri buluyor ve maalesef siz bu kullanıcılara ulaşamıyorsunuz.

Arama Motoru Optimizasyonu motorları web sitenizi baştan sona kadar bir kitap gibi rahat bir şekilde okuyabileceklerdir. Unutmayın ki arama motorları herhangi bir web sitesini sizin görebildiğiniz şekilde göremez. Bu yüzden web sitenizin kodlarının arama motorları tarafından anlaşılacak hale getirilmesi gereklidir. Son aşamada ise site dışı optimizasyon yapılır. Sitenizin içeriği ile ilgili olabilecek başka web siteleri ile link paylaşımı sağlanır. Sitenizin D M O Z kayıt işlemleri yapılır. Böylece arama motorlarında siteniz güvenli kategorisine girer. Maalesef her şey bu kadar kolay değil Bütün bu işlemleri yaparken bazı kurallara uymanız gerekmektedir. Optimizasyon çalışmalarında hizmetlerinizi anlatan genel tanımlar kullanılır. Bütün arama sonuçlarında ilgisiz de olsa sitenizin görünmesi maalesef ki web sitenizin kalite skorunu düşürecektir. Binlerce kelime ile sitenizi tanıtmaya çalışırsanız arama motorları sitenizin spam olduğunu düşünecek ve tamamen sitenizi kapatacaktır.

Öte yandan şirketinize ait web sitesini ziyaretçiler ilk aramada bulabiliyorlar mı? Ziyaretçiler hizmetlerinizle ilgili bir bilgiyi bulmak için arama motorlarını kullanırken neden karşılarına sizin web siteniz değilde rakibiniz olan şirketin web sitesi çıkıyor?

Önemli olan bir diğer konu arama motorlarının çalışma prensiplerinden dolayı sitenizin indexlenmesi uzun bir süre alabilir.Optimizasyon işlemini yaptıktan iki gün sonra web sitenizin birinci sırada çıkmasını beklememelisiniz. Ayrıca önemli bir diğer konu ise hiç bir optimizasyon çalışması birinci sayfa birinci sıra garantisi vermez. Bu çalışmaların web sitesini iyileştirmek için olduğunu unutmamak gereklidir.

Ziyaretçilere ulaşabilmek için web sitenizin bazı kriterlere uygun olması gerekir. Bu sayede rakiplerinizle aranızda ciddi bir farklılık yaratabilirsiniz. Peki nedir bu kriterler? Bu kriterler arama motoru optimizasyonu olarak adlandırılır.Bir web sitesinin arama motorlarında daha üst sıralarda çıkabilmesi için site içinde ve site dışında bazı değişiklikler yapılması gerekir. Bu değişiklikler sayesinde arama motorları şirketinizin web sitesinin içeriğini daha iyi anlayabilir ve gerçek hedef kitle ile şirketinizin web sitesini belirleyen kelimeleri eşleştirerek arama sonuçlarında daha üst sıralarda çıkmasını sağlar.

fil.php-tr.com

Arama motoru optimizasyonu yapılan web siteleri internet ortamında doğal yollarla keşfedilerek şirket marka bilinirliğini arttırır. Bu sayede markanız için ayıracağınız reklam bütçesi azalarak hedef kitlenize daha az harcama yaparak ulaşabilirsiniz.

Bütün bu kurallara uygun bir web sitesine sahip olduğunuz takdirde hedef kitlenize ulaşamamak için hiç bir sebebiniz kalmayacaktır.

Arama motoru optimizasyonu üç temel adımla yapılır İlk adım web sitesinin analiz evresidir. Bütün alt sayfalarda dahil olmak üzere web sitesinin temel eksiklikleri belirlenir ve ölçümleri yapılır. Yanlış kullanılmış html tagları, meta taglar listelenir,link yapıları kontrol edilerek kırık linkler belirlenir. Backlink adını verdiğimiz dış bağlantılar kontrol edilerek arama motoru optimizasyonuna uygunluğu test edilir. İkinci aşama olarak elimizdeki analize başlı kalarak gerekli html düzenlemeler site içinde yapılmaya başlanır. Bu sayede arama

http://tr.linkedin.com/pub/duygu-tümer/27/aa6/859

15


Berke Ediz DEMİRALP bedemiralp@gmail.com Yazılım Geliştirme Yöneticisi Mynet A.Ş.

<?

PHP 5.5 ile Gelen Yenilikler OPcache eklentisi nasıl kurulur? P H P 5.5 sürümünü derlerken --disable-all anahtarını kullanmadığınız sürece, OPcache kendiliğinden PHP 5.5 içine derlenecektir. Eğer --disable-all seçeneğini kullandıysanız, OPcache’i etkin hale getirmek için derleme sırasında --enableopcache anahtarını kullanmalısınız.

OPcache Eklentisi Zend Optimiser+ opcode cache (işlem kodu önbelleği) eklentisi, OPcache ismini alarak PHP 5.5’e ilave edildi. OPcache, ön-derlenmiş betiği (script), paylaşılan bellekte saklayarak, PHP’nin gelen her talepte betiği yeniden yüklemesi ve işlemesi ihtiyacını ortadan kaldırarak, PHP’nin performansını arttırır. Opcode cache kullanılmadığında, bir .php dosyasının her çalıştırılışında, çalışma-zamanı derleyicisi tetiklenir, dosyanın bellekteki temsili hali oluşturulur (intermediate code) ve çalıştırıcı tetiklenir.

PHP 5.4, 5.3 ve 5.2 sürümlerinde OPcache eklentisini kullanmak isterseniz, PECL paket kütüphanesinden Zend OPcache eklentisini indirerek kurabilirsiniz. Şifreleri hash’lemek için yeni API

PHP 5.4 ve öncesindeki sürümlerde PHP’nin performansını arttırmak için opcode cache eklentisi olarak yaygın olarak APC (Alternative PHP Cache) eklentisi kullanılıyor. OPcache ile APC temelde aynı işlevi görmektedir. Opcache’in APC’ye kıyasla üstün olduğu yönler  Zend Optimizer+ (OPcache), kullanıldığı koda göre değişkenlik göstermekle birlikte, APC’ye kıyasla %5 - %20 arası daha yüksek performans sergiliyor.  Zend Optimizer+ (OPcache) Zend şirketi ve PHP topluluğu tarafından geliştirildiği için, yeni çıkacak tüm PHP sürümleriyle, bu sürümler çıktığı anda uyumlu olarak gelecek.  Zend Optimizer+’ın (OPcache) tercihe bağlı olarak kullanılabilen bozulma tespiti (corruption detection) özelliği bulunduğundan, bir PHP fonksiyonunun C dilinde hatalı uygulanmış olmasından kaynaklanabilecek sunucu çökmelerini engelleyebilir. Bu nedenle diğer paylaşımlı bellek işlem kodu önbellek eklentilerine göre daha güvenilirdir.  PHP ile diğer eklentilere kıyasla daha uyumludur. PHP’nin tüm fonksiyonları ile beklendiği şekilde uyumlu çalışır.

APC’nin OPcache’e kıyasla üstün olduğu yönler

PHP kriptografi uzantılarına bir yenisi eklendi: Password Hashing. Bu uzantı PHP’nin crypt() fonksiyonunu sarmalayarak daha kolayca ve güvenli bir şekilde şifreleri oluşturmanıza ve saklamanıza yardımcı oluyor. Bu uzantı PHP 5.5 içinde kurulu olarak geldiğinden, ayrıca bir kurulum yapılması gerekmiyor. GD görüntü işleme kütüphanesine yeni gelen özellikler  imageflip() fonksiyonu ile görüntü çevirme özelliği eklendi.  imagecrop() ve imagecropauto() fonksiyonları ile gelişmiş

görüntü kırpma özellikleri eklendi.  imagecreatefromwebp() ve imagewebp() fonksiyonları ile,

Google tarafından geliştirilen görüntü biçimi olan WebP için okuma ve yazma desteği eklendi. Generator özelliği PHP 5.5’e generator özelliği yield anahtar kelimesi ile eklendi. Generator’ler Iterator interface’ini implement etmekle uğraşmaya gerek kalmadan kolayca iterator’ler oluşturmak için kullanılabiliyor.

fil.php-tr.com

 APC eklentisi verileri önbellekte tutmak için kullanılabilir.

OPcache’te ise bu özellik mevcut değildir. OPcache sadece işlem kodu önbelleği olarak çalışmak üzere tasarlanmıştır. APC’de olduğu gibi verileri saklamak için kullanılamaz.  APC önceden kullanılmış ve artık geçersiz olan betiklere (script’lere) ait bellek alanlarını tasfiye ederek yeniden kullanabilir. OPcache ise bu gibi alanlar kirli (dirty) olarak işaretler, fakat tasfiye etmez. Bunun yerine kirli bellek miktarı sizin belirleyebileceğiniz bir eşiği aştığında, OPcache kendini yeniden başlatarak, bu bellek alanlarını serbest bırakır. Bu özelliğin OPcache’in kararlı çalışması açısından hem avantajları, hem de dezavantajları olduğu söylenmektedir.

Örnek kod: <?php function bilesikFaizHesapla($tutar, $faizOrani, $donem) { for($i = 0; $i < $donem; $i++) { $tutar += $tutar * $faizOrani / 100; yield $tutar; } } foreach(bilesikFaizHesapla(1000, 10, 5) as $donemSonuTutar) { echo "donem sonu tutar: $donemSonuTutar \n"; } ?>

16


<?

Yukarıdaki kod aşağıdaki çıktıyı verir:

Yukarıdaki kod aşağıdaki çıktıyı verir:

donem sonu tutar: 1100 donem sonu tutar: 1210 donem sonu tutar: 1331 donem sonu tutar: 1464.1 donem sonu tutar: 1610.51

Array değeri çözümlemesi: PHP String değeri çözümlemesi: P

Finally anahtar kelimesi eklendi try-catch blokları artık finally anahtar kelimesini destekliyor. Finally bloğuna yazılan kod, try ve catch bloğundan sonra, bir istisna oluşturulmuş olsa da olmasa da çalıştırılır. Foreach yapısı bundan böyle sayıl olmayan değerleri de destekliyor PHP array’lerinde sadece sayıl olmayan anahtarlar (non-scalar keys) olmamasına rağmen, SPL koleksiyonunda yer alan Iterator::key() metodu herhangi bir tipte veri dönebilmektedir. Foreach yapısı artık sadece sayıl anahtarları değil, herhangi bir tipte verinin doğru olarak ele alınmasını desteklemektedir. Windows ortamında Apache 2.4 işleyici desteği Apache 2.4 SAPI işleyicisi artık Windows ortamında da destekleniyor. empty() artık değişkenler dışındaki değerleri de kabul ediyor PHP 5.4 ve öncesinde sadece değişkenin değerinin boş olup olmadığını kontrol edebilirken, PHP 5.5 ile birlikte herhangi bir ifadenin değerini kontrol edebilmektedir.

class:: kullanarak class ismi çözümlemesi ClassName::class kullanarak bir class’ın tam kalifiye ismine erişmek artık mümkün. Örnek Kod: <?php namespace Ornek\Proje; class Deneme { } echo Deneme::class; echo "\n"; ?>

Yukarıdaki kod aşağıdaki çıktıyı verir: Ornek\Proje\Deneme

Foreach kontrol yapısı list() ile kullanılabiliyor İç içe geçmiş dizileri (nested arrays) açmak için list() fonksiyonu foreach yapısı ile birlikte kullanılabiliyor. Örnek Kod:

<?php $alanKodlari = [ ['adana', 322], ['adiyaman', 416], ['afyon', 272], ['agri', 472] ]; foreach($alanKodlari as list($sehirAdi, $alanKodu)) { echo "$sehirAdi alan kodu: $alanKodu \n"; } ?>

Yukarıdaki kod aşağıdaki çıktıyı verir: adana alan kodu: 322 adiyaman alan kodu: 416 afyon alan kodu: 272 agri alan kodu: 472

fil.php-tr.com

Array ve String değeri çözümlemesi (literal dereferencing) Array ve string değerleri artık tekil öğe ve karakterlerine erişmek için doğrudan çözümlenebiliyor.

<?php echo "Array değeri çözümlemesi: "; echo ['PHP', '-', 'TR'][0]; echo "\n"; echo "String değeri çözümlemesi: "; echo 'PHP'[0]; echo "\n"; ?>

17


Okan Yedibela okan@sociaplus.com SOCIAPlus

<?

Bu yazımda en popüler versiyon kontrol sistemlerinden olan GIT ile ilgili daha çok teorik bilgiler vermeye çalışacağım. Yazının sonunda iste pratik bilgilere yer veren kaynaklar paylaşacağım. Sürüm Kontrol Sistemi Nedir ?

fil.php-tr.com

Dosyalar üzerinde yapılan tüm değişiklikleri kaydedip versiyonlar oluşturan ve daha sonra istenilen versiyona geri dönebilmeye olanak sağlayan bir sistemdir. Bu sistem neredeyse tüm dosya türlerinde kullanılabilir. GIT,Dağıtık Versiyon Kontrol Sistemidir. Bu da demek oluyor ki dosyalarınız tek bir sunucu üzerinde değil birden çok sunucu üzerinde tutulur. (bkz:Şekil-1)

Git Versiyon Kontrol Sistemi, Getirdiği Yenilikler, Avantajları ve Dezatanvajları

GIT'in Avantajları ve Yenilikçi Yönleri ·Oldukça hızlıdır. Çünkü birçok işlem lokal de gerçekleşir. Tüm değişiklikler lokal bilgisayarımızda tutulduğundan dolayı uzak sunucuyla hiçbir bağlantı kurmadan hızlı bir şekilde işlemleri gerçekleştirebiliyoruz. (Şekil-2) ·Lokal branching sağlar. ·En büyük farkı Merkezi değil Dağıtık olmasıdır.Bundan dolayı repoya sahip olan her bilgisayarda proje geçmişi bütünüyle saklanır. (Şekil -3) ·Disk alanını verimli kullanır. ·Diğer çoğu versiyon kontrol sistemlerinin aksine Git offline çalışır ve internete ihtiyaç duymadan geliştirme imkanı sunar. ·Yapılan işlemler sırasında verimi kaybedeceğim korkusunu asla yaşamazsınız. Git neredeyse herşeyin kaydını tutar ve anında istediğimiz datalara ulaşmamızı sağlar. ·Branch'lar üzerinde etkili bir denetim ve merge imkanı sunar. Conflict oluşma riski oldukça azdır. ·Satır satır değişiklik yapma imkanı sunar. ·Yeni kavramlara çık olduğunuz takdirde öğrenmesi kolaydır. Temel olarak bu maddeleri diğer sürüm kontrol sistemleri ile karşılaştırdığınızda öne çıkan noktalar olduğunu göreceksiniz.

Neden Versiyon Kontrol Sistemi Kullanmalıyız ? Birden fazla kişinin çalıştığı projelerde kodların yönetimi oldukca zor ve karmaşık olabilir. Ftp gibi bir yöntemle yaşamak kolay gelebilir ancak oldukça kullanışsız ve risklidir. Yapacağınız her işlem öncesi kodlarınızın bir yedeğini almak istediğinizi düşünün. Bu işlemi Versiyon Kontrol Sistemi olmadan yapmak tam bir işkence haline gelir. Bu sebeple bir topluluk ile veya bireysel olarak kaliteli kod geliştirmek, temiz bir projeye sahip olmak gibi sebeplerden ötürü Versiyon Kontrol Sistemi kullanmamız gerekir. Dağıtık Versiyon Kontrol Sistemi Öncelikle Merkezi Versiyon Kontrol Sistemine birkaç cümle ile değinelim. Bu tür bir sistemde tek depo(repository) bulunur ve b i r d e n ç o k k u l l a n ı c ı v a r d ı r . Dağıtık Versiyon Kontrol Sistemlerinde ise birden fazla yerel depo(local repository) ve birçok kullanıcı vardır. Bunun yanında birde uzak depo(remote repository) vardır.

18


Temel Git Komutları Öncelikle GIT'i çeşitli GUI'lar aracılığı ile komut yazmadan kullanabileceğinizi belirteyim. Bunun GUI'ı şuradan edinebilirsiniz http://git-scm.com/downloads/guis Ancak önerim yaptığınız şeyin ne olduğunu bilmeniz ve GIT'i terminalde komut satırlarıyla öğrenmeniz. Bunun için temel olarak detaya inmeden bir kaç komut listeleyeceğim:

<?

GIT Dezavantajları Aslında konuya dezavantaj demek pek doğru bir yaklaşım değil. Başlangıçta dezatantaj olarak görülebilecek şeylerin bir süre sonra önemsiz bir hal aldığı ve GIT'in proje geliştirme ortamının vazgeçilmez bir parçası olduğunu göreceksiniz. Peki nedir ilk bakışta dezavantaj olarak sayılabilecek durumlar ? ·Öğrenmesinin zor olduğundan yakınan bir kesim yok değil. Yaklaşım diğer kontrol sistemlerine göre farklı ve karmaşık olabilir. Ancak ilk adımı atana kadar sürüyor bu karmaşa. Bu konuda dökümanlar da günden güne artıyor ve aranılan soruların cevabına kısa sürede ulaşılabiliyor. ·Yine kurulumu konusunda sorunlar yaşayabilirsiniz. ·İşlemlerinizi yaparken karşınıza çıkan hata mesajları ilk bakışta bir anlam ifade etmiyor olabilir. GIT'in İşleyiş Biçimi ·Dosyalarınız üzerinde değişiklik yapılır. ·Dosyaları hazırlık alanına eklenir. ·Hazırlık alanındaki son halleri alınıp Git klasöründe kalıcı olarak depolanır. Bu işleyiş biçimini aşağıda görebilirsiniz.(Şekil-4)

·git status : Dosyaların o anki durumunu gösterir. Yapılan tüm değişiklikleri gösterir. ·git add : Dosyaları commit e hazırlamanızı sağlar. ·git commit : Yapılan değişiklikleri bir versiyon olarak kaydeder. ·git push : Dosyaları uzak repo'ya göndermenizi sağlar. ·git pull : Uzak repo'daki tüm güncellemeleri lokal repo'nuza çeker. ·git rm : Dosya silmenizi sağlar. ·git checkout : Kullanıma bağlı olarak branch'lar arasında geçiş yapmanızı sağlar veya izlemeye alınmamış dosyaları eski haline göndürmenizi sağlar. ·git branch : Varolan branch'ları listeler. Yeni branch oluşturmanızı sağlar. ·git merge : Branch'ları birleştirmeyi sağlar. ·git reset : İstenilen versiyona dönmeyi sağlar. ·git log : Geçmiş commitleri gösterir. ·git cherry-pick : Bir branch'daki commit i başka bir branch'a kopyalamanızı sağlar. Daha pek çok komut'un olduğu bir sistemdir GIT. Komutların fazlalığı sizi korkutmasın, kısa sürede alışıyorsunuz. GIT Kurulumu Linux Kurulumu için : apt-get install git komutu ile kurulumu kolayca yapabilirsiniz. Mac Kurulumu için : http://code.google.com/p/git-osx-installer adresinden installer ı indirip kurabilirsiniz. Config Ayarları Basit bir şekilde konsol yardımı ile email ve name bilgilerini set ediyoruz. git config –global user.name <isim> git config –global user.email <email> --global komutunu kullandığınızda bu işlemi bir kez yapmanız yeterlidir. Farklı projelerde bu bilgileri değiştirmek isterseniz proje dizininde –global özelliğini kullanmadan işlemi yapmanız yeterli. Ayarlarınız gözden geçirmek isterseniz git config --list komutunu çalıştırın. Windows Kurulumu için : http://msysgit.github.io/ adresinden dosyayı indirip kurabilirsiniz.

fil.php-tr.com

Bazı Popüler GIT Servisleri ⦁https://github.com/ Free plan ‘da sınırsız sayıda public repo oluşturabilirsiniz. Ancak private repo için ücret ödemeniz gerekiyor ⦁https://bitbucket.org/ Favorilerimden bitbucket’da ise sınırsız olarak private ve public repo oluşturabiliyorsunuz. Kaynaklar http://git-scm.com/doc http://en.wikipedia.org/wiki/Git_(software) http://ibrahimgunduz.net/yar-yaban-ellere-git-mis/

https://github.com/okanyedibela

19


Musa AVCI @musa_avci www.phpr.org

<?

PDO - PHP Data Objects PDO ile MYSQL'e bağlanmak Genel olarak bağlantı olaylarını bir PDO sınıfını tanımlarken bir DSN yani "Data Source Name" ile belirtiyoruz. Hangi veritabanı sürücüsüne bağlanacağımızı ve bilgilerimizi DSN ile ifade ediyoruz. Diğer iki parametrede ise veritabanı kullanıcı adı ve şifremizi giriyoruz.

$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

Artık "mysql_connect", "mysql_query" fonksiyonlarının müfredattan kalkma zamanı geliyor, P H P'de kendi resmi dökümantasyonunda da bunun sinyalini vermeye başlamış; "mysql" fonksiyonlarının sayfasında aşağıdaki gibi bir öneriyle karşılaşıyoruz; "This extension is not recommended for writing new code. Instead, either the mysqli or PDO_MySQL extension should be used. See also the MySQL API Overview for further help while choosing a MySQL API.” Özetle artık bunları kullanmanızı önermiyoruz, PDO ya da MySQLi'ye geçin diyor. Peki nedir bunlar? adresindeki karşılaştırmaya baktığımızda MySQLi ile PDO arasında çok fark olmadığını görebilirsiniz. PDO'da çoğu veritabanı sürücüsü kullanılmasına olanak sağlayan, MySQLi ise sadece MySQL destekleyen ve PDO'ya göre biraz daha karmaşık ve kapsamlı bir arayüz diyebiliriz. Sonuç olarak ikisi de öneriliyor. Ben burada PDO'dan bahsetmeye çalışacağım, ikisinden birisinin kullanım şeklini kavradığınızda diğerini de rahatlıkla kullanabileceğinize inanıyorum. PDO nedir?

fil.php-tr.com

PDO(PHP Data Objects / PHP Veri Objeleri) özetle; hafif ve tutarlı bir şekilde veritabanına erişimi sağlayan bir arayüz. Adından da anlayacağınız üzerie "Object Oriented Programming" arayüzüne sahip, onlarca veritabanı sürücüsü destekliyor; ·Cubrid ·FreeTDS / Microsoft SQL Server / Sybase ·Firebird/Interbase 6 ·IBM DB2 ·IBM Informix Dynamic Server ·MySQL 3.x/4.x/5.x ·Oracle Call Interface ·ODBC v3 (IBM DB2, unixODBC and win32 ODBC) ·PostgreSQL ·SQLite 3 and SQLite 2 ·Microsoft SQL Server / SQL Azure İleride daha farklı bir veritabanı sürücüsüne geçmek istediğinizde sisteminizi temelli olarak değiştirmek yerine PDO ile kaldığınız yerden bir takım ufak modifikasyonlar ile bu işi gerçekleştirebilirsiniz. Bunların haricinde PDO 5.1'den itibaren geliyor, yani çalışabilmesi için güncel versiyonlara ihtiyacınız olacak.

Diğer sürücülerin DSN ifadeleri için adresine bakabilirsiniz.

$dsn = 'mysql:host=localhost;dbname=test'; $user = 'dbuser'; $password = 'mypassword'; try { $db = new PDO($dsn, $user, $password); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); }

Bu şekilde de bağlantı hatalarını yakalıyoruz. Sorgu hatalarını yönetmek Query ya da exec gibi sorgu gönderdiğimiz metodlar eğer sorguyu gerçekleştirdiklerinde bir hata ile karşılaşırlarsa false dönerler. Başarısız gerçekleşen bu sorguların hata mesajlarına ulaşmak için errorInfo metodunu kullanacağız. Bu metod bize son yaptığımız sorgudaki hatanın kodunu ve mesajını içeren bir array döndürür. 3 adet elemanı bulunan bu dizide 0. ve 1. eleman hata kodlarını, 2. eleman ise hata mesajını verir.

if($users = $db->query('SELECT * FROM users WHERE')) { // Sorgu başarıyla çalışırsa üyeleri listeleriz } else { echo 'Sorguda bir hata meydana geldi.'; $error = $db->errorInfo(); echo 'Hata mesajı: ' . $error[2]; }

Örnekteki sorguda WHERE dedikten sonra herhangi bir koşul belirtmediğimiz için hata verecektir ve ekrana ilgili hatanın mesajı yazacaktır. PDO ile sorgu göndermek Eğer yapacağımız sorgudan bir sonuç almayı beklemiyorsak "exec", bir sonuç isteniyorsa "query" metodlarını kullanmalıyız. Özetle; "DELETE/UPDATE/INSERT" gibi sorgularımız için "exec", "SELECT" gibi sorgularımız için "query".

20


$user = 'dbuser'; $password = 'mypassword';

<?

try { $db = new PDO('mysql:host=localhost;dbname=test', $user, $password); $db->exec('SET NAMES `UTF-8`'); $count = $db->exec('DELETE FROM messages WHERE old = 1'); echo $count . ' messages deleted'; } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); }

Exec metodu sonuç olarak etki ettiği satır sayısını döndürür.

PDO ile bir satır veri çekmek Bunun için query ile sorgumuzu çağırdıktan sonra fetch ile ilk sonucu alacağız.

$dsn = 'mysql:host=localhost;dbname=test'; $user = 'dbuser'; $password = 'mypassword'; try { $db = new PDO($dsn, $user, $password); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); } $row = $db->query('SELECT name FROM users WHERE id = 1')->fetch(); echo $row['name'];

Değişkenleri sorgulara dahil etmek PDO'nun en önemli özelliklerinden birisi olan binding yöntemi sayesinde hazırladığımız sorgulara değişkenlerimizi güvenli ve düzgün bir şekilde yerleştirebiliyoruz. Bunun için önce prepare metodu ile sorgumuzu hazırlayıp dışarıdan değerler vereceğimiz yerlere "?" (soru işareti) yerleştiriyoruz. Sonrasında hazırladığımızı sorguya execute metodu ile soru işareti olan yerlere gelecek değerlerimizi gönderiyoruz. // Sorgumuzu hazırlıyoruz $query = $db->prepare('INSERT INTO users (name, email) VALUES(?, ?)'); // Sorguda belirttiğimiz yerlere gelecek değerleri veriyoruz $query->execute(array('Musa', 'email@email.com));

Bu ifadeyi çalıştırdığımızda çalıştırılacak sorgu aşağıdaki gibi olacaktır;

INSERT INTO users (name, email) VALUES('Musa', 'email@email.com')

PDO kullanırken tüm dışarıdan aldığımız değişkenleri sorgularımıza bu yöntem ile dahil etmemiz uygulamamızın güvenliği ve düzeni açısından çok önemlidir. Bu yöntem sayesinde SQL injection açıklarından da arınmış oluyoruz.

if($db->exec('INSERT INTO users (name) VALUES ("Musa")')) { $id = $db->lastInsertId(); echo 'Yeni eklenen üyenin IDsi: ' . $id; } else { echo 'Yeni kayıt eklerken bir hata meydana geldi.'; }

Sorguları geri alabilme

PDO ile verileri listelemek Bunun için yukarıda bahsettiğim query metodunu kullanacağız.

PDO'nun bir diğer önemli özelliği ise transaction denilen ifade edilen sorguları istenildiğinde geri alabilme ya da uygulayabilmesidir.

$dsn = 'mysql:host=localhost;dbname=test'; $user = 'dbuser'; $password = 'mypassword';

Yukarıdaki sorgu ifadelerini kullanmadan önce beginTransaction metodunu çağırarak geri alma işlemi yapabileceğimiz sorguları yazmaya başladığımızı ifade etmemiz gerekiyor.

try { $db = new PDO($dsn, $user, $password); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); }

fil.php-tr.com

Yeni bir kayıt eklemek Yeni bir kayıt eklemek için exec metodunu kullanacağız. Sonrasında eğer eklediğimiz satırın ID'sini almak istiyorsak lastInsertId metodunu çağıracağız. Eklerken bir sorun gerçekleşirse exec metodu false dönecektir. Bu nedenle öncelikle eklenip eklenmediği kontrol edip sonrasında ID'yi ekrana yazdırabiliriz.

$q = $db->query('SELECT * FROM users'); foreach($q as $row) { echo $row['name'] . '<br/>'; }

BeginTransaction metodunu çalıştırdıktan sonra yazacağımız tüm ekleme, düzenleme ve silme sorguları normal kullandığımız şekilde çalışmaya devam eder. Eğer sorgular devam ederken tüm bu aralıktaki sorguları geri almak istersek rollBack metodunu çağırırız. Bu metodu çalıştırdığımızda beginTransaction'dan rollBack metoduna kadar yazdığımız tüm ekleme, düzenleme ve silme sorguları geri alınır. Bu ifadeleri kullanırken bilmeniz gereken önemli bir konu; DROP TABLE ya da CREATE TABLE gibi tabloları komple silen ya da yeni tablolar ekleyen sorgular geri alınamaz. Fakat DELETE sorgusu ile sildiğiniz ya da UPDATE ile düzenlediğiniz her sorguyu geri alabilirsiniz.

21


// İşlemleri başlattığımızı ifade ediyoruz $db->beginTransaction(); $db->exec('INSERT INTO users (name) VALUES ("Ahmet")'); $db->exec('UPDATE users SET name = "Ali"'); $db->exec('DELETE FROM users WHERE name = "Hasan"'); // Yaptığımız sorguları geri aldık $db->rollBack();

<?

Yaptığımız sorguları geri almak yerine başarıyla sonuçlandığında gerçekten uygulamak istiyorsak commit metodunu çağırırız. PDO bağlantısını kapatmak Eski MySQL bağlantısında da olduğu gibi açtığınız bağlantıyı kapatmasanız da PHP otomatik olarak işlem sonunda bağlantıyı keser. Fakat ille de ben kapatacağım diyorsanız "null" tanımlamanız yeterli.

// bağlantıyı açtık $db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);[

FİL Dergisi Hakkında Yayıncı: PHP-TR.com Editör: Ayhan Barış Tasarım: Gökhan Dilman Logo: Emin Zeybek Yazarlar: Fırat Ağdaş, Ceyda Anıl, İbrahim Hızlıoğlu, Caner Gümüş, Duygu Tümer, Berke Ediz Demiralp, Musa Avcı, Okan Yedibela Mobil Uygulamalar: Seyhan Yılmaz, Ahmet Ertekin, Ali Çetin

// bağlantıyı kapattık $db = null;

fil.php-tr.com

Dahası… Ben bu yazıda PDO'nun temel ihtiyaç duyulan ifadelerinden bahsetmeye çalıştım. Fakat bununla yetinmeyip PDO hakkında daha fazla bilgi edinmek için http://www.php.net/manual/tr/book.pdo.php adresindeki örnekleri ve açıklamaları inceleyebilirsiniz.

22


Filler T端rkiye'yi Geziyor!

fil.php-tr.com

<?

23


24



26


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.