İçeriğe atla

Aylık arşivler: Ocak 2018

bcmath Hatası

Eğer kullandıgnız fonksiyonda bcmath hatası verirse
eğer cpanel kullanıyorsanız easy apache den bcmath diye aratırıp yükletebilirsiniz.

Ubuntu:
sudo apt install php7.0-bcmath

Worked great on CentOS

yum install bcmath

Sonrasında apache yi resetleyin

Consolda PHP Çalıştırma

rabbitmq için dinleyici dosyanız php ise sürekli olarak konsolda php dosyasının çalışmasını isteyebilirsiniz bunu yapmanız için aşagıdaki kodu yazmanız gerekmektedir.

nohup php dinleyici.php &

şeklinde yazabilirsiniz. ssh pencerenizi kapatsanız dahi arkaplanda çalışmaya devam eder.

ps aux

yazarak sonraki zamanlarda bakabilirsiniz

Symfony RabbitMqBundle

Symfony de RabbitMQ Servsine php-amqplib kütüphanesi ile bağlantısını anlatacağım.

Rabbit bundle da Thumperin php-amqlib kütüphanesini kullanıyoruz.

Örnek:

$msg = array('user_id' => 1235, 'image_path' => '/path/to/new/pic.png');
$this->get('old_sound_rabbit_mq.upload_picture_producer')->publish(serialize($msg));

50 tane mesaj istegi oldugunda aşagıdaki komutu çalıştırın.

$ ./app/console rabbitmq:consumer -m 50 upload_picture

RabbitMq server kurulumunuzu yaptıktan sonra bundle kuruyoruz.
Kurulum
Composer ile kurun:

$ composer require php-amqplib/rabbitmq-bundle

Bunldle Kayıt edin:
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        new OldSound\RabbitMqBundle\OldSoundRabbitMqBundle(),
    );
}

Kurulum bitti şimdi ayarlarını yapmakta.

Composer da kalması gereken: (Lütfen silmeyin)

{
    "require": {
        "php-amqplib/rabbitmq-bundle": "~1.6",
    }
}

extension ve compiler ekleyin:

use OldSound\RabbitMqBundle\DependencyInjection\OldSoundRabbitMqExtension;
use OldSound\RabbitMqBundle\DependencyInjection\Compiler\RegisterPartsPass;

// ...

$containerBuilder->registerExtension(new OldSoundRabbitMqExtension());
$containerBuilder->addCompilerPass(new RegisterPartsPass());

Kullanım:

Confirasyon dosyanıza ekleyin:

old_sound_rabbit_mq:
    connections:
        default:
            host:     'localhost'
            port:     5672
            user:     'guest'
            password: 'guest'
            vhost:    '/'
            lazy:     false
            connection_timeout: 3
            read_write_timeout: 3

            # requires php-amqplib v2.4.1+ and PHP5.4+
            keepalive: false

            # requires php-amqplib v2.4.1+
            heartbeat: 0

            #requires php_sockets.dll
            use_socket: true # default false
        another:
            # A different (unused) connection defined by an URL. One can omit all parts,
            # except the scheme (amqp:). If both segment in the URL and a key value (see above)
            # are given the value from the URL takes precedence.
            # See https://www.rabbitmq.com/uri-spec.html on how to encode values.
            url: 'amqp://guest:password@localhost:5672/vhost?lazy=1&connection_timeout=6'
    producers:
        upload_picture:
            connection:       default
            exchange_options: {name: 'upload-picture', type: direct}
            service_alias:    my_app_service # no alias by default
    consumers:
        upload_picture:
            connection:       default
            exchange_options: {name: 'upload-picture', type: direct}
            queue_options:    {name: 'upload-picture'}
            callback:         upload_picture_service

old_sound_rabbit_mq.upload_picture_producerve old_sound_rabbit_mq.upload_picture_consumer. sonra kullanılmak üzere beklemede olan servisler. bu servisleri upload_picture_service ile cagırabilirsiniz.

