« Posts tagged PHP

Noktadomains’e Web Geliştirme Uzmanı Arıyoruz!

Noktadomains ekibinde çalışacak “Web Geliştirme Uzmanı” takım arkadaşı arıyoruz.

Genel Nitelikler :

* PHP, MYSQL, HTML, Javascript, CSS konularında deneyimli
* Nesne yönelimli programlama yapabilen
* MVC, Sphinx, Memcache, APC, Ajax, SEO gibi kavramlara hakim
* Java, JSP bilen ya da öğrenmeye hevesli
* İletişim becerisine sahip, sorumluluk alabilen
* Öğrenmeyi ve araştırmayı seven
* Hızlı ve sonuca odaklı çalışabilecek
* Takım çalışmasına yatkın
* İngilizce bilen
* Ankara’da ikamet eden veya edebilecek.
* Üniversite Mezunu

İş Tanımı:

NoktaDomains.com alan adı satış sitemiz ve diğer web tabanlı projelerimizde, yazılım geliştirecek, raporlanan hataları giderecek ve yeni projelerde ihtiyaçları belirleyip, planlayacak, Ankara ofisimizde tam zamanlı olarak görev alabilecek takım arkadaşları arıyoruz.

Başuvuru için:
basvuru@nokta.com

Php Memcache Eklentisi

Php memcache eklentisinin 3.0.x sürümlerini kullanıyorsanız bu sürümlerde bir kaç hata mevcut. En önemlileri 3.0.5 te çözülmüş olan cache silememe problemi[1].

Pecl bug listesinde 3.0.4 sürümü için belirtilen ve 3.0.5 sürümünde düzeltilen cache silme sorunu 3.0.1 sürümünde de yaşanabilmekte. Ayrıca 3.0.2 sürümünde düzeltilen veri boyutları ile ilgili hata[2] mevcut.

Aslına baktığınızda henüz beta seviyesinden çıkmamış 3.0.x sürümünü kullanırken dikkatli olmak gerekiyor. Memcache eklentisi ile ilgili detaylı sürüm notlarına http://pecl.php.net/package-changelog.php?package=memcache adresinden ulaşmanız mümkün.

[1]http://www.pecl.php.net/bugs/bug.php?id=17566&edit=1
[2]http://pecl.php.net/bugs/bug.php?id=14044

Php ile komut satırından parametrik çalışma…

Php ile parametrik cli uygulamaları yazmak çok basit bir işlemdir. Php scriptinize komut satırından parametre girmek için $_SERVER["argv"] parametresi kullanılır.

Örnek olarak:

var_dump($_SERVER["argv"]);

kodu bulunan cli_test.php dosyamızı şu şekilde çalıştırıyoruz:

Bash
$ php cli_test.php parametre1 parametre2 parametre3

Bu işlem sonucunda çıktı olarak:


array(4) {
[0]=>
string(12) "cli_test.php"
[1]=>
string(10) "parametre1"
[2]=>
string(10) "parametre2"
[3]=>
string(10) "parametre3"
}

alırsınız. Buradan anlaşılacağı üzere $_SERVER["argv"] bir dizi olarak işlem görüyo. Dikkat ederseniz dizinin 0. elamanı çalıştırdığımız php scriptinin adı. Yani $_SERVER["argv"] ile aldığımız değerlerin ilki kendi dosyamızın adı oluyor ve işlemlerinizi buna göre yapmanız gerekiyor.

Php ile curl işlemleri…

Curl http, https, ftp, gopher, telnet, dict, file ve ldap protokollerini kullanarak bir sunucuyla iletişime geçmek için kullanılır.
Php ile özellikle api kullanımları için kullanılmaktadır.

Php ile curl kullanmak için php curl eklentisini yüklemeniz gerekmekte.
Debian ve türevi sistemler için (Root olarak):

Bash
apt-get install php5-curl

komutunu çalıştırmanız yeterlidir.

Curl sürecini başlatmak için:

PHP
$baslat = curl_init();

kodunu kullanıyoruz, yapacağımız curl işlemlerinde “$baslat” curl sürecini kullanacağız.

Curl ile bir işlem yapmadan önce bir takım ayarları yapmamız gerekiyor. Bunun için “curl_setopt” fonksiyonunu kullanacağız:

PHP
curl_setopt($baslat, CURLOPT_URL, "istek_yapacagimiz_url");
curl_setopt($ct, CURLOPT_HEADER, 0);

“curl_setopt” fonksiyonu bir çok parametre alabiliyor. Örnekte kullandığımız temel iki parametrenin işlevleri şu şekilde:

curl_setopt($baslat, CURLOPT_URL, “istek_yapacagimiz_url”)

ile istek yapacağımız url bilgisini belirtmiş oluyoruz.

curl_setopt($ct, CURLOPT_HEADER, 0)

ile başlık bilgilerinin gönderilip gönderilmeyeceğini belirleyebiliyoruz, 0 “false”, 1 “true” olarak geçerli oluyor.

Curl işlemini gerçekleştirmek için “curl_exec” fonksiyonunu kullanıyoruz:

