pg_dumpallで出力されてたEUC_JPのデータベースをUTF-8にしてpsqlを使ってリストアする
環境
$ sw_vers ProductName: macOS ProductVersion: 12.0.1 BuildVersion: 21A559 $ nkf --version Network Kanji Filter Version 2.1.5 (2018-12-15) Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa). Copyright (C) 1996-2018, The nkf Project.
ファイルエンコーディング変更
nkf -E -w --overwrite [pg_dumpallファイル]
EUC_JPをUTF-8に置換
vimなどで
g/EUC-JP/s//UTF-8/gc
リストアする
psql < pg_dumpallファイル
余談
pg_restoreとpsqlとの違いがわからなかったが、pg_restoreはアーカイブファイルからリストアリストで利用するらしい
https://www.postgresql.jp/document/9.2/html/app-pgrestore.html
PHPでログイン時にセッションIDの変更
まずは単純にログインをする
<?php session_start(); echo 'セッションID: ' . session_id() . "\n"; if (!isLogin()) { echo "Start to login\n"; login(); } else { echo "already logged in\n"; } echo 'セッションID: ' . session_id() . "\n"; function login() { $_SESSION['login'] = true; } /** * @return bool */ function isLogin() { return (bool) $_SESSION['login']; }
1回目のアクセス
セッションID: ka0a429ht11vq1ehbkom3fek2n Start to login セッションID: ka0a429ht11vq1ehbkom3fek2n
2回目の以降のアクセス
セッションID: ka0a429ht11vq1ehbkom3fek2n already logged in セッションID: ka0a429ht11vq1ehbkom3fek2n
となり、ログインができるがセッションIDは変更されない
ログイン時にセッションIDを変更する
<?php session_start(); echo 'セッションID: ' . session_id() . "\n"; if (!isLogin()) { echo "Start to login\n"; login(); } else { echo "already logged in\n"; } echo 'セッションID: ' . session_id() . "\n"; function login() { session_regenerate_id(true); $_SESSION['login'] = true; } /** * @return bool */ function isLogin() { return (bool) $_SESSION['login']; }
1回目のアクセス
セッションID: 5ae9gjof2qhdhh7gcduqbpugn8 Start to login セッションID: vul4fl9t26cq0uhpq0it4fq4sh
2回目の以降のアクセス
セッションID: ka0a429ht11vq1ehbkom3fek2n already logged in セッションID: ka0a429ht11vq1ehbkom3fek2n
となり、ログイン前にセッションIDが変更されている
セッションをDBに保存するタイプでログイン時にセッションIDを変更する
セッション保存ようのテーブルを作成する
CREATE TABLE `session_storage` ( `session_id` varchar(255) NOT NULL, `session_data` longtext NOT NULL, `session_time` bigint(20) NOT NULL, PRIMARY KEY (`session_id`) );
<?php define('DB_HOST', 'localhost'); define('DB_NAME', 'test'); define('DB_USER', 'root'); define('DB_PASS', 'password'); class MySessionHandler implements SessionHandlerInterface { /** * @var PDO */ protected $db; /** * @return bool|void */ public function close() { $this->db = null; return true; } /** * @param string $session_id * @return bool */ public function destroy($session_id) { $sql = 'DELETE FROM session_storage WHERE session_id = ?'; $stmt = $this->db->prepare($sql); return $stmt->execute([$session_id]); } /** * @param int $maxlifetime * @return bool */ public function gc($maxlifetime) { $sql = 'DELETE FROM session_storage WHERE session_time < ?'; $stmt = $this->db->prepare($sql); return $stmt->execute([(time() - $maxlifetime)]); } /** * @param string $save_path * @param string $name * @return bool */ public function open($save_path, $name) { $db = new PDO('mysql:host=' . DB_HOST . '; dbname=' . DB_NAME, DB_USER, DB_PASS); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if (!$db) { die('DB接続失敗'); } $this->db = $db; return true; } /** * @param string $session_id * @return string */ public function read($session_id) { $session_data = ''; $sql = ' SELECT'; $sql .= ' session_data'; $sql .= ' FROM'; $sql .= ' session_storage'; $sql .= ' WHERE'; $sql .= ' session_id = ?'; $sql .= ' AND session_time > ? '; $stmt = $this->db->prepare($sql); $stmt->execute([$session_id, time() - ini_get('session.gc_maxlifetime')]); if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $session_data = $row['session_data']; } return $session_data; } /** * @param string $session_id * @param string $session_data * @return bool */ public function write($session_id, $session_data) { $sql = 'SELECT * FROM session_storage WHERE session_id = ?'; $stmt = $this->db->prepare($sql); $stmt->execute([$session_id]); if ($stmt->fetch(PDO::FETCH_ASSOC)) { $sql = 'UPDATE session_storage SET session_data = ?, session_time = ? WHERE session_id = ?'; $stmt = $this->db->prepare($sql); return $stmt->execute([$session_data, time(), $session_id]); } $sql = 'INSERT INTO session_storage (session_id, session_data, session_time) '; $sql .= ' VALUES (?, ?, ?)'; $stmt = $this->db->prepare($sql); return $stmt->execute([$session_id, $session_data, time()]); } } $session_handler = new MySessionHandler(); session_set_save_handler($session_handler, true); session_start(); echo 'セッションID: ' . session_id() . "\n"; if (!isLogin()) { echo "Start to login\n"; login(); } else { echo "already logged in\n"; } echo 'セッションID: ' . session_id() . "\n"; function login() { session_regenerate_id(true); $_SESSION['login'] = true; } /** * @return bool */ function isLogin() { return (bool)$_SESSION['login']; }
1回目のアクセス
セッションID: qo99kgbopvijf1v5aj9bhkssr5 Start to login セッションID: meo8ef2kuplvs3m6mf6p5g0ks4
2回目の以降のアクセス
セッションID: meo8ef2kuplvs3m6mf6p5g0ks4 already logged in セッションID: meo8ef2kuplvs3m6mf6p5g0ks4
postgreslのwait for
nc -z localhost 5432
nc は deb系であれば apt-get install netcat でインストール可能
CentOS7にPostgreSQLをインストール
PostgreSQLをインストールと初期設定と起動
# yum install postgresql-server # psql --version
# postgresql-setup initdb # systemctl enable postgresql.service # systemctl start postgresql.service
md5認証に統一
まずはパスワードの変更
# su postgres -c 'psql --username=postgres' postgres=# postgres=# ALTER USER postgres with encrypted password 'パスワード' postgres=# \q
md5認証に統一
# vim /var/lib/pgsql/data/pg_hba.conf
#local all all peer local all all md5 # IPv4 local connections: #host all all 127.0.0.1/32 ident host all all 127.0.0.1/32 md5 # IPv6 local connections: #host all all ::1/128 ident host all all ::1/128 md5
postgresql を再起動
systemctl restart postgresql.service
データベース作成
# createdb sample -U postgres
さくらサーバーにAnsibleを使ってLAMP環境を作る
yum install ansible
CakePHP3、Return-Pathが効かないときの対応方法
特定の条件下では Email->setReturnPath() で設定した Return-Path が効かないようだ
今回は、local の sendmail を使っていて、この現象に遭遇
$email->getTransport()->setConfig(['additionalParameters' => '-f admin@example.com']);
して回避
そういえば、CakePHP2 のときも、この現象あったな