İsteğe Bağlı Kuyruk İşlemleri:

queue_options: {name: 'upload-picture', arguments: {'x-ha-policy': ['S', 'all']}}

20 saniyelik TTL mesajı örnegi

queue_options: {name: 'upload-picture', arguments: {'x-message-ttl': ['I', 20000]}}

Değişken Türleri:

    S – String
    I – Integer
    D – Decimal
    T – Timestamps
    F – Table
    A – Array

arguments isteğinize göre düzenleyebilirsiniz.

Belirli koşullara göre yaptırmak isterseniz:

queue_options:
    name: "upload-picture"
    routing_keys:
      - 'android.#.upload'
      - 'iphone.upload'

Önemli Uyarı:
2.3 üstü için geçerlidir bu yazılar eski versiyonlarda çalışmaz.

RabbitMQ server bağlantı ayarları:

connections:
    default:
        host:     'localhost'
        port:     5672
        user:     'guest'
        password: 'guest'
        vhost:    'foo' # to be dynamically overridden by <code>connection_parameters_provider</code>
        connection_parameters_provider: connection_parameters_provider_service

Örnek Uygulama:

class ConnectionParametersProviderService implements ConnectionParametersProvider {
    ...
    public function getConnectionParameters() {
        return array('vhost' => $this->getVhost());
    }
    ...
}

Producers, Consumers, Nedir?

Producers:
Gönderme sürecinde yapılan işlemlere denir.

Consumers:
Gönderilen verileri alıp işleyen birime denir.

Yüklenen resmi arkaplanda işlem yaptırmak istediğinizi varsayarsak:

public function indexAction($name)
{
    $msg = array('user_id' => 1235, 'image_path' => '/path/to/new/pic.png');
    $this->get('old_sound_rabbit_mq.upload_picture_producer')->publish(serialize($msg));
}

Producers burada upload_picture

Servis burada old_sound_rabbit_mq.upload_picture_producer

setContentType ve setDeliveryMode yöntemlerini kullanabilirsiniz.

$this->get('old_sound_rabbit_mq.upload_picture_producer')->setContentType('application/json');

OldSound\RabbitMqBundle\RabbitMq\Producer dan miras alarak aşagıdaki classı kullanabilirsiniz.

 ...
    producers:
        upload_picture:
            class: My\Custom\Producer
            connection: default
            exchange_options: {name: 'upload-picture', type: direct}
    ...

Bundan sonraki işlemlde artık Consumers kısmına geçtik.
Burada iletilere göre işlemlere başlayacaktır.

consumers:
    upload_picture:
        connection:       default
        exchange_options: {name: 'upload-picture', type: direct}
        queue_options:    {name: 'upload-picture'}
        callback:         upload_picture_service

Görüldügü gibi callback bölümü mevcuttur işlemler bittiginde callback ile dönüş yapacaktır.

customer çalıştıgına emin olabilmeniz için aşagıdaki kodu çalıştırabilirsiniz:

$ ./app/console rabbitmq:consumer -m 50 upload_picture
$ ./app/console rabbitmq:consumer -w upload_picture

Bu işlemleri yapabilmeniz için PCNTL kütüphanesine ihtiyacınız vardır.

256 MB bellek sınırı vermek için:

$ ./app/console rabbitmq: consumer -l 256

Sıraya alınan bütün iletileri simek için

$ ./app/console rabbitmq: tasfiye - no-confirmation upload_picture

Tüketici kuyrugunu silmek için:

$ ./app/console rabbitmq: delete --no-onayı upload_picture

Mysql Master – Slave Replication Yapımı

Mysql Master – Slave Replication Yapımı

Bu Dökümanda kullanılacak sunucu ip adresleri:

Ana (Master) Database : 12.34.56.789
İkinci (Slave) Database : 12.23.34.456

