Skip to content

August 16, 2011

2

PHP ile MySQL HandlerSocket ‘e Bağlanmak

php connect handlersocket

Merhaba arkadaşlar, bu yazımızda PHP ile MySQL HandlerSocket ‘e bağlanmayı ve kullanmayı deneyeceğiz.

Yazıya başlamadan önce MySQL HandlerSocket ile alakalı MySQL HandlerSocket tanıtımıMySQL HandlerSocket kurulumu ve PHP için MySQL HandlerSocket Client Kurulumu yazılarını incelemek isteyebilirsiniz.

HandlerSocket Sınıfını Yakından Tanıyalım

HandlerSocket sınıfı PHP-Handlersocket paketiyle gelmektedir. Bu paketin kurulumunu yukarıda linki bulunan “PHP için MySQL HandlerSocket Client Kurulumu” yazısında yapmıştık. Şimdi PHP ‘nin get_class_methods fonksiyonu ile HandlerSocket sınıfının metodlarına bakalım.

<?php

// HandlerSocket sınıfının tüm metodlarını getir
$methods = get_class_methods("HandlerSocket");

echo "<pre>";
print_r($methods);
echo "</pre>";
?>

Yukarıdaki kodun çıktısı:

Array
(
    [0] => __construct
    [1] => __destruct
    [2] => openIndex
    [3] => executeSingle
    [4] => executeMulti
    [5] => executeUpdate
    [6] => executeDelete
    [7] => executeInsert
    [8] => getError
    [9] => executeFind
)

Ayrıca PHP-Handlersocket sayfasında bulunan HandlerSocket metod imzalarını incelemek isteyebilirsiniz.

HandlerSocket sınıfının metod imzaları:

HandlerSocket {
    /* Constants */
    const HandlerSocket::PRIMARY;

    /* Methods */
    __construct  ( string $host, string $port [, array $options ])
    public bool openIndex ( int $id, string $db, string $table, string $index, string $fields )
    public mixed executeSingle ( int $id, string $op, array $fields [, int $limit, int $skip, strint $modop, array $values, array $filters, int $invalues_key, array $invalues ] )
    public mixed executeMulti ( array $requests )
    public mixed executeUpdate ( int $id, string $op, array $fields, array $values [, int $limit, int $skip, array $filters, int $invalues_key, array $invalues] ] )
    public mixed executeDelete ( int $id, string $op, array $fields [, int $limit, int $skip, array $filters, int $invalues_key, array $invalues] ] )
    public mixed executeInsert ( int $id, array $values )
    public string getError ( void )
}

Test Verilerinin Oluşturulması

Sonraki HandlerSocket yazılarımızda da kullanacağımız veritabanı tablomuzu aşağıdaki komutla oluşturabilirsiniz. Biraz fazla detaylı bulabilirsiniz ancak birlikte indeksli alanlara değineceğimizden member tablosu buna güzel bir örnek oluşturacağını düşündük.

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

SHOW WARNINGS;
SHOW WARNINGS;
CREATE SCHEMA IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
SHOW WARNINGS;
USE `test` ;

-- -----------------------------------------------------
-- Table `test`.`mem`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `test`.`mem` ;

SHOW WARNINGS;
CREATE  TABLE IF NOT EXISTS `test`.`mem` (
  `mem_id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'member id' ,
  `mem_name` VARCHAR(45) NULL COMMENT 'member name' ,
  `mem_last_name` VARCHAR(60) NULL COMMENT 'member last name' ,
  `mem_email` VARCHAR(90) NULL COMMENT 'member email address' ,
  `mem_username` CHAR(16) NOT NULL COMMENT 'member username' ,
  `mem_password` CHAR(40) NOT NULL COMMENT 'member password' ,
  `mem_type` ENUM('USER', 'MOD', 'ADMIN') NOT NULL DEFAULT 'USER' COMMENT 'member type' ,
  `mem_activation_key` VARCHAR(45) NULL DEFAULT NULL COMMENT 'member activation key' ,
  `mem_reset_key` VARCHAR(45) NULL DEFAULT NULL COMMENT 'member reset password key' ,
  `mem_last_login` DATETIME NULL DEFAULT NULL COMMENT 'member last login time' ,
  `mem_status` ENUM('ACTIVE', 'DEACTIVE', 'WAITING') NOT NULL DEFAULT 'WAITING' COMMENT 'member status' ,
  `mem_reg_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'member register time' ,
  PRIMARY KEY (`mem_id`) )
ENGINE = InnoDB
COMMENT = 'Member (staff) informations';

SHOW WARNINGS;
CREATE UNIQUE INDEX `mem_email_ukey` ON `test`.`mem` (`mem_email` ASC) ;

SHOW WARNINGS;
CREATE UNIQUE INDEX `mem_username_ukey` ON `test`.`mem` (`mem_username` ASC) ;

SHOW WARNINGS;
CREATE INDEX `mem_status_idx` ON `test`.`mem` (`mem_status` ASC) ;

SHOW WARNINGS;
CREATE INDEX `mem_type_idx` ON `test`.`mem` (`mem_type` ASC) ;

