PHP

ファイルの更新を監視してコマンドを実行するワンライナー

phpunit を実行させるために Grunt を使いましたが・・・ PHP 開発でも Grunt を使う - ngの日記 まあファイルの更新を監視して phpunit(に限らず任意のコマンド)を実行するだけならワンライナーです。 $ inotifywait -e create,delete,modify,move -mr sr…

PHP 開発でも Grunt を使う

PHP Advent Calendar 2013 in Adventar の3日目です。 前日は @matsubo さんの コピペで出来るComposer導入 でした。Composer、私も使ってます。 Grunt とは Node.js で作られた色々な作業を自動化するためのツールです。 普通は Node.js での開発や js と…

クロージャーの static 変数はインスタンス変数なのか?

PHP

次のコードを実行すると、

Zend Framework 2 でテストごとにDB接続してコネクションが枯渇する

はじめに この記事 の続きです。 Zend Framework 1 で発生した、テストの実行時にDBのコネクションを使い果たしてしまう問題は Zend Framework 2 でも同じように発生します。 この問題に気づいたのは Zend Framework 2 のチュートリアル で Album モジュール…

Zend Framework 1 でテストごとにDB接続してコネクションが枯渇する

はじめに 最近 Qiita に↓このようなものを投稿しましたが、どちらも Zend Framework 2 を使っていて気づいたものです。 PHPUnit の TestCase のメンバはテストが完了するまで解放されない - Qiita [キータ] PHP - SPLのコンテナクラスで循環参照するとGCで回…

phpenv を Windows の msysgit で動かす

PHP

phpenv を Windows の msysgit で動かしてみました。 ただし php-build は使わないので PHP そのもののインストールは手動です・・・単にバージョンを切り替えるだけです。 なお、全ての作業は msysgit の bash で行います。 readlink まずは readlink コマ…

Zend Framework 2 の ZendDeveloperTools で GitHub API の 403 エラーが表示される