PHP
$cikti=curl_exec($baslat);

Eğer curl ile istek gönderdiğimiz url(api) bir geri dönüş yapıyorsa bu geri dönüşü “$cikti” değişkenine atamış oluyoruz. Bu işlemin ardından curl sürecini kapatmak için:

PHP
curl_close($baslat);

fonksiyonunu kullanıyoruz.

Eğer işlemi “get” methodu ile yapıyorsanız url yazdığınız yere ilgili get parametrelerini koyabilirsiniz. Örnek olarak:

PHP
curl_setopt($baslat, CURLOPT_URL, "http://adres.uzanti/api.php?parametre1=deger&parametre2=deger2");

Php curl sınıfı ile ilgili ayrıntılı bilgiyi http://www.php.net/curl adresinden alabilirsiniz.

Php ile Memcache Kullanımı…

Bu yazı içerisinde PHP ile memcache havuzlarına ait bilgileri alan Memcache fonksiyonundan bahsedeceğim.
Örnek olarak kullanacağım memcache ip ve portu şu şekilde:

  • IP: 10.0.0.100
  • Port: 20000

Memcache portları birer havuzu temsil etmekte. Aynı sunucu üzerinde birden fazla port için memcache havuzları oluşturabilirsiniz. Bu havuzdan alacağım bilgiler ise şunlar:

  • Aktif Öğe Sayısı (Currents ıtems)
  • Aktif Bağlantı Sayısı (Current Connections)
  • Port Numarası
  • Süreç Numarası (Pid)

Bu bilgileri almak için Memcache sınıfına ait getStats() fonksiyonunu kullanıyoruz.
Php kodu:

PHP
<?php
$ip="10.0.0.100";
$port=20000;
$memcache = new Memcache;
$memcache->connect($ip,$port);
 
$status=$memcache-&gt;getStats(); // Memcache istatistiklerini bir değişkene atıyoruz (dizi şeklinde alınıyor)
 
#Çıktı kodlarımız
echo "Süreç No:". $status['pid'] ."<br/>";
echo "Öğeler:". $status['curr_items'] ."<br/>";
echo "Bağlantı Sayısı:". $status['curr_connections'] ."<br/>";
echo "Port No:". $port ."<br/>";
 
?>

Bu kodun çıktısı şu şekilde olacaktır (sayısal ifadeler örnek olarak verilmiştir):

Süreç No: 741
Öğeler: 152
Bağlantı Sayısı: 321
Port No: 20000

Mysql karakter seti değiştirme (php script)

Büyük bir veri tabanının karakter setlerini değiştirmeniz gerekebilir. Bende böyle bir ihtiyaç için küçük bir php script yazdım.

Lazım olabilecekler için script indirebilir.

Daha iyi bir yöntem biliyor iseniz dürtmekten çekinmeyiniz…

Centos üzerinde Php Pecl Mailparse eklentisi…

Centos üzerinde pecl mailparse eklentisini (rpm ile) kurup,  ” php -i | grep ‘mailparse’ ” çalıştırdığınız zaman şöyle bir hata ile karşılaşabilirsiniz:

PHP Warning:  PHP Startup: mailparse: Unable to initialize module
Module compiled with module API=20050922, debug=0, thread-safety=0
PHP    compiled with module API=20060613, debug=0, thread-safety=0
These options need to match
in Unknown on line 0
/etc/php.d/z-mailparse.ini,

Eğer böyle bir durum söz konusu ise çözümü için şu komutları çalıştırmanız yeterli olacaktır:

Bash
rpm -e php-pecl-mailparse
pecl install -n mailparse

Bu komutlar ile öncelikle rpm ile kurduğumuz mailparse’ı kaldırıyoruz, daha sonra “no dependency” yani bağımlılıkları yok sayarak mailparse’ı pecl ile kuruyoruz.

Ek bir not, bu işlem sonrası “/etc/php.d/” (php bu dizin altında ki tüm ini dosyalarını otomatik olarak yüklüyor) altında bulunması gereken “z-mailparse.ini” dosyasının “z-mailparse.ini.rpmsave” halini aldığını fark ettim. Bu dosyayı “z-mailparse.ini” haline getirmeniz gerekiyor.

Vpopmail’e gelen mailleri PHP ile okumak

Vpopmail domainlerinize gelen mailleri okumanız için “.qmail-default” veya “.qmail” dosyasında bir script çalıştırabilirsiniz. Bu dosya vpopmail ile oluşturulmuş domain dizini altında bulunmakta. (Örn. “/home/vpopmail/domains/mydomain/” dizini altında..)

.qmail-default dosyası temel olarak şu yapıda olur:

Bash
| /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox

Eğer user@mydomain.com adresini catch all olarak tanımlamak istiyorsanız şu şekilde bir .qmail-default dosyasına ihtiyacınız var (eğer qmailadmin kullanıyorsanız arayüz kullanarak catch all vb işlemleri yapabiliyorsunuz):

Bash
| /home/vpopmail/bin/vdelivermail '' user@mydomain.com

