こちらの記事をたまたま見て気になったので投稿。
PHPでforeachなどを使う時の注意点。ブロックスコープのお話。
確かにループで一時的に必要な変数にスコープが無いと都合が悪いのはその通りなんだけど、解決策にモヤモヤ…
スコープが欲しいところに無いなら作ればいいわけで
関数に入れればスコープが作れる。
もっと言えばクラスにすればいいと思う。
こちらの記事をたまたま見て気になったので投稿。
PHPでforeachなどを使う時の注意点。ブロックスコープのお話。
確かにループで一時的に必要な変数にスコープが無いと都合が悪いのはその通りなんだけど、解決策にモヤモヤ…
スコープが欲しいところに無いなら作ればいいわけで
関数に入れればスコープが作れる。
もっと言えばクラスにすればいいと思う。
herokuでphpが動くのは前々から知っていたのですが、mbstringが有効なphpがいとも簡単に動くという情報を見つけたので試してみました。
$ mkdir heroku-php $ git init $ vim index.php <?php phpinfo(); $ git add . $ git commit -m "initial commit" $ heroku create --buildpack https://github.com/winglian/heroku-buildpack-php -s cedar $ git push heroku master
こんだけ!?全然難しくないですね。
heroku openしてみたらちゃんとphpinfoが表示されました。
でも気になったのがindex.phpの設置場所。
基本phpはindexに相当するものを設置しなければいけないと思うのですが、これってpublicディレクトリにしても動くのだろうか…?
$ mkdir public $ git mv index.php public/ $ git commit -am "moved index.php" $ git push heroku master -----> Heroku receiving push -----> Fetching custom buildpack... done ! Heroku push rejected, no Cedar-supported app detected
ガーン!…そもそもアプリのルートにindex.phpが無いと受け付けてくれないのか。
ということは環境変数DOCUMENT_ROOTとか使えないのかな?
$ heroku config:add DOCUMENT_ROOT=/app/www/public Adding config vars and restarting app... done, v5 DOCUMENT_ROOT => /app/www/public
まぁ無理でした。環境変数はセットできても何の意味も無いですね。ググっても情報みつからないので多分このオプションは存在しないのでしょう。
アプリそのものが公開ディレクトリなのはそれはそれでphpらしいですよね。
しかしphp速い感じする。ただのphpinfoというのもあるだろうけど、アプリの更新しても再起動が無いからか。
まずはFormulaを検索
$ brew search apc josegonzalez/php/php53-apc josegonzalez/php/php54-apc
2つありました。 phpはv5.3.10なのでphp53-apcをインストールします。
リポジトリを追加
$ brew tap josegonzalez/php Cloning into '/usr/local/Library/Taps/josegonzalez-php'... remote: Counting objects: 1011, done. remote: Compressing objects: 100% (491/491), done. remote: Total 1011 (delta 480), reused 929 (delta 416) Receiving objects: 100% (1011/1011), 140.43 KiB | 109 KiB/s, done. Resolving deltas: 100% (480/480), done. Tapped 48 formula
インストール実行
$ brew install php53-apc ...... To finish installing php53-apc: * Add the following lines to /usr/local/etc/php.ini: [apc] extension="/usr/local/Cellar/php53-apc/3.1.10/apc.so" apc.enabled=1 apc.shm_segments=1 apc.shm_size=64M apc.ttl=7200 apc.user_ttl=7200 apc.num_files_hint=1024 apc.mmap_file_mask=/tmp/apc.XXXXXX apc.enable_cli=1 * Restart your webserver. * Write a PHP page that calls "phpinfo();" * Load it in a browser and look for the info on the apc module. * If you see it, you have been successful! * You can copy "/usr/local/Cellar/php53-apc/3.1.10/apc.php" to any site to see APC's usage. ......
指示通りphp.iniに設定を追加して、php-fpmを再起動 (これがいまいちまだよくわかってない…)
$ ps ax | grep php 493 ?? Ss 0:00.17 /usr/local/Cellar/php/5.3.10/sbin/php-fpm 494 ?? S 0:01.15 /usr/local/Cellar/php/5.3.10/sbin/php-fpm 495 ?? S 0:01.37 /usr/local/Cellar/php/5.3.10/sbin/php-fpm $ kill -TERM 493 $ php-fpm
↑とりあえずkillしてから実行してみてる phpinfo()で確認OK!
まずはnginxのインストール。
$ brew options nginx nginx --with-passenger Compile with support for Phusion Passenger module --with-webdav Compile with support for WebDAV module
今回はどちらもいらないので普通に brew install nginx で設定をいじる。
$ cd /usr/local/etc/nginx $ vim nginx.conf
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; include /usr/local/etc/nginx/sites-enabled/*; }こうしておいた
$ mkdir sites-enable $ mkdir sites-available
このディレクトリ必要なの?って思ったけど、シンボリックリンクの作成/削除で複数ファイルの管理ができるよってことなんですね。なんかかっこいいですね。
で、availableの方に…
$ vim sites-available/localhost server { listen 8080; server_name localhost; root /Users/kozo/Web/nginx/localhost/public; access_log /Users/kozo/Web/nginx/localhost/logs/access.log; error_log /Users/kozo/Web/nginx/localhost/logs/error.log warn; location / { index index.html index.htm index.php; } location ~ \.php$ { include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
とした。
続いてphpのインストール。
$ brew options https://raw.github.com/ampt/homebrew/php/Library/Formula/php.rb php --with-mysql Include MySQL support --with-pgsql Include PostgreSQL support --with-mssql Include MSSQL-DB support --with-fpm Enable building of the fpm SAPI executable --with-apache Build shared Apache 2.0 Handler module --with-intl Include intl extension --with-readline Include readline extension
適当にオプション付けて
$ brew install https://raw.github.com/ampt/homebrew/php/Library/Formula/php.rb --with-mysql --with-pgsql --with-fpm --with-intl --with-readline
そしたらエラー!
ココでも見てなんとかしろや的なこと言われたので見てみる
https://github.com/mxcl/homebrew/wiki/checklist-before-filing-a-new-issue
brew updateか。
$ brew update
またエラー。というかgitのリポジトリでconflict的なことが起きてるのかな?
$ cd /usr/local/ $ git fetch origin/master $ git reset --hard origin/master $ brew update Already up-to-date.
OK! phpのインストール出来ました。 このままだとcliがMacにプリインストールされてる方を見ちゃうので
$ vim ~/.bash_profile $ export PATH="$(brew --prefix)/bin:$PATH"
上記を追加しました。
$ php -v PHP 5.3.10 (cli) (built: Apr 16 2012 17:15:01) Copyright (c) 1997-2012 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies with Xdebug v2.1.2, Copyright (c) 2002-2011, by Derick Rethans
よし。で、fpmの起動用plist作成
$ vim ~/Library/LaunchAgents/php-fpm.plist
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd" > <plist version='1'> <dict> <key>Label</key><string>org.php.php-fpm</string> <key>ProgramArguments</key> <array> <string>/usr/local/sbin/php-fpm</string> <string>--fpm-config</string> <string>/usr/local/Cellar/php/5.3.10/etc/php-fpm.conf</string> </array> <key>Debug</key><false/> <key>RunAtLoad</key><true/> <key>KeepAlive</key><false/> <key>UserName</key><string>kozo</string> </dict> </plist>
※.plistの拡張子付けないと後のlaunchctl loadで怒られました
php-fpm起動!
$ launchctl load -w ~/Library/LaunchAgents/php-fpm.plist
最終確認
$ cd ~/Web/nginx/localhost/public/ $ vim index.php <?php echo 'Hello' ?>
と書いて http://localhost:8080/ を開いて Hello でました! 思ってたより簡単だったけどちょっと戸惑った。
参考にしたサイト
※追記 2012/04/17
再起動はこうすればいいらしい:
$ sudo nginx -s stop && sudo nginx