OSXにApache2/PHP5の開発環境をmacportsでセットアップする一例です。 apacheの再起動なしでバーチャルドメインのサイトの設定を実現します。 純正でのセットアップはこちら、OSX純正PHP環境で
- OSX標準環境は使わずにMacportsでセットアップ
- PHPの機能拡張(iMagickやCairo等グラフィックライブラリ、memcahceキャッシュ,spycYAMLパーサー)、および各サービスのインストール
- バーチャンルホストを使用してhostファイルのみの変更で各プロジェクトに個別にルート(/)からアクセスできる。
- MySQLはUTF-8で構築
- webフォルダのパスは/var/www/<プロジェクト>/htdocs localhostは/var/www/localhost/htdocs/
- キャッシュやPEARのパッケージがwebから管理できる。
- バージョンはPHP5.3, MySQL5.0,Apache2.2
OSX10.5標準のPHP環境と比較。 メリット:
- 画像ライブラリなど外部機能拡張のインストールにパッケージが使える
- PEAR環境が標準的にある
- PHPのコンパイルオプションが変更できる。 デメリット:
- インストールに手間と時間がかかる
- インストール時にエラー発生の可能性がパッケージより高い。
macportsを利用するためにはOSX純正開発環境Xcodeが必要。http://developer.apple.com/technology/xcode.html から最新版Xcodeをダウンロード(要登録)して標準インストール。OSX付属のものよりバージョンが新しい。
macportsはバイナリまたはソースでインストールできる。
http://www.macports.org/install.phpからダウンロードインストール
ホームの/local/srcに展開してコンパイル、インストールの例
$ mkdir -p ~/local/src
$ cd ~/local/src
$ svn co http://svn.macports.org/repository/macports/trunk/base macports
$ cd macports
$ ./configure
$ make
$ sudo mkdir -p /opt/local/share/macports
$ sudo make install
新規ターミナルで下記が実行できるなら問題なし
$ port help
パスが通ってないなら~/.bash_profileを編集
export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
export MANPATH="/opt/local/share/man:$MANPATH"
ターミナルを新規に開いてport helpを試す
$ sudo port -v selfupdate
$ sudo port sync
MySQL5.1の場合
$ sudo port install mysql5-devel mysql5-server-devel
**MySQL5.0の場合
$ sudo port install mysql5 mysql5-server
ライブラリ(GD、iMagick, Cairo, キャッシュ、YAML)とphpのインストール
$ sudo port install memcached syck ImageMagick +jpeg2+mpeg+perl+q32+no_x11 GraphicsMagick cairo +no_x11
$ sudo port install php5 +apache2+pear
$ cd /opt/local/apache2/modules
$ sudo /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so
sudo port list php5-*
でインストール可能なPHP5拡張パッケージを確認
拡張インストール例
sudo port install php5-apc php5-exif php5-ftp php5-gd php5-http php5-iconv php5-imagick php5-mbstring php5-mcrypt php5-memcache php5-mysql php5-openssl php5-pcntl php5-readline php5-sockets php5-sqlite3 php5-syck php5-tidy php5-uploadprogress php5-zip
デバッガー
sudo port install php5-xdebug
-wで起動時もロードされる
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.memcached.plist
起動にエラーがあっても表示されないことがあるので注意
- php5/ImageMagickはで必要な拡張をvariantsで把握して指定します。 例 $ port variants php5
- コンパイルオプションを変更したいときはeditで編集します。 例$port edit php5
" 以前mysqlのvariantsだったserverは独立したパッケージになりました。PHPの拡張もpeclよりphp5-パッケージの方が安定しています
コンパイルでエラーが出る場合がある。エラーの原因により対処法は違うが以下の対処で解決する場合がある。
- cleanコマンドを使ってみる 例)$sudo port clean php5
- ソースインストールで問題があるならdmg版で再インストールしてみる ※1
- variantns(+ipcなど)を減らしてみる
- sudo port edit php5などとしてconfigureを変更してみる
- ソースのチェックサムエラーが出ることがある。
Error: Checksum (md5) mismatch for php-5.3.0.tar.bz2
Error: Checksum (sha1) mismatch for php-5.3.0.tar.bz2
Error: Checksum (rmd160) mismatch for php-5.3.0.tar.bz2
Error: Target org.macports.checksum returned: Unable to verify file checksums
Error: Status 1 encountered during processing.
この場合はネットからphp-5.3.0.tar.bz2を探してソースを置き換える。 ソースディレクトリはSpotlightで検索。php5は(/opt/local/var/macports/distfiles/php5)
例)php5に -enable-memory-limitをつける。※実際はこのオプションは5.2.1から常にonになっているで不要
$ sudo port edit php5
myvar variantとして以下を追記
variant myvar {
configure.args-append \
--enable-memory-limit
}
上記でつくったものは+myvarバリアントでインストールできる。
http://localhost/ でIt worksが出るのを確認。 アンコメントして以下の行を有効化。httpd-vhosts.confはmy−httpd-vhosts.confにする。mod_php.confも追加。
※バックアップをとって、オリジナルを編集しないでオリジナルをバックアップにしてmyとかつけたファイル名を使用しているのはmacportでupdateしたときにファイルが上書きして消されないため(以前updateで全部消えた)
/opt/local/apache2/conf/httpd.confを編集し下記を検索してアンコメント。
Include conf/extra/httpd-autoindex.conf
Include conf/extra/httpd-info.conf
Include conf/extra/my-httpd-vhosts.conf
phpの読み込みをファイルの最後など適当な場所に追記。
Include /opt/local/apache2/conf/extra/mod_php.conf
$ sudo cp /opt/local/apache2/conf/extra/httpd-vhosts.conf /opt/local/apache2/conf/extra/my-httpd-vhosts.conf
/opt/local/apache2/conf/extra/my-httpd-vhosts.confを編集。既存のものを消去して下記のものに置き換える。
#
# Use name-based virtual hosting.
#
NameVirtualHost *:80
<Directory /var/www>
AllowOverride All
Options Indexes FollowSymLinks ExecCGI MultiViews
order deny,allow
Allow from all
DirectoryIndex index.html index.htm index.php
</Directory>
<VirtualHost *:80>
ServerName localhost
VirtualDocumentRoot /var/www/%0/htdocs
</VirtualHost>
<プロジェクト>をlocalhostに向ける為にhostsファイルを編集する.
例) <プロジェクト>がapp.sample1 -4 の4つのプロジェクトの場合
$ sudo vi /etc/hosts
127.0.0.1 localhost
127.0.0.1 app.sample1 app.sample2 app.sample3 app.sample4
※スペース区切りで追加 ※hostsファイルの変更後にapacheリスタート等は不要
/var/www/<プロジェクト>/htdocs/index.htmlがhttp://<プロジェクト>/index.htmlでアクセスできる。 できなければ ping app.sample1等として127.0.0.1を向いているか確認。
Apacheスタート
$ sudo /opt/local/apache2/bin/apachectl configtest
Syntax OK
$ sudo /opt/local/apache2/bin/apachectl restart
extentionのインストール。cairoが不要ならここはスキップ
$ sudo pecl config-set preferred_state beta
$ sudo pecl install cairo_wrapper
トラブルシューティング
imagickでMagickWand-configがないとエラーが出たらシンボリックリンクを張り再度 pecl install imagick
sudo ln -s /opt/local/bin/MagickWand-config /usr/bin/
php.iniを編集
/opt/local/etc/php.ini
apcを開発のため一時的に外す。(パースエラーで"真っ白"がある場合がある) パーケージでいれたエクステンションは/opt/local/var/db/以下のファイルで設定する。
web(mod_php)用php.ini
$ sudo cp /etc/php.ini.default /opt/local/etc/php.ini
CLI用php.ini
$ sudo cp /etc/php.ini.default /opt/local/etc/php-cli.ini
$ vi /opt/local/var/db/php5/apc.ini
;extension=apc.so
以下のタイムゾーンを設定
date.timezone = Asia/Tokyo
以下を追記
extension=cairo_wrapper.so
[Zend]
zend_extension=/usr/lib/php/extensions/no-debug-non-zts-20060613/ZendDebugger.so
zend_debugger.allow_hosts = 127.0.0.1
zend_debugger.expose_remotely = always
PEAR使用など完全にPHP5専用に以降してない場合などエラーの出力レベル感度を下げる場合 [{{ error_reporting = E_ALL | E_STRICT }} を [{{ error_reporting = E_ALL }} に変更。 PHP5.3でE_DEPRECATEDを抑制する場合は
error_reporting = E_ALL & ~E_USER_DEPRECATED
初期化
$ sudo -u mysql mysql_install_db5
$ sudo /opt/local/share/mysql5/mysql/mysql.server start
/opt/local/lib/mysql5/bin/mysqladmin -u root password 'new-password'
/opt/local/lib/mysql5/bin/mysqladmin -u root -h localhost password 'new-password'
cd /opt/local ; sudo /opt/local/lib/mysql5/bin/mysqld_safe &
$ mysql5 -u root -p
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.40-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> exit
Bye
$ sudo cp /opt/local/share/mysql5/mysql/my-small.cnf /etc/my.cnf
デフォルトキャラクタの設定をmy.confに追記。console.appでログが確認しやすいように/var/log/opt/にクエリーログを保存設定
/etc/my.cnf
[client]
default-character-set = utf8
[mysqld]
default-character-set = utf8
skip-character-set-client-handshake
log=/opt/local/var/db/mysql5/query.log
long_query_time = 5
log-queries-not-using-indexes
log-slow-queries=/opt/local/var/db/mysql5/query-slow.log
[mysqldump]
default-character-set = utf8
※dataディレクトリを変更したい場合なら以下もmysqldに追記。書き込み権限も要設定。設定しないと/opt/以下の標準パスにDBデータが保存される。
datadir=/Users/koriyama/Documents/mysql/Data/mysql5
$ sudo /opt/local/share/mysql5/mysql/mysql.server restart
mysqlのsocketファイルのパスを確認
$ mysql_config5 | grep socket
--socket [/opt/local/var/run/mysql5/mysqld.sock]
opt/local/etc/php5/php.ini(または/opt/local/etc/php.ini )を編集
pdo_mysql.default_socket= /opt/local/var/run/mysql5/mysqld.sock
mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
mysqli.default_socket = /opt/local/var/run/mysql5/mysqld.sock
DB文字コード
$ mysql5 -u root
> show variables like 'char%';
+--------------------------+-----------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /opt/local/share/mysql5/mysql/charsets/ |
+--------------------------+-----------------------------------------+
となればOK
パスワード設定している場合は""を"password"に変更
$ php -r 'mysql_connect(":/opt/local/var/run/mysql5/mysqld.sock", "root", "");';
$ php -r 'new mysqli("localhost", "root", "", "mysql");'
$ php -r 'new PDO("mysql:host=localhost;dbname=mysql", "root", "");'
これでエラーが出なければOK
. ERROR! Manager of pid-file quit without updating file.というエラーがコンソールに出てmysqlがスタートできない事があるが原因がコンソールに表示されない。
エラー内容をtailする
sudo tail -f /opt/local/var/db/mysql5/マシン名.err
例えば
[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
091019 12:50:26 mysqld ended
これはmysqlテーブルが読めない(ない)場合のエラー
これで対処
sudo -u mysql mysql_install_db5
my.cnfに誤りがあり指定しているディレクトリやファイルをがない場合にエラーが出る事がある。パスをチェック。 またはmysqlのプロセスが残ってるときがある。psでみつけてkillで削除
$ ps ax | grep mysql
$ kill [pid]
どうしてもうまくいかない場合はuninstall, installをやり直してみる。
sudo port uninstall mysql5
sudo rm -rf /opt/local/var/db/mysql5
sudo port install mysql5 mysql5-server
(または)
sudo port install mysql5-devel mysql5-devel-server
/opt/local/var/run/mysql5/mysqld.sockのエラーの場合
ソケットファイル作成で対処。
$ sudo mkdir /opt/local/var/run/mysql5
$ sudo chown mysql:mysql /opt/local/var/run/mysql5/
$ sudo chmod 775 /opt/local/var/run/mysql5
Fatal error: Class 'mysqli' not found in Command line code on line 1
このエラーだとphp5-mysqlがインストールされてない
$ sudo cp /usr/share/php/apc.php /var/www/localhost/htdocs/
$ sudo cp /usr/share/php/docs/memcache/memcache.php /var/www/localhost/htdocs/
memcaheの管理画面でID/passとmemcacheサーバーをlocalhostに設定
/var/www/localhost/htdocs/memcache.php
define('ADMIN_USERNAME','memcache'); // Admin Username
define('ADMIN_PASSWORD','password'); // Admin Password
$MEMCACHE_SERVERS[] = 'localhost:11211'; // add more as an array
//$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
mysqlのクエリーログをwebから見られるように権限変更
$ sudo chmod 664 /opt/local/var/db/mysql5/query.log
$ sudo chmod 664 /opt/local/var/db/mysql5/query-slow.log
PEAR_Frontend_WebをインストールしてPEARのフロント画面を用意。
$ sudo pear install -a PEAR_Frontend_Web
$ sudo cp -r /usr/share/php/docs/PEAR_Frontend_Web/docs/ /var/www/localhost/htdocs/pear
$ cd /var/www/localhost/htdocs/pear/
$ sudo mv index.php.txt index.php
確認
$ http://localhost/pear/
トラブルシュート
Warning: Can not find config file, please specify the $pear_user_config variable in /pear/index.php
というエラーが出たらwebから書き込めるディレクトリを用意してpear.confを指定。
pear config-createで作成するとpearが最後に自動的にきて面倒なので、存在しないconfを指定して一度目のアクセスで作ってもらいます。リロードすると正しく表示される。
$ cd $ mkdir local $ chmod 777 local
$ sudo pear config-create /usr/share/php ~/.pearrc
$ sudo vi index.php
$ pear_user_config = '/Users/<ユーザー名>/local/pear.conf';
などとする。また
//$pear_frontweb_protected = true;
とアンコメントすると認証をかけてない警告を抑制できる。
webでインストールするためのパーミッション設定。
$ sudo chown -R www /usr/share/php
ライブサーバーでの運用を考えPEARのパスを揃えりためシンボリックリンクを張ります。
$ sudo ln -s /opt/local/lib/php /usr/share/php
$ sudo ln -s /opt/local/lib/php /usr/share/pear
上記がUbuntu/Debian系下記がRedHat系です。どちらも張っといていいと思います。
PHPのコードチェックをするhttp://pear.php.net/manual/ja/package.php.php-codesniffer.phpはコードの整形のチェックだけでなくZendCodeAnalyzerを使うと潜在的なバグの可能性まで指摘までしてくれる(未使用変数の放置、届かないコードなど)。
sudo phpcs --config-set zend_ca_path '/Applications/Zend/Zend\ Studio\ for\ Eclipse\ -\ 6.1.0/plugins/com.zend.php.codeanalyzer.macosx_6.1.0.v20080907/resources/ZendCodeAnalyzer'
PDTをダウンロード展開して、日本語化パックファイルを該当フォルダ(plugins, features)にコピーして起動。
subversiveを参照。
eclipse > ヘルプ > Install New Software > AddでSVN用更新サイトを追加
- Name : subversive
- URL: http://download.eclipse.org/technology/subversive/0.7/update-site/
割当メモリを増やす
$ vi <インストールディレクトリ>/eclipse/Eclipse.app/Contents/MacOS/eclipse.ini
-Xms512m
-Xmx512m
※1G以上はうまくいかないみたい
設定をかえたら初期化してクリーンスタート
$ cd <インストールディレクトリ>
$ eclipse/Eclipse.app/Contents/MacOS/eclipse -initialize
$ eclipse/Eclipse.app/Contents/MacOS/eclipse -clean &
macportsになく、公式サイトのパッケージで
http://www.graphviz.org/Download_macos.php
Eclipse + PDTのセットアップは Eclipseセットアップで
iniファイルはディレクトリに入ったので読んでくれないのでphp.iniにエクステンションをまとめて記述。
extension=apc.so
extension=exif.so
extension=ftp.so
extension=gd.so
extension=http.so
extension=iconv.so
extension=imagick.so
extension=mcrypt.so
extension=memcache.so
extension=mysql.so
extension=mysqli.so
extension=pdo_mysql.so
extension=openssl.so
extension=pcntl.so
extension=posix.so
extension=sockets.so
extension=sqlite.so
extension=sqlite3.so
extension=pdo_sqlite.so
xtension=syck.so
extension=tidy.so
extension=uploadprogress.so
zend_extension=/opt/local/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so
xdebug.remote_enable=On
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
extension=xsl.so
extension=zip.so
/opt/local/var/db/php5/内のファイルの読み込みをコメントにします。
Zend Studioを使う場合は以下のZendDebuggerをインストールします。XDebugとの共存はできません。
http://downloads.zend.com/pdt/server-debugger/ からダウンロードしてコピー、デバックするプロジェクトのhtdocsにdummy.phpが必要なのでこれもコピー
$ sudo cp ~/Downloads/ZendDebugger-5.2.14-darwin8.6-uni/5_2_x_comp/ZendDebugger.so /usr/lib/php/extensions/no-debug-non-zts-20060613
$ cp ~/Downloads/ZendDebugger-5.2.14-darwin8.6-uni/dummy.php /var/www/localhost/htdocs
更新されたパッケージを新しくし、古いバージョンや使われなくなったパッケージを削除する為に以下を時々実行します。
Note:
パッケージが多いとアップグレードにかなりの時間がかかります。
$ sudo port sync
$ sudo port selfupdate
$ sudo port clean --dist outdated
$ sudo port upgrade outdated
$ sudo port -u uninstall