PhalconやらLaravelやらZendFrameworkやら、、PHPのフレームワークを使ってて「セッションがおかしい!」とお嘆きのあなたへ。

PHPでもフレームワーク、便利じゃないですか。

CakePHP、Symfony、Zend Framework、FuelPHP、CodeIgniter、Laravel、ほとんど使って、今はPhalconに落ち着いた私です。

で、つい最近そういうフレームワークを使っている人が、

「どうにもセッションがおかしい!ページ遷移してもindexコントローラを読んでる」

みたいなことを言う人がいて。確かにセッションの動きって怪しいな?と思う時あるし、特にフレームワークのライブラリとかを使っている場合、中をちゃんと読まないと不安ですよね。まあよく分からない場合はベタにセッションを扱えばいいんです。

でもね、上記のような事態に陥ってここに検索できた人に、少しでも助けになればとメモしておきます。フレームワーク、大体ルーターがついてるじゃないですか。document_rootのindex.phpがbootstrap的に走るじゃないですか。そうするとウェブサーバでURIをrewriteし、


    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]

みたいに書くじゃないですか。

話は変わるんですけど、ほとんどのブラウザはファビコン、「favicon.ico」を読み込みますよね? で、favicon.icoの実ファイルは置いてありますか?

ファビコンがリクエストされたらどうなりますか?

http://www.example.com/favicon.ico

にリクエストされて、Apacheが上記設定で、実ファイルがなかったら、

http://www.example.com/index.php

にアクセスがいきますよね?
つまりそういうことです。

誰かの助けになれば!

AWS EC2で nginx php55-fpm phalcon を動かす。

AWS EC2で nginx & php55-fpm 上で phalcon を動かしてみた。本当はphp5.6が入れたいんですが・・。手間が2段階ぐらい上がっちゃうんですよね。

まず、nginxをインストール。

# yum install nginx

php用のリポジトリを追加。

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

remiのphp5.5を有効にしておきましょう。

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

[remi]
name=Les RPM de remi pour Enterprise Linux 6 - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/6/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/6/remi/mirror
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

[remi-php55]
name=Les RPM de remi de PHP 5.5 pour Enterprise Linux 6 - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/6/php55/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/6/php55/mirror
# WARNING: If you enable this repository, you must also enable "remi"
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

[remi]と[remi-php55]のenableを1に。

で、php5.5系をどどっとインストールします。

# yum install php55 php55-devel php55-fpm php55-mbstring php55-mcrypt php55-opcache php55-pdo

phalconの為のgccとgitもついでに。

# yum install gcc git

phalconをダウンロード。

$ git clone git://github.com/phalcon/cphalcon.git

でインストール。

cd cphalcon/build/
# ./install

phalconの設定ファイルを作りましょう。

# vi /etc/php-5.5.d/phalcon.ini

extension=phalcon.so

それでは順番に起動していきます。

# /etc/init.d/php-fpm start
# /etc/init.d/nginx start

特にエラーもなければ、自動起動にしておきましょう。

# /sbin/chkconfig nginx on
# /sbin/chkconfig php-fpm on

後は、nginxの設定をすればとりあえず動くところまではいったと思います。

改めて homebrew で macにphp5.5をインストール。

いつも書きますけど、「Homebrew(ホームブルー)」なんですよね。読み方は。

「Mac OS Xオペレーティングシステム上でソフトウェアの導入を単純化するパッケージ管理システムのひとつである。」

とWikiにありますが、最近ほんとに便利になってきたなと思って、(前から?) 思い切ってhomebrewごと新しくして、php5.5のインストールからやってみました。MacPortsは最近どうなんでしょうね。

(自己責任で)ずばっと、

# rm -rf /usr/local/

前も書きましたが、brewは rootで実行しない!(←よくやりました。これ。なので /usr/local の permissionがめちゃくちゃでした)

で、公式の通り

$ ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

$ brew doctor

で問題ないかのチェックを忘れずに。

で、php5.5をインストール。本当は5.6が使いたいのですが、EC2にさくっとphp5.6が入らないので。。

$ brew install php55

で、

$ brew install php55
Error: No available formula for php55
Searching formulae...
Searching taps...
homebrew/php/php55-amqp                 homebrew/php/php55-pimple
homebrew/php/php55-apcu                 homebrew/php/php55-proctitle
homebrew/php/php55-augmentedtypes       homebrew/php/php55-propro

No availableだそうですが、tapsも探してくれるようになったんですよね。便利。前から?

$ brew tap homebrew/php

でtapを追加。

$ brew instal php55

==> Installing php55 from homebrew/homebrew-php
Cloning into '/usr/local/Library/Taps/homebrew/homebrew-dupes'...

homebrew-dupesも自動で追加されましたね。

これでインストール出来ないという方はぜひコメントをください。誰がやっても同じ結果になる、というのがパッケージツールを使う意義なので。ぜひぜひ。

nginxでphp、ルートディレクトリのindex.phpが動かない?!

