Zend framework 2.0.0 Stable yayinlandi.

Zend frameworkun bir süredir betası üzerinde çalıştığı Zend Framework 2.0.0 ‘ın dün gece (05.09.2012) saat 22.00 de stable versiyonunun yayınlandığı bildirildi.

Paket ve kurulum bilgilerine buradan erişebilirsiniz : http://framework.zend.com/downloads/latest

Zend Framework’ün 1.00 versiyonu 2007 Temmuzunda yayınlanmıştı. 5 yıldan fazla. O zamandan beri eklemeler yapılmaya devam edildi, ve şu an 2.0.0 yayınlandı.

Zend Frameworkte  Neler Yeni?

  • ModuleManager : modül bazlı işlemleri inanılmaz kolaylaştırır.
  • ServiceManager : iyi olmasına rağmen test konusunda kabus olan Bootstrap ve Zend_Controller_Front yerine geliştirildi.
  • Zend\Di (Dependency Injection) : Cesur hissediyorsanız, ServiceManager yerine kullanabileceğiniz bir  katman.
  • EventManager : Event (Olay) bazlı geliştirmeleri hayli kolaylaştıracak bir katman olacağı kesin.

Bir çok değişiklik mevcut aslında. Bunları da http://framework.zend.com/changelog/2.0.0 adresinden bakabilirsiniz.

Betası üzerinde yapılan zend framework 2 performans testlerini , stable sürüm için de yapılmasını bekleyene kadar (şu an bunu yapacak vaktim yok çünkü) bu konuda yorum yapmayacağım.

Ayrıca http://framework.zend.com/ tasarımını da günümüze daha yatkın bir şekilde değiştirmişler, beğendim 🙂

 

PHP Web Service – SOAP

Merhaba,

Size PHP ile web service (SOAP) hizmetinden bahsedeceğim. Web service bir haberleşme standardıdır. Standart bir yapı olması nedeniyle projelerinizde kullanmış olduğunuz yazılım dillerinden bağımsız olarak düşünmeniz gerekecektir. Projeler aynı dille yazılmış olmaksızın veri alışverişi sağlayabilirsiniz. Kapsamlı projelerde ihtiyaç olarak doğan veri alışverişini sağlayabileceğiniz güzel bir altyapıyı PHP ile örnekleyerek anlatmaya çalışacağım. Sözü fazla uzatmadan örneklemelerime başlamak istiyorum.

Aşağıdaki iki sayfayı çalışma ortamınızda oluşturmanızı isteyeceğim.

  1. server.php
  2. client.php

Server.php web service bağlantısı açarken, client.php bu hizmetten yararlanarak veri transferini gerçekleştirecektir. Ben local çalışma ortamıma www.project.mil hayali domain ile bağlandığım için örnekte de bu adresi verdim. Siz kendi çalışma ortamınıza göre düzenlemeler yapabilirsiniz.

<?php
class MyWebService{

const STATIC_EXAMPLE_MESSAGE = "hello web service";

public function getMessage(){
return self::STATIC_EXAMPLE_MESSAGE;
}
}

$server = new SoapServer(null,array("uri" => "http://www.project.mil/server.php"));
$server->setClass("MyWebService");
$server->handle();
?>

Yukarıda ki örnekte MyWebService isimli class‘ı web service de kullanılacak olan class olarak atadım. Yani client olarak bağlanan kullanıcılar “public” özelliğe sahip tüm methodları çağırabilirler. Bu arada web service altyapısı için illaki class kullanmak zorunda değilsiniz. Ancak ben class kullanmayı tercih ettim.

Hizmete erişilecek olan adresi uri parametresi ile belirliyoruz ve class ismini atıyoruz.

Bkz : http://php.net/soapserver

Yukarıda ki aşamaları tamamladıysak artık dışarıdan gelen misafirleri karşılayabilir ve veri alışverişi sağlayabiliriz.

<?php
$options = array(
"uri" => "http://www.project.mil",
"location" => "http://www.project.mil/server.php"
);
$client = new SoapClient(null, $options);
$result = $client->getMessage();
echo $result;
?>

Yukarıda ki örnekte az evvel oluşturduğumuz web service hizmetine bağlandık ve getMessage methoduna bağlanarak oradan dönen sonucu ekrana yazdırdık. Kodu çalıştırdığınızda ekrana “hello web service” yazdığını göreceksiniz.

Görüldüğü üzere basit bir web service bağlantısı oluşturmuş olduk. Çeşitli hata ayıklama işlemleri, güvenlik işlemleri v.s. gibi çalışmalarla güçlendirerek projelerimizde ki veri alışverişi ihtiyacını gidermiş olabiliriz. Umarım faydalı olmuştur.

PHP interface

Merhaba,

