cakephp3 – DB設定時のTime Zoneエラー

Windows10でXampp使ってcakephp3を動かすとき、DB設定のtimezoneをAsia/Tokyoにすると下記エラーがでた。
General error: 1298 Unknown or incorrect time zone: ‘Asia/Tokyo’

対処法は、ここのとおりやったらできた。

ここから、timezone_2017a_posix_sql.zipをダウンロード・展開して、出てきたsqlファイルをどこかに置く。

そして、下記のようにやる。
$ cd /d/xampp/mysql/bin
$ ./mysql -u root mysql -p < /e/timezone_posix.sql

cakephp2 – database.phpの情報でmysqlのpdoで接続する

cakephp2で、database.phpの情報でmysqlのpdoで接続する方法。

下記で、database.phpで設定している内容を取得できる。

include_once APP.'Config'.DS.'database.php';
if(class_exists('DATABASE_CONFIG'))
{
    $this->db_config = new DATABASE_CONFIG();
}

下記で、dbに接続できる。

private function connect_db()
{
    try
    {
        $this->pdo = new PDO('mysql:host='.$this->db_config->default['host'].';dbname='.
                             $this->db_config->default['database'].';charset=utf8',
                             $this->db_config->default['login'], $this->db_config->default['password']);
    }
    catch(PDOException $e)
    {
        exit('データベース接続失敗。'.$e->getMessage());
    }
}

下記で、データベースに存在するテーブルをすべて削除できる。

private function drop_tables()
{
    try
    {
        $stmt = $this->pdo->query('SHOW TABLES');
        $tables = $stmt->fetchAll();
        foreach($tables as $tbl)
        {
            $this->pdo->exec('drop table if exists '.$tbl[0]);
        }
    }
    catch(PDOException $e)
    {
        exit('テーブル削除失敗。'.$e->getMessage());
    }
}

下記で、データベースにsqlをインポートできる。

private function import_sql()
{
    $sql = $this->get_sql();
    try
    {
        return $this->pdo->exec($sql);
    }
    catch(PDOException $e)
    {
        exit('sqlインポート失敗。'.$e->getMessage());
    }
}
private function get_sql()
{
    try
    {
        return file_get_contents($this->sql_path);
    }
    catch(Exception $e)
    {
        exit('sqlファイル取得失敗。'.$e->getMessage());
    }
}

Mac El Capitan – MySQLインストール・設定

Macの状態

  • El Capitan 10.11.5です。
  • brewはインストール済みです。

MySQLインストール

$ brew install mysql
==> Downloading https://homebrew.bintray.com/bottles/mysql-5.7.12.el_capitan.bottle.tar.gz
Already downloaded: /Library/Caches/Homebrew/mysql-5.7.12.el_capitan.bottle.tar.gz
==> Pouring mysql-5.7.12.el_capitan.bottle.tar.gz
==> /usr/local/Cellar/mysql/5.7.12/bin/mysqld --initialize-insecure --user=hoge --basedir=/usr
==> Caveats
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

To connect run:
    mysql -uroot

To have launchd start mysql now and restart at login:
  brew services start mysql
Or, if you don't want/need a background service you can just run:
  mysql.server start
==> Summary
🍺  /usr/local/Cellar/mysql/5.7.12: 13,281 files, 444.8M

MySQL起動

$ mysql.server start
Starting MySQL
. SUCCESS! 

MySQL起動時のエラー

$ mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/air.local.pid).

macを再起動したらなおった。mysqlを再インストールしてもなおらなかった。

MySQLの初期設定

rootパスワードの強度設定、新パスワード作成、アクセス制限などをする。全部yとしておく。

$ mysql_secure_installation

MySQLを使ってみる

$ mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.12 Homebrew

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

phpMyAdminをインストール

phpMyAdminをダウンロードする

https://www.phpmyadmin.net/downloads/から、phpMyAdmin-4.6.2-all-languages.zipをダウンロードして、解凍する。

配置・設定

$ sudo cp -rp phpMyAdmin-4.6.2-all-languages /Library/WebServer/Documents/phpMyAdmin
$ cd /Library/WebServer/Documents/phpMyAdmin
$ sudo mv config.sample.inc.php config.inc.php

ブラウザで見てみる

http://localhost/phpmyadmin/

———————
追伸:
phpMyAdminもbrewでインストールできた。

