follow us in feedly

PHP

WindowsのCakePHP3で発生したintlエラーを解決する

CakePHP3で開発するとintl拡張モジュールのエラーに出くわしますよね。
今回はWindowsらしい原因だったので、ちょっとハマりました。
ということで、解決した方法を書いていきます。

環境

  • Windows7
  • PHP 7.1.8
  • CakePHP 3.5.5

エラー内容

エラーはエクステンション関連の内容です。
なので、すぐに解決するだろうと思ってました。

Fatal error: You must enable the intl extension to use CakePHP.

intl拡張モジュールはあるし、php.iniにも設定してる

調べてみると解決方法として紹介されているのは、次の両方またはどちらかです。

  • intl拡張モジュールをインストールする
  • php.iniのextensionに設定する

でも、自分の環境ではどちらも問題ありませんでした。

C:¥php¥extにphp_intl.dllはあるし、
php.iniにも「extension=php_intl.dll」が設定されています。

Windows環境変数への設定が原因だった

モジュールも設定も問題ないのでハマりました。
Apacheの再起動とか、OSの再起動とか試してもやっぱりダメ。
そんななか、環境変数の設定をチェックしたところ。

ユーザー環境変数のほうにPHPのパスが書いてある。。。

すぐにシステム環境変数のほうにPHPのパスを追加して解決!
サイトが無事に表示されました。

まとめ

CakePHP3で見かけるintl拡張モジュールのエラー解決方法を紹介しました。
Windowsのシステム環境変数にPHPのパスを追加することで解決できます。
モジュールがないことやphp.iniの設定ばかりが原因ではないんですね。
Windows環境でCakePHP3を利用するときは注意してください。

Windows版PHPでCSVが正しくパースされない問題に悩んだ

仕事でちょっとした多言語サイトを開発することになったわけですが
掲載情報をCSVで取り込むときに正しくパースされない問題に悩まされました。
ということで、解決(?)するまでの経緯を書いていきます。

環境

Windows7
PHP 7.1.8
SQLite 3.20.0

Windows7 + PHPでマルチバイト文字のCSVのパースができなかった

今回、開発するサイトは多言語のサイトです。
日本語に加えて英語、韓国語、中国語(繁体字・簡体字)も扱います。

各言語のCSVをPHPのSplFileObjectで読み込もうとするも
日本語、韓国語、中国語といったマルチバイト文字の言語が適切にパースされませんでした。
文字コードはすべてUTF-8です。

文字エンコードをしてみる

UTF-8のまま読みたかったが仕方がないので、下記のとおりにエンコードすることに。
すると、いい感じにパースされたので、「解決!」と思ったのだけど。。。

  • 日本語→CP932
  • 韓国語→CP949
  • 繁体字→CP950
  • 簡体字→CP936

エンコードできない文字がある

いい感じだったのは日本語、韓国語まで。
繁体字になってエンコードできない文字(?になってる)があることが判明。
簡体字も繁体字ほどではないにしろ同様で、よくよくみると韓国語もまれにあるという状況でした。

setlocaleも試してみる

文字化けするのなら、UTF-8でなんとかするしかないかと考えて
setlocale()をするもパース位置が変わる程度で解決には至らず。

ちなみに、Windowsでのsetlocale()はセットの仕方に注意。

# これだとセットできない
setlocale(LC_ALL, 'ja_JP'):

# これだとセットできる
setlocale(LC_ALL, 'Japanese_Japan');
setlocale(LC_ALL, 'Japanese_Japan.932');
setlocale(LC_ALL, 'ja-JP');

他の環境での動きを見てみる

以下の3つの環境でどうなるかを見てみた。

  • CendOS6 + PHP5.3
  • Windows7 + Python3
  • Windows PowerShell

結果としては、上記の環境ではUTF-8のまま問題なくパースできました。
ということで、Windows版PHPがダメらしいということがわかったのです。

Windows7 + Python3でやることにした

時間も限られているので、PHPでの解決は諦めることにして
Windows7 + Python3でCSVを取り込むことにしました。

理由としては、

  • 今回は諸事情によりWindows環境でやるしかないこと
  • PowerShellでもいいのだけど、Pythonを使ってみたかったからです。

ここにはPythonでの詳細は書きませんが無事に取り込めました。

まとめ

Windows7 + PHPでの開発で遭遇したCSVのパース問題をご紹介しました。

  • CSVがマルチバイト文字の言語だと正しくパースされなかった
  • 各言語をUTF-8からエンコードするとパースはされたが一部文字化けした
  • setlocale()するも期待した結果は得られなかった

結局、Windows版PHPがダメだと判断して、Pythonを使うことで解決しました。
Windows + PHPでの開発をお考えの方はご注意ください。

WordPress Importerでインポートできないときの対応方法

