fİl:php ve teknolojİ

27
FİL:PHP ve Teknoloji fil.php-tr.com Eylül 2013 Sayı 1 (Ücretsizdir) Composer Fırat AĞDAŞ Yeni Nesil CV'ler Ceyda ANIL PHP ile MongoDB Kullanımı İbrahim HIZLIOĞLU 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

Upload: ayhan-baris

Post on 08-Mar-2016

236 views

Category:

Documents


3 download

DESCRIPTION

FİL:PHP ve TEKNOLOJİ DERGİSİ http://fil.php-tr.com

TRANSCRIPT

Page 1: FİL:PHP ve TEKNOLOJİ

FİL:PHP ve Teknoloji

fil.php-tr.com

Eylül 2013Sayı 1

(Ücretsizdir)

Composer Fırat AĞDAŞ

Yeni Nesil CV'lerCeyda ANIL

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

Sphinx Search ile Hızlı Arama SistemiCaner GÜMÜŞ

PHP Uzmanları Hakkında İnfografik

Arama Motoru OptimizasyonuDuygu TÜMER

PHP 5.5 ile Gelen YeniliklerBerke Ediz DEMİRALP

PDO - PHP Data ObjectsMusa AVCI

GIT Versiyon Kontrol SistemiOkan YEDİBELA

Page 2: FİL:PHP ve TEKNOLOJİ

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

Page 3: FİL:PHP ve TEKNOLOJİ

fil.

ph

p-t

r.co

m

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 adresinde yayınlanacak olan şu anda ilk sayısını http://fil.php-tr.comokuduğ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

[email protected]

http://www.php-tr.comhttp://forum.php-tr.com

2

<?

groups/tr.developers

@php_tr #phptr

Page 4: FİL:PHP ve TEKNOLOJİ

Fırat AĞDAŞ[email protected]

Triodor Software

ÖnsözComposer 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 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.

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

3

Composer

mkdir composer-rockscd composer-rocks/

fil.

ph

p-t

r.co

m

<?

Şimdi composer ‘ı yükleyebiliriz.

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

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

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

Composer için kütüphaneleri “composer.json” dosyasında belirtiyoruz.

Web projemde kullanacağımız kütüphaneler:

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

Page 5: FİL:PHP ve TEKNOLOJİ

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.

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/twig-bridge kullanacağız.

composer.json ‘ımızın son hali.

4

fil.

ph

p-t

r.co

m

Şimdi composer ‘ı yükleyebiliriz.

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

<?php

use Silex\Provider\TwigServiceProvider;use Silex\Provider\UrlGeneratorServiceProvider;use Symfony\Component\HttpFoundation\Request;

// composer autoloadrequire_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') );

return $app['twig']->render('index.html.twig', $viewParams);

})->bind('hello-world-route');

// calistir$app->run();

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.

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

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

php composer.phar install

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

public/index.php

<?

Page 6: FİL:PHP ve TEKNOLOJİ

public/.htaccess

5

fil.

ph

p-t

r.co

m

php composer.phar update

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

RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^ index.php [QSA,L]

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

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

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

template/index.html.twig

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

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

</body></html>

Şimdi URL ‘yi ziyaret edelim.

http://localhost/composer-rocks/public/hello-world/composer

<?phpnamespace ComposerRocks;

class VersionHelper{ const VERSION = '1.0.0';}

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

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.

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

Bir başka yöntemle de ekleyebiliriz.

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

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’] }}

<?

Page 7: FİL:PHP ve TEKNOLOJİ

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

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

6

fil.

ph

p-t

r.co

m

git clone https://github.com/php-tr/composer-rocks.git

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

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

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

<?php

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

// composer autoloadrequire_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 );

return $app['twig']->render('index.html.twig', $viewParams);

})->bind('hello-world-route');

// calistir$app->run();

composer.phar compoer.lockvendor/

Composer ‘ı dizine kuralım.

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

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

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

</body></html>

İşte son hali!

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

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

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

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

php composer.phar install

<?

Page 8: FİL:PHP ve TEKNOLOJİ

Ceyda ANIL

www.ceydaanil.com

7

Yeni Nesil CV’lerE-nerjik

fil.

ph

p-t

r.co

m

<?

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.

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

Kaynak: http://kootation.com/

Page 9: FİL:PHP ve TEKNOLOJİ

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

8

fil.

ph

p-t

r.co

m

Kaynak: http://kootation.com

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

<?

Page 10: FİL:PHP ve TEKNOLOJİ

İbrahim HIZLIOĞLU