brewでphpMyAdminをインストール

参考:https://blog.frd.mn/install-nginx-php-fpm-mysql-and-phpmyadmin-on-os-x-mavericks-using-homebrew/

$ brew install autoconf
$ echo 'PHP_AUTOCONF="'$(which autoconf)'"' >> ~/.bash_profile && . ~/.bash_profile
$ brew install phpmyadmin

〜
中略
〜

Webserver configuration example (add this at the end of
your /etc/apache2/httpd.conf for instance) :
  Alias /phpmyadmin /usr/local/share/phpmyadmin
  <Directory /usr/local/share/phpmyadmin/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    <IfModule mod_authz_core.c>
      Require all granted
    </IfModule>
    <IfModule !mod_authz_core.c>
      Order allow,deny
      Allow from all
    </IfModule>
  </Directory>
Then, open http://localhost/phpmyadmin

More documentation : file:///usr/local/Cellar/phpmyadmin/4.6.1/share/phpmyadmin/doc/

Configuration has been copied to /usr/local/etc/phpmyadmin.config.inc.php
Don't forget to:
  - change your secret blowfish
  - uncomment the configuration lines (pma, pmapass ...)

==> Summary
🍺  /usr/local/Cellar/phpmyadmin/4.6.1: 2,255 files, 63.1M, built in 14 seconds

Nginxの設定(例)

$ vim /usr/local/etc/nginx/nginx.conf

下記を最後に加える