SHOW WARNINGS;
CREATE INDEX `mem_username_password_idx` ON `test`.`mem` (`mem_username` ASC, `mem_password` ASC) ;

SHOW WARNINGS;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

-- -----------------------------------------------------
-- Data for table `test`.`mem`
-- -----------------------------------------------------
SET AUTOCOMMIT=0;
USE `test`;
INSERT INTO `test`.`mem` (`mem_id`, `mem_name`, `mem_last_name`, `mem_email`, `mem_username`, `mem_password`, `mem_type`, `mem_activation_key`, `mem_reset_key`, `mem_last_login`, `mem_status`, `mem_reg_time`) VALUES
(NULL, 'Mustafa', 'KIRIMLI', '[email protected]', 'kirimlimustafa', SHA1('rootTest@1'), 'USER', 'a9e56bb2f8ea7a719ec7b07ebb21f3bd', NULL, NULL, 'WAITING', NOW());

COMMIT;

PHP-HandlerSocket Kullanımı

HandlerSocket sınıfı ile MySQL HandlerSocket ‘e bağlanmak için sınıf yapılandırıcısına (__construct) sunucu adres ve portunu verdikten sonra openIndex metodunu kullanmamız gerekiyor. Öncelikle basit bir kod yazıp sonrasında bu örnek üzerinden anlatım ve incelemeye devam edelim.

<?php
// Karakter setini utf-8 yap
header('Content-type: text/html; charset=utf-8');

$host    = '127.0.0.1';
$port_rd = 9998;
$port_wr = 9999;
$dbname  = 'test';
$table   = 'mem';

// HandlerSocket nesnesi olustur (HandlerSocket 'e bağlanır)
$hs = new HandlerSocket($host, $port_rd);

// Tablo indeksini ac, hata varsa ekrana bas ve betigi durdur
if (!($hs->openIndex(1, $dbname, $table, 'PRIMARY', 'mem_name,mem_last_name,mem_username,mem_email'))) {
    echo 'Index açılamadı! ' . $hs->getError() . PHP_EOL;
    die();
}

// Tablodan veri oku. Id 'si 1 olan satiri getir
$retval = $hs->executeSingle(1, '=', array("1"), 1, 0);

// Veriyi ekrana bas
echo '<pre>';
print_r($retval);
echo '</pre>';
?>

Yukarıdaki Betiğin Çıktısı

Array
(
    [0] => Array
        (
            [0] => Mustafa
            [1] => KIRIMLI
            [2] => kirimlimustafa
            [3] => [email protected]
        )

)

HandlerSocket ‘in openIndex metoduna bağlantı id ‘si gibi kullanılan int tipinde ilk parametre, ikinci parametre olarak veritabanı adı, üçüncü parametre tablo adı, dördüncü parametrede tablodaki indeksin adı (sütun adı değil) ve beşinci parametre olarak seçmek istediğiniz sütun adları (SQL de SELECT ile sütun seçmek gibi).

openIndex ‘in üretebileceği hatalar 2:idxnum gibi bir formatla geliyor. Mesela bu hata indeks adı yanlış yazıldığında dönüyor. İlgilenenler ve C++ bilenler için MySQL HandlerSocket plugininin kaynak kodlarında hata mesajını grep (wiki:en) yaparak bulduğumuz bu dosya işe yarayabilir.

HandlerSocket executeSingle Metodu Hakkında

Ayrıca dikkat edilmesi gereken başka bir konu executeSingle metodundan dönen sonuç dizisidir. Dönen kayıt sayısına bağlı olarak boyutu değişen dizi içerisinde seçtiğiniz sütun adları yerine sütun sıra idleri ile (openIndex metodunda yazılan sıra ile) dönen değerler mevcut. Bu özellik PHP ‘nin mysql_fetch_row fonksiyonuna çok benziyor.

Sonuç

executeSingle ve diğer metodların kullanımı ve SQL ile performans karşılaştırmalarına sonraki yazılarımızda değineceğiz.

Ayrıca yazımız sırasında kullandığımız dosyaları buradan indirebilirsiniz.

İyi Çalışmalar.

Toplam 2 Yorum Yorum Yaz
  1. NUh
    Oct 16 2012

    Elinize sağlık farklı bir konuya değinmişsiniz.

    Reply
  2. Cüneyt
    Mar 24 2016

    yıl 2016 olmuş biz sizin yazınızı daha yeni okuyoruz. öncelikle güzel yazı teşekkürler.
    sormak istediğim handlersocket kullanmamız için mysql tablomuzdaki her şey index oluşturmamız mı gerekiyor.
    şayet böyle ise buradan hız sağlarken insert yada update işlemlerinde indexlerle alakalı hız bağlaında problem yaşar mıyız.
    bu konuyla alakalı bir diğer sorum ise mysql tablomuz table lock takıldı
    lock olan tablodan handlersocket ile veri alabilirmiyiz
    umarım vakit ayırıp soruma cevap verebilirsiniz.

    Reply

Sizin fikriniz nedir? Lütfen aşağıdaki formu kullanarak yorum yapın.

(gerekli)
(gerekli)