www.ibrahimhizlioglu.com

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.

9

PHP ile MongoDB Kullanımı

extension=php_mongo.dll

Rabarba PHP Developer

fil.

ph

p-t

r.co

m

<?

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 phpinfo(); ?>

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.

ADMIN UI (YÖNETİM ARAYÜZÜ)MySQL kullandığım projelerde veritabanı yönetimi için eğer 3306 p o r t u n d a n r e m o t e m y s q l y e t k i m v a r s a N a v i c a t ( http://www.navicat.com/ ) isimli yazılımı kullanıyorum. Navicat ile My S Q L , S Q L Server , S Q L ite , Orac le ve Postgre S 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ı

<?phptry { // 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()); } ?>

PHP MongoDB Sürücüsü KuralımMongoDB 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.4-vc9-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

MONGODB BAĞLANTISI KURMAKMongo D B sürücümüzü P H P ’ye tan ı tarak ku l lanmaya 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.

Page 11: FİL:PHP ve TEKNOLOJİ

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

10

fil.

ph

p-t

r.co

m

MONGODB İLE KAYITLARI LİSTELEMECollection’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;

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

?>

<?php// Üyeler İsimli Collection'ı Seçelim $uyeler = new MongoCollection($db, 'uyeler'); // Toplam Üye Sayısını Ekrana Basalımprintf('<p>Toplam Uye : %s</p>',$uyeler->count()); // Tüm uyeleri cekelim. $uyeListesi = $uyeler->find(); // Çektiğimiz kayıtları listeleyelim. foreach($uyeListesi as $uye) { printf('Nick : %s | Web : %s <br>', $uye['nick'], $uye['web']); } ?>

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;

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

$mongo = new MongoClient('mongodb://user:[email protected]:27017');

db.createCollection('uyeler');

show collections

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

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

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

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)

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

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

<?php// Üye bilgilerini tanımlıyorum $yeniUye = array( 'nick' => 'ibrahimhizlioglu', 'web' => 'www.ibrahimhizlioglu.com' ); try { $uyeler->insert($yeniUye); } catch(MongoCursorException $e){ die('Yeni uye eklenirken teknik bir sorun olustu! > ' . $e->getMessage()); } ?>

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

<?php// Güncelleyeceğim kaydın koşulunu belirliyorum $where = array('nick' => 'ibrahimhizlioglu'); // Güncellenecek alanını belirliyorum$yeniBilgi = array('nick' => 'ibo'); // Kaydı değiştiyorum$uyeler->update($where, $yeniBilgi); ?>

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

<?php// Sileceğim kaydın koşullarını belirliyorum $where = array('nick' => 'ibrahimhizlioglu'); // Kaydı collection içerisinden siliyorum$uyeler->remove($where); ?>

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/c lass .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. :)

<?

Page 12: FİL:PHP ve TEKNOLOJİ

Caner GÜMÜŞ

[email protected]

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

11

Sphinx Search ile Hızlı Arama Sistemi

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

Bilgi Teknolojileri Direktörü

fil.

ph

p-t

r.co

m

<?

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:

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

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

sql_attr_uint = Population}

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 n d e k s l e m e m i z g e r e k i r . T e s t v e r i s i o l a r a k 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:

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 l isteleyecektir . L ibstemmer 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.

$ cp -r libstemmer_c/. sphinx-2.0.8-release/libstemmer_c

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

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

Page 13: FİL:PHP ve TEKNOLOJİ

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.

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:

fil.

ph

p-t

r.co

m

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

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}

Şimdi de sunucuyu çalıştıralım:

Sphinx 2.0.8Copyright (c) 2001-2013, Andrew AksyonoffCopyright (c) 2008-2013, Sphinx Technologies Inc (http://sphinxsearch.com)

using config file 'sphinx.conf'...indexing index 'city'...collected 4079 docs, 0.0 MBsorted 0.0 Mhits, 100.0% donetotal 4079 docs, 47486 bytestotal 0.023 sec, 2016133 bytes/sec, 173183.88 docs/sectotal 4 reads, 0.000 sec, 46.4 kb/call avg, 0.0 msec/call avgtotal 11 writes, 0.000 sec, 28.0 kb/call avg, 0.0 msec/call avg

$ bin/searchd

Ş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

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

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

Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

İ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 i le alt çizgi, çizgi ve & i le sınırlandırıyoruz. En küçük kelime uzunluğunu 2 olarak belirtiyoruz.

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

indexer{ mem_limit = 32M}

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}

$ bin/indexer city

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