Bugün PHP interface yapısından bahsetmek istiyorum. Bilindiği üzere interface Türkçe “arayüz” anlamına gelmektedir. Ancak, burada görsel birşeyler düşünmeyelim. Yapı yani modelleme arayüzü olarak düşünebiliriz. Birden fazla adaptorü olacak bir yapımızın olduğunu düşünelim. Örnek vermek gerekirse, bir veritabanı altyapısı hazırlıyorsunuz ve mysql, oracle gibi birden fazla adaptorünüz var. Bu adaptörlerdeki yapıların birbiri ile aynı olmasını istiyorsak burada interface devreye girecek. Bir projede birden fazla geliştiricinin olması gibi durumlarda standart bir yapının korunmasını sağlamış olacağız. Yapı dışında birşey yapılmak istenirse hata alınacaktır.

Yapıdaki genel kuram bu şekilde. Şimdi kodlarla açıklamaya çalışacağım.

<?php
interface database{
   public function setData($data);
   public function getData($key);
}
?>

Yukarıda ki örnekte “database” isimli bir interface oluşturduk ve bu interface  kullanan tüm class larda “setData” ve “getData” methodlarının olmasının şart olduğunu söylemiş olduk. Burada methodlar süslü parantez açılarak tanımlanmaz. Sadece method ismi yazılır ve kapatılır.

Yine en önemli özelliklerinden biri de methodlara gönderilecek parametreleri dahi burada belirleyebiliyor olmamız. Eğer class içinde eksik parametre tanımlarsak hata vererek bizi bu yapıya uygun kod yazdırmaya zorlayacaktır.

?php
class mysql implements database{
    public function setData($data){
       // ilgili işlemler burada yapılır.
    }
    public function getData($key){
       // ilgili işlemler burada yapılır.
    }
    public function example1(){
       // başka methodlara ihtiyaç duyuyorsak ekleyebiliriz.
    }
}
class oracle implements database{
    public function setData($data){
       // ilgili işlemler burada yapılır.
    }
    public function getData($key){
       // ilgili işlemler burada yapılır.
    }
    public function example2(){
       // başka methodlara ihtiyaç duyuyorsak ekleyebiliriz.
    }
}
?>

Yukarıda ki örnekte oluşturduğum mysql ve oracle classlarının interface olarak “database” arayüzünü kullanmasını sağladım. Hata almamak için interface içinde belirtilen methodları tanımladım ve tüm sınıflarım standart bir yapıya kavuşmuş oldu. Yine örnekte görüldüğü üzere, interface kullanmak için “implements” yazdıktan sonra interface adını yazmamız gerekiyor.

Umarım faydalı olmuştur. Geliştirerek kendi projelerinizde de kullanabilirsiniz.

child pid … exit signal Segmentation fault (11) – cpanel – centos

Centos 5.5 içinde cpanel yüklü sistemde child pid … exit signal Segmentation fault (11)hatası almaktaydım. Her yerde memory’nin yetmediğini belirten , diskin tutarsız olduğunu felan söyleyen yazılar gördüm.

Bu hatayı , apache nin error loglarından görebiliyordum, son kademe log olarak burada yakalayabildim. Ancak bir detay vermiyordu.

Php 5.2 sistem, mysql 5.1 kullanıyorum.

Daha sonra hatayı tespit etmek için tüm veritabanını local bilgisayarıma aktardım, ve aynı hatayı almaya çalıştığımda, windows ortamında , (php5.3, mysql 5.5) bana “Maximum function nesting level of ‘100’ reached” diye bir hata verdi. Yani diyor ki, “içiçe 100den fazla derinliğe kadar indin, sınıra ulaştın”. Anladığım kadarıyla, php5.2 de bunu handle edebilecek bir mekanizma yok. Hatanın sebebi , sınıf içinde recursive olarak kendi sınıfından üreten bir metodun es kaza yanlış çalışması durumu vardı. Şöyle :

class X{
    function load(){
        //...bişeyler bişeyler...
        $this->load();
    }
}

Nitekim, koddan bu tarz bir döngü oluşturabilecek durumun önüne geçtim, ve hata düzeldi.

 

aptana studio php otomatik tamamlama (aptana studio php autocomplete)

Öncelikle, henüz yapmadıysanız, Ubuntu’da Aptana Studio kurulumu için buraya göz atabilirsiniz.

Aptana Studio’da yeni bir proje ile çalışırken, sadece projeyi eklemek yeterli olmuyor. Ek olarak bir ayar daha yapmak gerekmekte.

Eklediğimiz projeya sağ tıklıyoruz ve açılan menüden en altta bulunan Properties‘a geliyoruz. Açılan pencerede sol menüde Project Natures kısmına geliyoruz. Burada PHP’nin yanına bir tik koyuyoruz.

Artık autocomplete özelliğimiz açık 🙂

İyi çalışmalar!