DockerのPHP公式イメージでモジュールを追加

PHP公式のDockerイメージを使用する際、モジュールの追加を簡単にする
[shell]docker-php-ext-install[/shell] が用意されている。

[shell]
FROM php:5.4-apache
RUN apt-get update && \
apt-get install -y \
libfreetype6-dev \ # gdに必要
libjpeg62-turbo-dev \ # gdに必要
libpng12-dev && \ # gdに必要
docker-php-ext-install gd mbstring pdo_mysql pdo_mysql mysqli mysql intl
[/shell]

上記では重複して不要なものも入れているので、適宜必要なものだけに修正。

DockerのPHPでMySQL拡張モジュールを使う

PHP PDOのエラー確認

PDOはエラーがあった場合も自動でエラーメッセージを吐かないため、開発時には自分で出力する必要がある。

PDO::setAttribute を使用してエラーの形式を設定。

[php] $pdo = new \PDO( 設定 ); $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_WARNING); // 処理 var_dump( $pdo->errorCode() ); var_dump( $pdo->errorInfo() ); [/php]

PDO::setAttribute の第一引数に、設定する項目、今回はエラーの設定なのでPDO::ATTR_ERRMODE を指定。第二引数に設定したいエラーモードの種類を指定。
エラーモードには
・PDO::ERRMODE_SILENT
・PDO::ERRMODE_WARNING
・PDO::ERRMODE_EXCEPTION
がある。

公式ドキュメント http://php.net/manual/ja/pdo.error-handling.php

CakePHP3でDBに予約語を使用した際の対応

DBに予約語を使用していた場合は、カラム名をバッククォートで括る必要がある。CakePHP3だとデフォルトでオフになっている。(CakePHP2まではオン)

/cake/config/app.phpにあるDBの設定を 'quoteIdentifiers' => trueに変更。

予約語一覧
https://dev.mysql.com/doc/refman/5.6/ja/reserved-words.html

flexibility.jsとカラム落ち

flexibility.jsでieのflexbox対応しようと思ったらカラム落ちしたので、対応方法をメモ。

[css]
.container {
display: flex;
flex-wrap: wrap;
}
.inner {
width: 32%;
margin: 0 2% 0 0;
}
.inner:nth-of-type( 3n ) {
margin-right: 0;
}
[/css]
[html]
<div class=”container”>
<div class=”inner”>inner</div>
<div class=”inner”>inner</div>
<div class=”inner”>inner</div>
<div class=”inner”>inner</div>
<div class=”inner”>inner</div>
</div>
<!–[if lte IE 9]>
<script src=”https://cdnjs.cloudflare.com/ajax/libs/flexibility/2.0.1/flexibility.js”></script>
<script>
window.addEventListener( “load”, function() {
flexibility(document.documentElement);
}, false );
</script>
<![endif]–>
[/html]

3カラムの一覧。とても単純。
これを fexibility.js を読み込んだ ie で表示したところ、2カラム表示となった。なぜ?

space-betweenを使用

[css]
.container {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.inner {
width: 32%;
}
.inner:nth-child(3n+2):last-child {
margin-right: 34%;
}
[/css]

marginを space-between に任せたらうまくいった。

ちなみにspace-between + after擬似要素だとうまくいかない

3カラムだと以下のように最後にafter擬似要素を加えて最後の行のコンテンツが両端に行くのを防ぐやり方があるけど、flexibility.jsだとafter擬似要素が無視される。

[css]
.container {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.container::after {
display: block;
content: ”;
margin-right: 34%;
}
.inner {
width: 32%;
}
[/css]

ieはいつまでたっても困らせてくるなぁ。

よく使う npx コマンド

さらっとnodeを使用したいときに使うコマンド。

Browser Sync

軽いコーディングとか、自分の環境にサーバ立てて作業していたけど他の人にも見せたいときに便利。
[shell]
# 作業ディレクトリを指定
$ npx browser-sync start -s path/to/directory
# サーバのurlを指定
$ npx browser-sync start -p www.hoge.test
[/shell]
デザイン制作時とかでも、ネットワーク内の他の人に確認してもらうのにも使える。

node-sass

[shell]
$ npx node-sass input.scss -o path/to/directory –output-style compressed
# watch
$ npx node-sass -w path/to/directory
[/shell]

VCCWでmod_substituteを使用した文字列置換

大量の画像が保存されたWordPressのちょっとした修正の依頼があったが、画像データまでローカルに持ってくるのが面倒だった。そこで、サーバ側で置換された画像urlを出力して本番環境の画像を表示して作業をすることに。

ローカルではvccwを使用して作業。DBを本番環境からインポートして、search-replaceしておく。

mod_substituteをオン

[bash]$ vagrant ssh[/bash]でサーバに入り、/etc/apache2/mods-available/substitute.load のシンボリックリンクを /etc/apache2/mods-enabled 内に作成。で、apacheを再起動。
[bash]
$ sudo ln -s /etc/apache2/mods-available/substitute.load /etc/apache2/mods-enabled/
$ sudo system apache2 restart
[/bash]

.htaccessに置換の処理を記述

.htaccessに以下を記述。urlは適宜変更を。
phpのファイルを処理する場合、Substituteの置換をする。

AddOutputFilter SUBSTITUTE php

Substitute s%(href|src)=\"http://local_server(/wp-content/uploads/\d+/\d+/[^"]+\.(jpg|png|gif|svg))%$1=\"https://production_server$2%

注意事項

jsで動的に画像を出力する場合などは変換されないので注意。たとえば管理画面のメディアライブラリでは画像が出力されない。ちょっとした修正の場合には問題ないけど、がっつり編集する場合にはちゃんとデータを落としてくるなり環境をしっかり整えないとね。

phpのmb_send_mailで半角カタカナと環境依存文字に対応させる

mb_send_mailを使用すると件名や本文をメールに適した文字コードにエンコードして送信してくれます。しかし、そこで使用される文字コード ISO-2022-JP は半角カタカナや①などの環境依存文字に対応していないため???と文字化けしてしまう。そこで本文を ISO-2022-JP-MS でエンコードすることで文字化けを回避します。

$to      = 'hoge@example.test';
$from    = 'huga@example.test';
$message = '半角カタカナや環境依存文字①②③が含まれた本文';

$message = mb_convert_kana( $message, 'utf-8' );

mb_send_mail( $to, $subject, $message );

ISO-2022-JP-MSに対応しているのがPHP5.2.1からなので、これが使えない場合には[php]  $body = mb_convert_kana( $body ); [/php] で半角カタカナ→全角カタカナ変換するという手も。

参考

http://php.net/manual/ja/function.mb-send-mail.php
https://iritec.jp/web_service/8582/