$ Sphinx 2.0.8Copyright (c) 2001-2013, Andrew AksyonoffCopyright (c) 2008-2013, Sphinx Technologies Inc (http://sphinxsearch.com)

using config file 'sphinx.conf'...listening on all interfaces, port=9312listening on all interfaces, port=9306precaching index 'city' precached 1 index in 0.422 sec

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

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

12

<?

Page 14: FİL:PHP ve TEKNOLOJİ

fil.

ph

p-t

r.co

m

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/

13

<?

linkedin.com/in/canergumus

Page 15: FİL:PHP ve TEKNOLOJİ

fil.

ph

p-t

r.co

m

14

<?

Page 16: FİL:PHP ve TEKNOLOJİ

Duygu TÜ[email protected]

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.

15

Arama Motoru Optimizasyonu

fil.

ph

p-t

r.co

m

<?

Ö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?

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.

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.

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

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ş lemler i yaparken bazı kural lara 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.

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

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

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

Page 17: FİL:PHP ve TEKNOLOJİ

Berke Ediz DEMİ[email protected]

OPcache EklentisiZend 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 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

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.

PHP 5.5 ile Gelen YeniliklerYazılım Geliştirme Yöneticisi Mynet A.Ş.

fil.

ph

p-t

r.co

m

<?OPcache eklentisi nasıl kurulur?

P H P 5.5 sürümünü derlerken - -d isable-a l l 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 --enable-opcache anahtarını kullanmalısınız.

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

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";}

?>

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

Örnek kod:

16

Page 18: FİL:PHP ve TEKNOLOJİ

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

Finally anahtar kelimesi eklenditry-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 destekliyorPHP 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ğiApache 2.4 SAPI işleyicisi artık Windows ortamında da destekleniyor.

empty() artık değişkenler dışındaki değerleri de kabul ediyorPHP 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.

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:

17

fil.

ph

p-t

r.co

m

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

Array değeri çözümlemesi: PHPString değeri çözümlemesi: P

class:: kullanarak class ismi çözümlemesiClassName::class kullanarak bir class’ın tam kalifiye ismine erişmek artık mümkün.

Ö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

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";

?>

<?php

namespace Ornek\Proje;class Deneme { }

echo Deneme::class;echo "\n";

?>

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

Ornek\Proje\Deneme

<?

Page 19: FİL:PHP ve TEKNOLOJİ

Okan [email protected]

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 ?

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)

18

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

fil.

ph

p-t

r.co

m

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

Page 20: FİL:PHP ve TEKNOLOJİ

19

fil.

ph

p-t

r.co

m

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 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 KurulumuLinux 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.g i t c o n f i g – g l o b a l u s e r . n a m e < i s i m > 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.

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.

Kaynaklarhttp://git-scm.com/dochttp://en.wikipedia.org/wiki/Git_(software)http://ibrahimgunduz.net/yar-yaban-ellere-git-mis/

<?

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)

https://github.com/okanyedibela

Page 21: FİL:PHP ve TEKNOLOJİ

Musa AVCI@musa_avci

www.phpr.org

Artık "mysql_connect", "mysql_query" fonksiyonlarının müfredattan kalkma zamanı geliyor, PHP'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?

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.

PDO - PHP Data Objects

fil.

ph

p-t

r.co

m

<? PDO ile MYSQL'e bağlanmakGenel 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);

20

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önetmekQuery 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öndermekEğ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".

Page 22: FİL:PHP ve TEKNOLOJİ

21

fil.

ph

p-t

r.co

m

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

$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();}

$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();}

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

$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'];

<?

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

Değişkenleri sorgulara dahil etmekPDO'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 protected]));

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 protected]')

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.

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

Yeni bir kayıt eklemekYeni 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.

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'nun bir diğer önemli özelliği ise transaction denilen ifade e d i l e n s o r g u l a r ı i s t e n i l d i ğ i n d e g e r i a l a b i l m e y a d a uygulayabilmesidir.

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.

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.

Page 23: FİL:PHP ve TEKNOLOJİ

22

fil.

ph

p-t

r.co

m

// İş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ı kapatmakEski 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);[ // bağlantıyı kapattık$db = null;

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.

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

Page 24: FİL:PHP ve TEKNOLOJİ

fil.

ph

p-t

r.co

m

<?

Filler Türkiye'yi Geziyor!

23

Page 25: FİL:PHP ve TEKNOLOJİ

24

Page 26: FİL:PHP ve TEKNOLOJİ
Page 27: FİL:PHP ve TEKNOLOJİ

26