WordPress Importerというプラグインで記事やカテゴリなどを
インポートできないときの対応方法をご紹介します。

一昨日、インポートできないから記事戻すのやーめたとか言ってたやつの対応です。

どんな状態になっていたかと言うと、XMLファイルを選んで実行すると、
画面には「WordPress Importer」という文字だけ。
それ以外は何も表示されませんでした。

で、ログを見てみると、こんなエラーが出ていました。

途中を省略しています。

"PHP message: PHP Fatal error:  Class 'DOMDocument' not found in ... parsers.php on line 61"

調べると対応方法は、下記の2つでした。

  • php-xmlをインストールする。
  • WordPress Importerのソースコード(parsers.php)を変更する。

php-xmlのインストールはコマンドを打つだけ。

sudo yum install php-xml

しかし、これではインポートができるようになりませんでした。
そこからさらに調べて見つけたのが2つ目の方法です。
「/var/www/…/wp-content/plugin/wordpress-importer/parsers.php」の15行目を修正します。

修正前:
if ( extension_loaded( 'simplexml' ) ) {

修正後:
if ( false && extension_loaded( 'simplexml' ) ) {

これでインポートできるようになるはずです。
2つ目の対応だけで直るのかはよくわかりませんが、
特に手間でもないので、2つともやればいいんではないでしょうか。

参考サイト

WordPressでインポートが途中で失敗した場合の対処 – No Web Service No Life

WordPressで画像を挿入するときにサイズが選択できない場合の対応

WordPressでの画像サイズ選択

最近、ブログに画像を入れるようになって初めて気づきました。
参考にしてるWordPress本などでは画像サイズが選択できるよとなっているわけですが、
実際に画像を挿入しようと思ったらフルサイズしか選べませんでした。

調べてみると、PHPのGDモジュールが必要ということでインストールしました。
サーバ環境はこんな感じです。
CentOS 6.2
PHP 5.3.3
Nginx + FastCGI

GDモジュールをインストールする

GDモジュールをyumでインストールします。

$ sudo yum install php-gd

インストールが完了したらFastCGIを再起動します。
FastCGIの設定や起動スクリプトについてはこちらを参照。

$ sudo /etc/init.d/php-fastcgi restart

設定ファイルはインストール時に作成されると思います。
作成された/etc/php.d/gd.iniの中身はこれだけ。

; Enable gd extension module
extension=gd.so

確認して「gd」が表示されていれば完了です。

$ php -m
[PHP Modules]

gd

これまでアップロードした画像のサイズは選択できないので、
そのままにするか再アップロードするかになります。

MacでWordPressのローカル環境を構築する

Mac で WordPress のローカル環境を構築します。
WordPress のテーマやプラグインなどカスタマイズするとして、最初からサーバ上で作るわけにもいかないしローカルであれば手軽に試すこともできるので。
MAMP ならインストールして完了なんですが、ちょっと面倒なことになったこともあるので個別に準備します。
Homebrew もインストールしたことだし。

Webサーバ を起動する

Mac には標準で Apache がインストールされているので起動するだけで使えるようになります。
[システム環境設定] – [共有] にある [Web 共有] にチェックを入れれば完了です。
ブラウザを立ち上げて、下記にアクセスするとページが表示されます。
http://localhost/~username

Homebrew で PHP をインストールする

Homebrew で PHP をインストールします。
Mac には PHP も標準で入っているようですがインストールします。
まず、Formula を落として Homebrew のディレクトリに移動します。

$ curl -O https://raw.github.com/ampt/homebrew/php/Library/Formula/php.rb
$ mv php.rb `brew --prefix`/Library/Formula

brew コマンドを実行してインストールします。オプションは Apache と MySQL を指定します。
MySQL が入っていない場合はインストールされます。

$ brew install php --with-mysql --with-apache

インストールが完了したら、パスをとおすため .bash_profile に下記を追加します。

export PATH="`brew --prefix`/bin:$PATH"

確認して、下記のようになれば OK です。

$ which php
/usr/local/bin/php

Apache の設定をします。/etc/apache2/d.conf に下記を追加します。

#LoadModule php5_module libexec/apache2/libphp5.so ← こちらは標準でインストールされているほうの設定
LoadModule php5_module /usr/local/Cellar/php/5.3.10/libexec/apache2/libphp5.so

Homebrew で MySQL をインストールする

Homebrew で MySQL をインストールします。
brew コマンドを実行してインストールします。
PHP のときにインストールされてると思うが念のために書いておく。

$ brew install mysql

インストール時にメッセージが表示されるので、それに従って設定します。
現在のユーザアカウントでデータベースをセットアップします。

$ unset TMPDIR
$ mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp

MySQL を起動します。

$ mysql.server start

ログイン時に自動起動するように設定します。

$ mkdir -p ~/Library/LaunchAgents
$ cp /usr/local/Cellar/mysql/5.5.19/homebrew.mxcl.mysql.plist ~/Library/LaunchAgents/

MySQL の root パスワードを設定します。

$ /usr/local/Cellar/mysql/5.5.19/bin/mysqladmin -u root password 'password'

MySQL サーバに root で接続する。

$ mysql -u root -p
Enter password: password

MySQL に WordPress 用のデータベースを作成する

MySQLサーバに接続して、データベースを作成します。

mysql> CREATE DATABASE wordpress DEFAULT charset utf8;

データベースのユーザを作成します。

mysql> GRANT ALL ON wordpress.* TO wpuser@localhost IDENTIFIED BY 'password'

WordPress をインストールする

WordPress をダウンロードして、/Users/username/Sites に展開します。
Finder だと [Macintosh HD] → [ユーザ] → [username] → [サイト] です。

$ cd /Users/username/Sites
$ curl -O https://ja.wordpress.org/latest-ja.zip
$ unzip latest-ja.zip

wp-config.php を作成して、WordPress の設定をします。

$ cp wp-config-sample.php wp-config.php
$ vi wp-config.php

下記の部分を修正します。FS_METHOD は追加します。

define('DB_NAME', 'wordpress');
define('DB_USER', 'wpuser');
define('DB_PASSWORD', 'password');
define('FS_METHOD', 'direct');

ブラウザから http://localhost/~username/wordpress/wp-admin/ にアクセスして設定を行えば、ローカル環境で WordPress が使えます。

さくらVPSにnginx + WordPressの環境を構築する(3) – PHPとMySQL のインストール

さくらVPSにPHPとMySQLをインストールします。
主に下記のサイトを参考にさせていただきました。
ウェブ開発者のための、1時間でできるLAMP環境構築術(CentOS編)– さくらインターネット創業日記
さくらVPSとnginxリバースプロクシで最速WordPressブログを作る方法(ベンチマーク付き)| さくらたんどっとびーず

パッケージをアップデートする

まずは、インストールされているものを最新版にアップデートしておきます。

# yum update

yumのリポジトリを追加する

EPELをダウンロードして追加します。(EPELはインストール済みだったので必要なかった。)

# wget http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-5.noarch.rpm
# rpm -Uvh epel-release-6-5.noarch.rpm

remiをダウンロードして追加します。

# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# rpm -Uvh remi-release-6.rpm

RPMForgeをダウンロードして追加します。

# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
# rpm -Uvh rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

リポジトリの設定を行います。
yumコマンドで指定しない限り追加したリポジトリを使用しないようにします。
下記の enableの値を1から0に変更してリポジトリを無効にします。

# vi /etc/yum.repos.d/epel.repo

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=0 ← 1を0に変更する
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

下記の enable の値を 1 から 0 に変更してリポジトリを無効にします。

# vi /etc/yum.repos.d/rpmforge.repo

[rpmforge]
name = RHEL $releasever - RPMforge.net - dag
baseurl = http://apt.sw.be/redhat/el6/en/$basearch/rpmforge
mirrorlist = http://apt.sw.be/redhat/el6/en/mirrors-rpmforge
#mirrorlist = file:///etc/yum.repos.d/mirrors-rpmforge
enabled = 0 ← 1を0に変更する
protect = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag
gpgcheck = 1

MySQLをインストールする

下記を実行して、mysqlをインストールします。

# yum install mysql mysql-server

インストールが完了したら、MySQLサーバを起動します。
また、再起動した時に MySQLサーバが起動するように設定します。

# /etc/init.d/mysqld start
# /sbin/chkconfig --level 345 mysqld on

PHPをインストールする

下記を実行して、PHPをインストールします。

# yum install php php-cli php-xml php-mysql php-mbstring php-devel php-pdo php-pear

eAcceleratorをインストールする

ソースコードをダウンロードして、解凍します。

# wget http://sourceforge.net/projects/eaccelerator/files/latest/download/eaccelerator-0.9.6.1.zip
# unzip eaccelerator-0.9.6.1.zip

ビルドして、インストールします。

# cd eaccelerator-0.9.6.1
# phpize
# ./configure --enable-eaccelerator
# make
# make install

/etc/php.iniにeaccelerator.soを追記します。

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

extension=eaccelerator.so

eaccelerator.cache_dirを/var/tmp/eacceleratorに変更します。
デフォルトの設定(/tmp/eaccelarator)でも問題ないです。
変更する場合は、php.iniの末尾に設定を追記します。

[eAccelerator]
eaccelerator.cache_dir = "/var/tmp/eaccelerator"

ディレクトリを作成して、パーミッションを設定します。

# mkdir -p /var/tmp/eaccelerator
# chmod 777 /var/tmp/eaccelerator

これで、PHPとMySQLのインストールは完了です。