Gelelim kendi hazırladığımız bir scripti nasıl çalıştıracağımıza. Bunun için dosyamıza şöyle bir satır eklememiz gerekiyor.

Bash
| /script/yolu

Bu şekilde bir satır eklediğiniz de, mydomain.com hesaplarına mail geldiğinde scriptiniz çalışacaktır.

Gelelim Php ile gelen mailleri okumaya. Ben gelen mailleri direk alıp bir dosyaya yazdırıyorum:

PHP
// php://stdin girdi parametresi ile girdileri okuyoruz.
$oku = fopen("php://stdin", "r"); 
if(!$oku) // okuma basarisiz mi diye kontrol ettiriyoruz
{
    // basarisiz ise hata yazdiriyoruz.
    file_put_contents('/home/deneme.txt',"###HATA###",FILE_APPEND);
}
$icerik = $oku; // email içeriğini değişkene atıyoruz.
fclose($oku);
 
// İçeriği dosyaya yazdırıyoruz.
file_put_contents('/home/deneme.txt',$icerik,FILE_APPEND);

Artık elimizde tüm mail bilgilerini (header,body vs..) bir dosyaya aktaran php script’imiz mevcut.

Burda dikkat edilmesi gereken hususlar şunlar:

  • Php scriptimiz çalıştırılabilir olmalı.
  • Scriptimizin başında #/usr/bin/php ibaresi olmalı (vpopmail scripti bu parametre ile çalıştırıcak)
  • Deneme.txt dosyamız yazılabilir izinlere sahip olmalı.

Asal Sayılar

Üniversiteden bir arkadaşımla biraz asal sayılar üzerinde çalıştık. “Sadece kendisine ve bir’e bölünebilen sayılar” tanımını bilmemize rağmen gecenin bi yarısında biraz uzunca sürdü (25dk kadar). Tabi birde uzun süredir uğraşmadığım C# ile uğraşınca kod yazılışlarında biraz cebelleştim :) .

Arkadaşımın yazmış olduğu sabit bir sayının asal olup olmadığını kontrol eden kod üzerinde biraz oynama yaparak, klavyeden girilen bir sayıya kadar olan asal sayıların listesini yapan bir kod haline getirdik.

C# Kodu:

C
Console.Write("Bİr sayi giriniz:");
int sayi = Int32.Parse(Console.ReadLine());
int durum=0;
 
for (int i=1;i<=sayi;i++)
{
  for(int j=2;j<i;j++)
  {
    if(i%j ==0)
    {
      durum=1;
    }
  }
  if(durum !=1)
  {
    Console.WriteLine(i);
  }
  durum = 0;
}

Buda PHP kodu:

PHP
$sayi = 20;
for($i=1;$i&lt;=$sayi;$i++)
{
  for($j=2;$j&lt;$i;$j++)
  {
    if(($i%$j)==0)
    {
      $durum = 1;
    }
  }
  if($durum!=1)
  {
    echo $i . " asal
";
  }
  $durum = 0;
}

Not: Gün boyu sql ile uğraşıp daha sonra algoritmaya geçmek insanı sıkıyormuş :)

Netbeans ile bütünleşik geliştirme

Uzun bir süredir IDE olarak Netbeans kullanmaktayım. Özellikle şuan üzerinde çalıştığımız proje kapsamında oldukça işe yarar faydalar sunuyor bize. Yaptığımız değişiklikleri svn sunucusuna göndermek, test için test sunucusuna göndermek oldukça kolay. Özellikle sftp kullanarak test sunucusuna dosyaları göndermek için yaptığınız deiğişikliği kaydetmenizin yeterli olması oldukça hız kazandıran bir özellik. Tabi yerel ağ üzerinde oldukça hızlı, dışarı çıktığınızda biraz yavaşlayabiliyor.

Netbeans sürüm kontrol yazılımlarının bir çoğunu (svn,cvs,mercurial) ön tanımlı olarak desteklemekte. Ek olarak “local history” yani yerel geçmiş tutabiliyor dosyalar üzerinde -ben pek kullanmıyorum bu özelliği-. Bir dosyayı sürüm kontrol sunucusuna göndermek için ilgili dosyaya sağ tıklayıp ilgili menüden (hangi sürüm kontrolünü kullanıyorsanız ona ilişkin menü çıkıyor) işlemleri yapabiliyorsunuz. Küçük bir commit ekranı geliyor ve site yorum yazmanız için izin veriyor. Tabi bu ekran için kısayol atamanız da mümkün.

Tabi bu kadarla sınırlı değil. Eğer hata takip için bugzilla kullanıyorsanız commit ederken hangi hatayı kapattığını girebiliyor, hatta netbeans üzerinden hata girişleri vb işlermlerini yapabiliyorsunuz.

Hatta ve hatta satır satır o dosyaya kim ne zaman değişiklik yapmış görebiliyorsunuz, revizyon numarası tarih ve mesajı ile birlikte.

Özgür Kuru is Stephen Fry proof thanks to caching by WP Super Cache