server {
    listen 8080;
    server_name local.com;
    root /usr/local/share/phpmyadmin/;
    index index.php;
    
    location ~ \.php$ {
        include /usr/local/etc/nginx/fastcgi_params;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

cloud9でcakephp3・MySQLを使う

cloud9プロジェクトの作成

cloud9でPHPを選択してプロジェクトを作ります。

MySQLの起動

$ mysql-ctl start
Installing MySQL
 * Stopping MySQL database server mysqld
   ...done.
 * Starting MySQL database server mysqld
   ...done.
 * Checking for tables which need an upgrade, are corrupt or were 
not closed cleanly.

MySQL 5.5 database added.  Please make note of these credentials:

       Root User: hgoe
   Database Name: hoge

 * Starting MySQL database server mysqld
   ...done.

phpMyAdminのインストール

$ phpmyadmin-ctl install
Starting installation
Starting MySQL
 * Starting MySQL database server mysqld
   ...done.
Configuring database
Starting apache
 * Restarting web server apache2
   ...done.
PHPMyAdmin Installation complete. You can log in at: https://hoge-hoge.c9users.io/phpmyadmin with the following username (and blank password):

       Username: hoge

上記URLにアクセスしたらphpMyAdminが表示される。初期ではusernameと、パスワード空で入れる。root以外のユーザを作成したりする。

composerのインストール

$ curl -sS https://getcomposer.org/installer | php
Downloading 1.1.1...

Composer successfully installed to: /home/ubuntu/workspace/composer.phar
Use it: php composer.phar
Some settings on your machine may cause stability issues with Composer.
If you encounter issues, try to change the following:

The xdebug extension is loaded, this can slow down Composer a little.
Disabling it when using Composer is recommended.

composerを移動する

$ sudo mv composer.phar /usr/local/bin/composer

cakeプロジェクトの作成

$ composer create-project cakephp/app caketest
You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug

Installing cakephp/app (3.2.6)
  - Installing cakephp/app (3.2.6)
    Downloading: 100%         

Created project in caketest
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing aura/installer-default (1.0.0)
    Downloading: 100%         

  - Installing cakephp/plugin-installer (0.0.15)
    Downloading: 100%         

  - Installing psr/log (1.0.0)
    Downloading: 100%         

  - Installing mobiledetect/mobiledetectlib (2.8.22)
    Downloading: 100%         

  - Installing aura/intl (1.1.1)
    Downloading: 100%         

  - Installing cakephp/chronos (0.4.9)
    Downloading: 100%         

  - Installing cakephp/cakephp (3.2.9)
    Downloading: 100%         

  - Installing symfony/yaml (v3.0.6)
    Downloading: 100%         

  - Installing symfony/filesystem (v3.0.6)
    Downloading: 100%         

  - Installing symfony/config (v3.0.6)
    Downloading: 100%         

  - Installing symfony/polyfill-mbstring (v1.2.0)
    Downloading: 100%         

  - Installing symfony/console (v3.0.6)
    Downloading: 100%         

  - Installing robmorgan/phinx (v0.5.3)
    Downloading: 100%         

  - Installing cakephp/migrations (1.6.1)
    Downloading: 100%         

  - Installing jakub-onderka/php-console-color (0.1)
    Downloading: 100%         

  - Installing jakub-onderka/php-console-highlighter (v0.3.2)
    Downloading: 100%         

  - Installing dnoegel/php-xdg-base-dir (0.1)
    Downloading: 100%         

  - Installing nikic/php-parser (v2.1.0)
    Downloading: 100%         

  - Installing symfony/var-dumper (v3.0.6)
    Downloading: 100%         

  - Installing psy/psysh (v0.7.2)
    Downloading: 100%         

  - Installing jdorn/sql-formatter (v1.2.17)
    Downloading: 100%         

  - Installing cakephp/debug_kit (3.2.8)
    Downloading: 100%         

  - Installing cakephp/bake (1.2.4)
    Downloading: 100%         

cakephp/app suggests installing phpunit/phpunit (Allows automated tests to be run without system-wide install.)
cakephp/app suggests installing cakephp/cakephp-codesniffer (Allows to check the code against the coding standards used in CakePHP.)
symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing symfony/process ()
symfony/var-dumper suggests installing ext-symfony_debug ()
psy/psysh suggests installing ext-pdo-sqlite (The doc command requires SQLite to work.)
cakephp/debug_kit suggests installing ext-sqlite (DebugKit needs to store panel data in a database. SQLite is simple and easy to use.)
Writing lock file
Generating autoload files
> Cake\Composer\Installer\PluginInstaller::postAutoloadDump
> App\Console\Installer::postInstall
Created `config/app.php` file
Set Folder Permissions ? (Default to Y) [Y,n]? Permissions set on /home/ubuntu/workspace/caketest/tmp/cache
Permissions set on /home/ubuntu/workspace/caketest/tmp/cache/models
Permissions set on /home/ubuntu/workspace/caketest/tmp/cache/persistent
Permissions set on /home/ubuntu/workspace/caketest/tmp/cache/views
Permissions set on /home/ubuntu/workspace/caketest/tmp/sessions
Permissions set on /home/ubuntu/workspace/caketest/tmp/tests
Permissions set on /home/ubuntu/workspace/caketest/tmp
Permissions set on /home/ubuntu/workspace/caketest/logs
Updated Security.salt value in config/app.php

プレビューを見る

cloud9のメニューのPreviewからプレビューを開く。database.phpの設定がまだだが、とりあえず初期画面が表示される。

cake3

database.phpの設定

config/app.phpの229行目に下記があるので、修正する。

'username' => 'hoge',
'password' => 'hoge',
'database' => 'hoge',
'encoding' => 'utf8',
'timezone' => 'UTC',
'flags' => [],
'cacheMetadata' => true,
'log' => false,

RDSからEC2のmysqlに移す

RDSは便利ですが、高かったです。

EC2のMySQLのバックアップ

RDS運用の前はEC2のMySQLで運用していたので、古いですが現状のEC2のMySQLを一応バックアップしておきます。

$ sudo mysqldump --databases hogehoge --single-transaction --order-by-primary -r backup.sql -u root -p

EC2のMySQLのデータベースを空にする

$mysql -u root -p
mysql> use hogehoge;
mysql> show tables;
mysql> truncate table hoges;

RDSからEC2のMySQLにインポートする

$ sudo mysqldump -u <RDS_user_name> -p<RDS_password> --port=3306 --host=hostname --single-transaction --compress --order-by-primary -v --databases hogehoge  | mysql -u <local_user> -p<local_password>

ローカルのMySQLからAmazonRDSに移管する

EC2を使っていて、EC2のサーバに直接MySQLのDBを入れている状態から、AmazonRDSに移管します。自動でバックアップとかしてくれるので便利だからです。

Amazon RDSのインスタンスを作成する

まず、RDSのインスタンスを作成します。https://aws.amazon.com/jp/rds/getting-started/インスタンスを作る時に、データベースのID、パスワード、データベース名等を登録しました。エンジンはAurora 5.6.10aというやつです。

Amazon Aurora は、MySQL と互換性のあるリレーショナルデータベースエンジンで、高性能の商業用データベースの可用性およびスピードと、オープンソースデータベースのコスト効率性および簡素性を併せ持っています。Amazon Aurora は、MySQL の 5 倍の性能を持ち、同様の機能や可用性を提供している商用データベースの 10 分の 1 の価格です。

RDSにも、セキュリティグループがあります。このセキュリティグループの設定を変更して、EC2からアクセスできるようにします。

EC2のMySQLのデータを取り出す

sudo mysqldump --databases <database_name> --single-transaction 
--order-by-primary -r backup.sql -u <local_user> -p

RDSにデータをインポートする

参考:MySQL DB または MariaDB DB から Amazon RDS MySQL または MariaDB DB インスタンスへのデータのインポート

上記によると、下記コマンドで、取り出してインポートするが一緒にできるらしい。

sudo mysqldump -u <local_user> --databases world --single-transaction --compress --order-by-primary  -p<local_password> | mysql -u <RDS_user_name> --port=3306 --host=hostname -p<RDS_password>

できた。便利だ。

あとは、アプリケーションのデータベースの設定を変更すれば完了します。

mysqldump – 特定テーブルの構造のみダンプ

参考:4.9.7. mysqldump(テーブル構造とデータのダンプ)

mysqldump [OPTIONS] database [tables]

特定テーブルの構造のみダンプしたいんじゃ。

mysqldump -u root -p -d hoges > hoges.sql 

これでいいのじゃ。-dを使うと構造だけダンプしてくれるのじゃ。

復元は下記のようにする。

mysql -u root -p database < hoges.sql

capistrano3でcakephpのmigrations pluginを実行させる

cookpadの人がridgepoleというのを作られまして、これはべきとうせいが保証されているらしい。ちなみにべきとうせいという読み方は間違っているかもしれない。漢字が変換で出てこない。どうもテーブル一覧つくってそれを更新するだけでいいっぽくて、その一覧をみながらないやつを足したり、いらないやつを削除したりしてくれるっぽい。migrations pluginみたいに、ここではaテーブルを追加し、次はbテーブルを削除しつつ、cテーブルを追加する、とかだと、もうaテーブルが既に存在する時点で終了になったりするのですごく便利な気がする。

といいつつ、今回はmigrations pluginをcapistranoで実行させます。サブモジュールがデプロイできない。下記の真似したらできた。自分は拡張子が.capで大丈夫だった。確かに拡張しはCapfileに書いてあった。

capistrano3 + git で submodule も一緒にデプロイしたい場合

上記にて、migrations pluginを展開した後に、下記を実行すればいい。

execute "#{fetch :deploy_to}html/app/Console/cake Migrations.migration run all"

mysql 大きいサイズのsqlを分割してインポートする

大きいsqlをインポートするのら、php.iniで最大サイズを変更すればできるといえばできる。ローカル環境とかなら。でもインポート中にエラーとかでると結局sql直したりしなきゃいけない。今回は100テーブルあって全部で30MBくらいのsqlなので、テーブル毎に分割してインポートする。

csplit dump.sql /DROP\ TABLE\ IF\ EXISTS/ -f db {*}

db00〜db99までのファイルができた。db00は最初の方のファイルの説明みたいな文章が入ってるだけなので、実際使うのはdb01〜db99までの99ファイル。99回インポートを手動するのはめんどくさい。。シェルスクリプトを作ってみる。

#!/bin/sh
i=1
pass='hogehoge'

while [ $i -ne 100 ]
do
    no=$i
    if test ${i} -lt 10 ; then
        no="0${i}"
    fi
    echo $no
    eval /Applications/XAMPP/xamppfiles/bin/mysql -u root -p$pass  hogedb < db$no
    i=`expr $i + 1`
done

これでできた。

EC2 phpmyadminが動かない

APCとmemcachedを入れたことが原因だった。

当初でていたエラーはこれ。

Undefined property: PMA_Error::$hash in /usr/share/phpMyAdmin/libraries/Error.class.php on l     ine 169

Notice:  Undefined property: PMA_Error::$isDisplayed in /usr/share/phpMyAdmin/libraries/Message.class     .php on line 724

Notice:  Undefined property: PMA_Error::$params in /usr/share/phpMyAdmin/libraries/Message.class.php      on line 538

Fatal error:  Class 'PMA_Message' not found in /usr/share/phpMyAdmin/libraries/Message.class.php on l     ine 649

これはセッションが変なときに出るやつらしい。PHPMyAdmin Error: Class ‘PMA_Message’ not foundここにエラーのことが書いてある。セッション書き込み権限がない的なことが書いてある。

通常、php.iniのsession.save_pathに設定されているディレクトリにsessionが書き込まれるので、そこの権限がapacheになってないといけない。chown root:apache ディレクトリ、chmod 660 ディレクトリみたいになっているか確認する必要がある。自分の場合はそうなっていたが、APCをインストールしたらこのエラーがでるらしい。下記によって、phpmyadmin内ではapcを無効にするとエラーがでなくなった。

vim /etc/httpd/conf.d/phpMyAdmin.conf

<Directory /usr/share/phpMyAdmin/>
   php_admin_value apc.enabled 0
</Directory>

参考:Running phpMyAdmin with APC cache enabled, fatal PHP errors

これで当初のエラーがなくなったが、下記のようなセッション関連のエラーが出続けてなんでかなと思ったら、memcachedを入れたときに、/etc/php.d/memcache.iniに、session.save_path=”tcp://localhost:11211″と書いていた。だから、php.iniのsession.save_pathは無効になってる状態だった。。

Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly. Also ensure that cookies are enabled in your browser.

memcachedを使いつつ、phpmyadminを正常に動かす方法もあるのかもしれないけど、下記でmemcachedをphpmyadminだけで無効にする方法が書いてあった。

Phpmyadmin doesn’t work if session.save_handler set to memcache

You might have to change this lines in phpmyadmin folder ‘libraries/session.inc.php’:
Try include this line at the top of the file: ini_set(‘session.save_path’, “/tmp/”);
Uncomment this line (about 74): ini_set(‘session.save_handler’, ‘files’);

ソースコードいじるっていうのはかなり微妙だし、やってるのはini_setだけなので、/etc/httpd/conf.d/phpMyAdmin.confを下記のようにてみた。

<Directory /usr/share/phpMyAdmin/>
   php_admin_value apc.enabled 0
   php_value session.save_path /tmp/session
</Directory>

これでできた。長かった。。

ちなみに、config.inc.phpの場所は、色んなブログに、/usr/share/phpMyAdmin/config.inc.phpと書いてあったので、ないないと思ってたら、/etc/phpMyAdmin/config.inc.phpにあった。

AmazonLinuxで割と新しい版のphpmyadminをインストールするには、下記でやるとよかった。

yum install --enablerepo=remi,epel,ius phpMyAdmin

Vagrant CentOS6.5 phpMyAdminを使う

phpmyadmin使えるようにしよう。めんどくさいし。

$ yum --enablerepo=epel install -y  phpMyAdmin php-mysql php-mcrypt

apache再起動したけど、入れない。
スクリーンショット 2014-02-28 3.25.07

client denied by server configuration: /usr/share/phpMyAdmin

というエラーがでている。
phpMyAdmin.confの設定で誰でもOKにしてみる。

vim phpMyAdmin.conf
sudo /etc/rc.d/init.d/httpd restart

おお入れた。

mysqlコマンド

$ mysql -p -u root
show databases;
create database hoge;
use hoge;
source import.sql;
show tables;
select name,value from hoges limit 10;
select * from hoges where name=’hoge’;
update hoges set value=’hogehoge’ where name=’hoge’;

show columns from hoges;
select * from hoges order by name desc limit 3;
select name,value from hoges where name in(‘hoge’,’hogeo’,’hogeko’);

//インポート
mysql -u root -p DB名 < dump.sql //エクスポート mysqldump -u root -p DB名 > dump.sql

//テーブル空にする
TRUNCATE TABLE table_name;

//ユーザーの作成
CREATE USER user IDENTIFIED BY ‘password’;

MySQL – 文字コードの確認・設定関連のコマンド

MySQLの文字コードに関する設定を確認するコマンド

show variables like "chara%";

データベースの文字コード変換コマンド

alter database hogehoge character set utf8;

テーブルの文字コードをチェックするコマンド

show create table hogehoges;

テーブルの文字コード変換コマンド

alter table hogehoges charset=UTF8;