int配列をList<Integer>に変換

package test;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Test {

    public static void main(String[] args) {
        int arr[] = {0,1,2,3,4,5,6,7,8,9};
        List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());

        System.out.println("array: " + Arrays.toString(arr));
        System.out.println("list : " + list.toString());
    }

// array: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
// list : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}

Symfony2のMasterSlaveConnection設定

更新系クエリはmaster、参照系はslaveへと自動振り分けさせる為、doctrineのソースに入っているMasterSlaveConnectionを利用してみました。

変更前


# config.yml
doctrine:
dbal:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
orm:

変更後


# config.yml
doctrine:
dbal:
default_connection: master
connections:
master:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
wrapper_class: Doctrine\DBAL\Connections\MasterSlaveConnection
slaves:
slave1:
host: "%slave1_database_host%"
port: "%slave1_database_port%"
dbname: "%slave1_database_name%"
user: "%slave1_database_user%"
password: "%slave1_database_password%"
charset: UTF8
slave2:
host: "%slave2_database_host%"
port: "%slave2_database_port%"
dbname: "%slave2_database_name%"
user: "%slave2_database_user%"
password: "%slave2_database_password%"
charset: UTF8

orm:

Profilerで確認したところ、以下のようにmasterの記述しかなく、振り分けられているかは一見わかりません。しかし、DBを直接確認したところ問題なく動作していました。


Queries

Connection master
SELECT t0.id AS id1, t0.name AS ...
SELECT t0.id AS id1, t0.name AS ...

Database Connections

Key Value
master "doctrine.dbal.master_connection"

Symfony 2.4.2
doctrine 2.2

Authorizationヘッダー情報をPHPで取得

apacheのデフォルト状態だとAuthorizationヘッダーを送っても、$_SERVERには入ってこない。

下記の設定を追加する事で環境変数に渡す事ができます。


RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

もしくは
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

なお、apacheに設定しなくとも
apache_request_headers()を使えば値の取得は可能でした。


$headers = apache_request_headers()
var_dump($headers);

DateTimeクラスで指定秒を追加

例)3600秒追加

$date = new \DateTime();
$date->modify('+3600 seconds');
//echo $date->format('Y-m-d H:i:s');

constructでセットしても同様の結果が得られる

$date = new \DateTime('+3600 seconds');
//echo $date->format('Y-m-d H:i:s');

php 5.4

Symfony2でmemcacheセッションを使う設定

config.ymlやservices.ymlなどに以下の設定をします

parameters:
    session_memcache_host: localhost
    session_memcache_port: 11211
    session_memcache_prefix: sess_
    session_memcache_expire: 86400

services:
   session.memcache:
        class: Memcache
        calls:
            - [ addServer, [ %session_memcache_host%, %session_memcache_port% ]]

    session.handler.memcache:
        class: Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcacheSessionHandler
        arguments: [@session.memcache, { prefix: %session_memcache_prefix%, expiretime: %session_memcache_expire% }]

これでOK。
以下コマンドでデータが入ったか確認できます

 $ memcached-tool localhost:11211 dump

前提として以下の環境です。

 $ rpm -qa | grep memcache
memcached-1.4.15-1.el6.x86_64
php-pecl-memcache-3.0.8-2.el6.ateam.x86_64

php-pecl-memcachedもあるそうですが自分はmemcacheなのでMemcachedではなくMemcacheを指定しています。

ポート別に複数memcached起動

あらかじめインストール済みのmemcached関連ファイルをコピーして修正する事で可能になります
/etc/sysconfig/memcached
/etc/init.d/memcached
/usr/bin/memcached

例)11212ポートで開くmemcachedを追加

cd /etc/sysconfig
cp memcached memcached.11212

vim memcached.11212
// PORT="11212"に変更
cd /usr/bin
cp memcached memcached.11212

こちらはまったく同じでOK
※ちなみにプログラムがないと起動時に以下のエラーが出力されます
"Distributed memory caching (memcached.11212) を起動中: /bin/bash: memcached.11212: コマンドが見つかりません"
cd /etc/init.d/memcached
cp memcached memcached.11212

vim memcached.11212
// PORT、SYSCONFIG、progを修正。あわせてコメントも修正
 $ diff memcached memcached.11212
10,11c10,11
< # processname: memcached
< # config: /etc/sysconfig/memcached
---
> # processname: memcached.11212
> # config: /etc/sysconfig/memcached.11212
17c17
< PORT="11211"
---
> PORT="11212"
22c22
< SYSCONFIG="/etc/sysconfig/memcached"
---
> SYSCONFIG="/etc/sysconfig/memcached.11212"
28c28
< prog="memcached"
---
> prog="memcached.11212"

以上で起動できるようになります

# /etc/init.d/memcached.11212 start
Distributed memory caching (memcached.11212) を起動中:     [  OK  ]

プロセスも確認できました

# ps aux | grep mem
nobody    2226  0.0  0.0 352304   688 ?        Ssl  Feb10   2:09 memcached -d -p 11211 -u nobody -c 1024 -m 64
nobody   26883  0.0  0.0 340012   940 ?        Ssl  12:25   0:00 memcached.11212 -d -p 11212 -u nobody -c 1024 -m 64
root     26961  0.0  0.0 107460   884 pts/1    S+   12:25   0:00 grep mem

テーブル構成だけを別DBにコピーする

テスト用DB作成など、DBのテーブル構成だけを別DBにコピーしたいとき。
mysqldumpに--no-dataをつけると構成のみダンプされる

例)adminユーザにて、dbnameをdbname_testにコピー


// あらかじめDBは作成しておく
mysql > create database dbname_test;

$ mysqldump -u admin dbname --no-data | mysql -u admin dbname_test;