Zend Framework 2.1.5 でデバッグツールバー(ZendDeveloperTools)を入れてみたところ、次のようなエラーが表示されました。 Warning: file_get_contents(https://api.github.com/repos/zendframework/zf2/git/refs/tags/release-): failed to open stream:…

プロキシ環境下で composer でインストール出来なくなった(HTTP/1.0 400 Bad Request)

PHP

なぜか自社の社内から zf2 や phpunit が composer でインストール出来ない・・・少し前まで出来ていたはずなのに $ cat composer.json { "require": { "zendframework/zendframework": ">2.1.3" } } $ php composer.phar install -vvv Downloading composer…

SIGCHLD を SIG_IGN すると mail 関数が false を返す

PHP

以下のコードを実行すると mail 関数が false を返します。

PHP vld を使ってみた

PHP

今月に入ってから 1 回もブログを書いていなかったのでわりとどうでもいい小ネタを。 はじめに PHP vld を使うと opcode が簡単に表示できて便利です。 PECL :: Package :: vld PHP vld インストール - yoyaのメモ インストール方法とか使い方はリンク先参照…

php 5.3 の Cannot use string offset as an array の詳細

PHP

Qiita に投稿した内容ですが、次のコードは php 5.3 と 5.4 で結果が異なります。 $str = "hoge"; var_dump($str[0][0]); 5.4 の場合 string(1) "h" 5.3 の場合 Fatal error: Cannot use string offset as an array もっと調べた php 5.3 では $str[0] のよ…

PHP のシグナルハンドラのいろいろ

PHP

ここ数年、PHP でシグナルを使う機会が多かったので、気づいた点などを整理してみます。 本当のシグナルハンドラと PHP のシグナルハンドラ pcntl_signal() で登録する PHP のシグナルハンドラは、本当の意味でのシグナルハンドラではありません。なので、シ…

PHP 5.5.0 alpha を使ってみた

PHP

今更感ありますが、PHP 5.5 の目玉機能である finally、ジェネレータ、コルーチンを使ってみました。 finally これまでの PHP の例外処理だと fclose などの後処理を確実に行うためには try ブロックの最後と catch ブロックの両方に書く必要がありました。 …

PHP 5.3.1 以前では fclose で明示的にアンロックされてしまう

PHP

この記事「PHP5.3.2以降ではfcloseで自動的にアンロックされない - 徳丸浩のtumblr」で PHP 5.3.2 から fclose で自動的に flock が呼ばれなくなったというのを知り衝撃を受けました。 衝撃だったのは PHP 5.3.1 以前は fclose で明示的に flock されている …

Shift_JIS なのに丸数字が使われた XML を SimpleXML で読み込む

PHP

稀にある encoding="Shift_JIS" であるにも関わらず丸数字が使われている XML は、 SimpleXML で読むと次のようなエラーになり読むことが出来ません(DOM も libxml に基づくので同様です)。 simplexml_load_file(): ~~~ parser error : switching encod…

CentOS6 で remi から php や mysql をインストールするための yum の設定

注:これは Qiita に投稿した内容と同じです epel リポジトリを追加します(remi-release-6 が依存している)。 rpm --import http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/RPM-GPG-KEY-EPEL-6 rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/d…

カスタムエラーハンドラ(set_error_handler)から例外を投げるとスコープ内の変数が例外から参照される

PHP

前回と同じような話ですが、カスタムエラーハンドラ(set_error_handler)から例外を投げると、関数やメソッドの引数に使っていないただのローカル変数でも、例外から参照されてしまいます。 サンプルコード _str = $str; echo __METHOD__ . " $this->_str\n…

オブジェクトが例外の呼び出し履歴に参照されてデストラクタが呼ばれない

PHP

PHP でリソース開放などの後処理をデストラクタに行わせるのは無理がありそうなので finally が早く使えるようになるといいなーとは常々思っていましたが、また新たに次のような期待に反してデストラクタが呼ばれないケースが見つかりました。 サンプルコー…

PHP のソケット通信で1つのホストに複数アドレスが返る場合の優先されるアドレス

PHP

PHP の stream_socket_client() でリモートサーバと通信する処理を作っていたときに、引数で指定しているホスト名に対して複数のIPアドレスを返すように DNS サーバで設定していたにも関わらず特定の宛先に常に接続されていたので、その原因を調べてみました…

PHPでインスタンスを作成するメソッドをチェーンした場合のオブジェクトの寿命

PHP

以下のコードを実行するとどのような結果になるでしょうか? _id = $id; echo "ctor $this->_id\n"; } public function __destruct() { echo "dtor $this->_id\n"; } public function func($id) { return new self($id); } public static function create($i…

PHP 5.4 は クロージャーに $this が暗黙的に束縛されるため 5.3 と動作が異なってしまうことがある

PHP

PHP 5.4 ではクラスのインスタンスメソッド内で定義したクロージャーには $this が暗黙的に束縛されてしまうため、次のコードは 5.3 と 5.4 で動作が異なります。

Windows で PHPUnit と vfsStream と phpDocumentor2 を入れる

PHP

(2012/09/03 追記) phpDocumentor2 も入れました。 PHPUnit で vfsStream というものを使うと ファイルシステムのモック なんてことが出来るらしいので入れてみました。 最初に このページ の通りにインストールしようとしましたが上手くいきませんでした。…

三項演算子より if の方が良いこともある

PHP

[PHP] 三項演算子より if の方が良いこともある 追記 2013-06-24PHP は別の変数でもメモリ上は同じ実体を指していたりすることがあるため*1、状況によっては三項演算子より if で分岐した方がいいよー、という話。下記の string_cast_? は単に与えられた引数…

PHPの数字文字列の比較は16進数でも有効

PHP

PHPの数字だけで構成された文字列の比較が暗黙のうちに整数の比較になる話は有名ですが、16進数の文字列でもそうなります。

PHP 5.3.15 の CVE-2012-2688 と bug #62432

PHP

PHP の 5.4.5 と 5.3.15 がリリースされましたが、幾つか気になる変更点について内容を確認してみました。 Fixed potential overflow in _php_stream_scandir, CVE-2012-2688 修正差分は次の通りです。PHP Git Repositories - php-src.git/blobdiff - main/s…

PHP からバックグラウンド起動させたプロセスを Apache の停止や再起動後も続行させる ← 失敗

PHP

mod_php(Apache/PHP)で、ページの表示時にバックグラウンドで別プロセスを起動して並列に処理したい場合、次のように書くことが出来ます。 /dev/null 2>&1 &'); ただし、この方法だと Apache の子プロセスの停止や再起動時に、起動したプロセス(上の例な…

PHP を Windows でビルド

PHP

前々回 に拡張モジュールを Windows でビルドするついでに PHP 本体を拡張機能を全て無効にしてビルドしましたが、今度は拡張機能を出来るだけ有効にして PHP をビルドします。 なお、前々回とディレクトリ構成を変えていますが深い意味はありません*1。 依…

PHP の set_error_handler で設定した関数が例外を投げた場合の動作(with 拡張モジュール)

PHP

ErrorException という例外クラスがあり set_error_handler で PHP エラーを例外にして送出する方法がよく紹介されていますが、拡張モジュールの1回の関数呼び出しで複数回の PHP エラーが発生した場合にどのような動作になるのか気になったので調べてみま…

PHP拡張モジュールを Windows でビルド

PHP

参考URL https://wiki.php.net/internals/windows/stepbystepbuild 必要なもの とりあえず下記のものを準備します。 Microsoft Visual C++ 2010 Express*1 PHP ソースファイル ... PHP: Downloads php-sdk ... windows.php.net - /downloads/php-sdk/ php-sd…

Windows版の pdo-mysql で MYSQL_ATTR_READ_DEFAULT_FILE が未定義だった

PHP

PHP の PDO でキャラクタセットを指定するときは次の様に行なっています。 $pdo = new PDO("mysql:host=127.0.0.1;dbname=test", $username, $password, array( PDO::MYSQL_ATTR_READ_DEFAULT_FILE => '/etc/my.cnf', PDO::MYSQL_ATTR_READ_DEFAULT_GROUP =>…