nginxをインストールした後、phpを動かしたければ

        location ~ \.php$ {
            root           /var/www/html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }   

上記コメントアウトされている箇所を有効にすればOK!みたいによく書いてありますが、これだけだと

localhost:8080/index.php

は表示されるんですが、

localhost:8080/

だと、index.phpが表示されずにindex.htmlが表示される!なんで?!と思っていたのですが nginx.conf の上のほうに

        location / { 
            root   html;
            index  index.html index.htm;
        }   

とルートの場合は index.htmlを呼ぶようになっていたからなのでした。こんなのでハマってしまったので誰かの為にメモ。
phpのコメントアウト外せば動くのかな〜と思いますよね?(^_^;)

PHPのパフォーマンスを引き出すベストプラクティス

PHPのパフォーマンスを引き出すベストプラクティス63の日本語訳メモ

http://hayo0914.hatenablog.com/entry/2012/04/05/023227

ちょっと懐かしい記事ですが、メモメモ。

if (strlen($foo) < 5) よりもif (!isset($foo{5}))のほうが速い(文字列を配列として扱う)。

こんな書き方されてるの見たらズッコケますが、知らないよりは知っていたほうがいいほうが知識ですね。

macでbrewでphpを入れていつまでも”Unable to load dynamic library”が消えない

ソフトウェアの導入を単純化する、パッケージ管理システムで楽をするために homebrew を使っているのに、こんなにハマるなんて(-_-;)
MacPortsから乗り換えたのが正解だったのかどうか。

ハマリすぎてhomebrewについて色々調べてしまいました。
読み方も「Homebrew(ホームブルー)」なんですね。

#余談ですが、読み方が怪しいのはちゃんと英和辞典で調べる質です。確かにbrewはブルーでした。
#よく海外のゲームで出てくるんですけど脳内でブリューブリュー言ってましたね。。

といわけで、いつまでたってもlibraryへのリンクが貼られないという事態になってました。

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/Cellar/php55/5.5.21/lib/php/extensions/no-debug-non-zts-20121212/php_mbstring.so' - dlopen(/usr/local/Cellar/php55/5.5.21/lib/php/extensions/no-debug-non-zts-20121212/php_mbstring.so, 9): image not found in Unknown on line 0

一時は php_mbstring.dll が無いと言われる始末・・おい!それはWidowsだろ!(笑)

どうも色々突っ込めるので突っ込んでしまって、それを慣れない内は sudo で install したりしてたので、なんどunlink uninstallして再インストールしても上書きできずにハマっていたのが真相みたいです。

$ brew uninstall php55

で /usr/local/Cellar/php55/ が消されているのを確認して、

# rm -rf /usr/local/etc/php
# rm -rf /usr/local/opt/php

してしまってください。そして再インストールで

$ brew install php55

非常にスッキリしました。
やっぱり sudo で brew install をしてたのが原因っぽいと思います。。
この世の誰かの役に立てばとメモしておきます。

PHPMDでコードの混乱を探知!とな

http://qiita.com/syossan27/items/d2f8c3b9fdfaaf5ff43f

PHPMDには次の4つを静的解析する機能があります。

潜在バグ
次善コード
複雑過ぎる問題
未使用のパラメータ、メソッド、プロパティ

とのことで、PHPもこの手のがよく出てきましたね。
例にならってざっと使ってみたいと思います。

PHP Warning: date_default_timezone_get()

なんて出ましたけど。。

composerをmacにインストール

一応メモとして。

$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer

後は使うところで、composer.jsonを作って、

$ composer install

ですね。

php: Fatal Error をキャッチするには

PHPはFatalエラーはキャッチできないと聞いて「そうだっけ?」と色々調べてみました。

結果Fatalエラーだと、どの段階で止まったというのは分からない、、という感じなんですかね?

http://keicode.com/cgi/php-error-handling.php

この辺をみると、 register_shutdown_function() で Fatal Error を捕まえられるらしいが、実質何もしないときと情報源が変わらず、せいぜい後処理をしてから終了できるくらいのようだ。
作ってみる

みたいです。
http://bmath.org/wordpress/?p=1118

MySQLのrootパスワードを忘れて再更新

パスワードを忘れたというか、MySQLをインストールした時に設定したパスワードを入れてもログインできない!まあ同じ様なものですが(笑)

rootパスワードをリセットする方法、忘れがちなのでメモっておきます。

http://open-groove.net/mysql/forgetting-mysql-rootpass/

スタンダードな対処法
1.MySQLインスタンスを停止する。
2.認証スキップモードで起動する。セーフモード、ともいうらしい。

# /usr/bin/mysqld_safe –skip-grant-tables &

※mysqld_safeのパスは標準では上記のようになると思うが、環境によっては違うかも。

3.認証なしでログイン。

# mysql -u root

4.rootパスワードを更新

mysql > UPDATE mysql.user SET password=PASSWORD(‘new-passowrd’) WHERE User= ‘root’;
mysql > FLUSH PRIVILEGES;
mysql > ¥q

剣呑剣呑。