PHPエラー「Class 'Normalizer' not found」の解決

環境

  • Cent OS 7
  • PHP 7.1

結論

intl 拡張モジュールが無かった。だったらインストールすればいいだろ!!

yum install php-intl --enablerepo=remi-php71

--enablerepo=remi-php71 オプションは今回の環境の都合なので適宜変更されたし。

余談

そもそもなんで Normalizer が必要なハメになったかというと…

マカーから納品されるデータにしばしば NFD (厳密にはNFDの亜種) が混ざってくる。そいつをうまいこと処理するために必要になった。だからMac上のファイル名からコピペすんなっつってんじょろ!!

ja.wikipedia.org

qiita.com

WordPress (KUSANAGI : Nginx + HHVM 環境) でファイルがアップロードできない「ファイルが空のようです。」を解決

結論

HHVM の不具合。KUSANAGI 関係無ぇ。

経緯

KUSANAGI 環境で WordPress ライフを謳歌していたところ、突如以下のエラーが起きるように。

ファイルが空のようです。中身のあるファイルをアップロードしてください。このエラーは php.ini ファイルでアップロードができない設定になっているか、 post_max_size が upload_max_filesize よりも小さく設定されているために発生している可能性もあります。

続きを読む

mailcatcher をインストールして PHP で使うまで

mailcatcher

「開発環境とかでメール送信テストしたいけど、実際に送信するのはちょっと・・・」*1

そんなときにこの MailCatcher

ダミーのSMTPサーバーと、そのWEBメールインターフェースを提供してくれる。詳細はぐぐって、どうぞ。

今回はこいつをインストールして PHP で使うまでをメモった。

インストール手順

Ruby gem の環境を作る

今回の例は CentOS + yum だが、各自お好きな方法でかまわない。rbenv とか。

# yum install ruby ruby-devel rubygems sqlite sqlite-devel
# gem install mailcatcher

PHPの設定変更

※php.ini直接でもいいけど
# vi /etc/php.d/mailcatcher.ini    

sendmail_path = "/usr/bin/env catchmail"

※WEBサーバー再起動
# /etc/init.d/httpd restart

mailcatcher起動

# mailcatcher

Vagrant等で使う場合、mailcatcher の WEBインターフェースを使うには明示的にIPアドレスを指定してやらないと都合が悪い。

# mailcatcher --http-ip 192.168.33.10

仕上げ

mailcatcher で使うポート(1080, 1025)を開ける。自分の環境に合った方法で。

【例:コマンドで直接変更する場合】
# iptables -A INPUT -p tcp --dport 1080 -j ACCEPT
# iptables -A INPUT -p tcp --dport 1025 -j ACCEPT
# /etc/init.d/iptables save
# /etc/init.d/iptables restart
【例:chef-cookbook iptables のテンプレートに追記する場合】
# mailcatcher
-A FWR -m tcp -p tcp --dport 1080 -j ACCEPT
-A FWR -m tcp -p tcp --dport 1025 -j ACCEPT

あとは、PHPアプリ側で使うメール送信ポートに 1025 (mailcatcherのデフォルト設定)を指定すれば OK 。

WEBインターフェースは

http://localhost:1080

にアクセス。またはIPアドレスを明示的に指定した場合は以下のようになる。

http://192.168.33.10:1080

以上

注意

mailcatcher コマンドを叩くたびに新しいプロセスで起動しちゃうので、オプションを指定しなおしたい時などは、プロセスを探して kill してから。

*1:2017-05-01 追記: 現在も結構参照されているこの記事ですが、用途によっては mailtrap.io を使うのがより簡単でオススメです。

EC-CUBE商品管理画面で商品種別のみ文字化けする

環境

事象

  • 商品登録画面において「商品種別」のラベルが「????」などに文字化けする。
  • DBには正常に登録されており、他のマスターデータは表示上の文字化け無し。
  • 管理画面のマスターデータ管理で mtb_product_type を見ると文字化け無し。

原因

商品種別マスターデータのキャッシュファイルがぶっ壊れてる(文字化けしてる)。

キャッシュファイルはただの配列をシリアライズしたものなので、エディタで見るとわかる。そこですでに「????」とかになってる。

解決方法

とにかく、当該のキャッシュを再生成させればよい。

方法 1. マスターデータキャッシュファイルを削除

/data/cache/mtb_product_type.serial を削除する。

方法 2. マスターデータ管理画面から再設定

ファイルを直接操作できず「方法 1」が適用できない場合はこちら。

  1. 管理画面「マスターデータ管理」で「mtb_product_type」を開く
  2. 値をいったんASCII文字に置き換えて登録。(「normal」とか「download」とかに。)
  3. 再度、管理画面「マスターデータ管理」で「mtb_product_type」を開く
  4. 値を元に戻す。

根本的な原因は追えてないけど、EC-CUBEに深く関わりたくはないのでこれでおしまい。:P

Vagrantと仮想マシンとの紐づけが外れないようにするには

以前書いた以下の記事。

Vagrantの仮想マシンとの紐付けの直し方

そもそもそれを防止するにはどうするのよ?というお話。

力 is Power

仮想マシンとの紐づけが定義されている以下のファイルを「読み取り専用」にしてしまうという力技。

/path/to/.vagrant/machines/default/virtualbox/id

こうすると、もし紐づけの削除が行われそうになった時には

$ vagrant up
(中略)
C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.2.7/lib/vagrant/machine.rb:204:in `initialize': Permission denied

ってな感じに起動でコケるので、結果的に紐づけ削除を防止できる。そのあとは再度 vagrant up すればOK。

今のところこれで不都合は起きていない。

根本的な問題解消方法は未だ不明。