Kurulum:
Bu işlem eğer mysql server ve client bulunmuyorsa işlem yapmanız gerekmektedir.

sudo apt-get install mysql-server mysql-client

Adım 1: Ana Databasenini yapılandırma

Ana sunucuda mysql yapılandırma dosyasını açın.

sudo nano /etc/mysql/my.cnf

İp adresi değişimi yapmamaız gerekiyor.

bulun:

bind-address            = 127.0.0.1

Değiştirin:

bind-address            = 12.34.56.789 

(Sunucu ip adresinizi yazacaksınız)

Sonrasında sunucu numaralarınızı yazmanız gereklidir. 1. master olana 1 verelim.

server-id               = 1

başında açıklama satırını olup olmadıgına dikkat ediniz.

Aşagıdaki kodu aktifleştirin. Başındaki yorum satırını kaldırınız. Slave database baglantı loglarını tutacak.

log_bin                 = /var/log/mysql/mysql-bin.log

Bundan sonraki aşamaada hangi veritabanını replica yapacagınızı belirtiyoruz.

binlog_do_db            = yeniveritabani

Sonrasında mysql resetleyin.

sudo service mysql restart

Mysql e root yetkisi ile erişim yapın.

mysql -u root -p

Slave makine için bilgilerini yazmanız gerekmektedir. Kendinize göre bilgileri doldurun.

GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';

sonrasında

FLUSH PRIVILEGES;

kodunu yazınız.

Sonrasında yeni bir ssh penceresi acıp veritabanına baglanın ve aşagıdaki kod ile o veritabanını kullanmaya başlayın.

USE newdatabase;

Sonrasında okumayı engellemek için kilitleyin.

FLUSH TABLES WITH READ LOCK;

hemen sonrasında

SHOW MASTER STATUS;

Aşagıdakine benzer bir kod alacaksınız.

mysql> SHOW MASTER STATUS;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000001 | 107 | newdatabase | |
+——————+———-+————–+——————+
1 row in set (0.00 sec)

Yukarıdaki bilgileri kayıt edin. İlerleyen süreçte gerekecek.

Eğer bu pencerede işlem yaparseniz okuma kilidini kaldıracaktır. Bu yüzden yeni bir pencerede ssh baglanın.

Eğer kilid kapalı ise aşagıdaki kod ile mysql yedeginizi alın.

mysqldump -u root -p --opt newdatabase > newdatabase.sql

Şimdi bir önceki ssh pencerenizi acın ve veritabanının okuma iznini acın.

UNLOCK TABLES;
EXIT;

diyerek çıkın.

Slave serverinize gecin ve veri tabanınızı yükleyin.

mysql -u root -p newdatabase < /path/to/newdatabase.sql

Sonrasında my.cnf den 2. database sunucusu oldugunu belirtelim.

sudo nano /etc/mysql/my.cnf

bir öncekinde server-id degerini 1 yapmıştık bunu 2 yapalım. Lütfen sıra numaralarını dikkatli yapın.

server-id               = 2

Aşagıdaki kodları bulup düzenleyin.

relay-log               = /var/log/mysql/mysql-relay-bin.log
log_bin                 = /var/log/mysql/mysql-bin.log
binlog_do_db            = newdatabase

kayıt ettikten sonra mysql serverinizi resetleyin

sudo service mysql restart

Mysqle giriş yapıp aşagıdaki kodları yazın. Unutmadan ip adreslerini kendinize göre düzenleyin.

CHANGE MASTER TO MASTER_HOST='12.34.56.789',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=  107;

Üstteki kod ile bu sunucun master sunucunun slave sunucusu oldugunu belirtmiş oluruz. Sonrasında slave server başlatmamız gerekiyor.

START SLAVE;

Durum Kontrol için:

SHOW SLAVE STATUS\G

Eğer sıkıntılı bir durum olursa.

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START; 

kodunu çalıştırabilirsiniz.