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 =>…

PHP 5.3.14 の CVE-2012-2143

PHP

php-5.3.14 の「Fixed CVE-2012-2143」ですが、以下のように文字列中に 0x80 が含まれているとその後の文字が無視されてしまうようです(その他にも問題があるかもしれませんが)。 $ php -r 'echo crypt("r", "rl") . "\n";' rlQzQWiSUOMKQ $ php -r 'echo …

Eclipse PDT でのリモートデバッグの整理

PHP

xdebug.remote_mode や xdebug.remote_autostart の設定がよくわからなかったので整理しました。 xdebug.remote_mode req リクエスト開始時にデバッグセッションが開始されます jit 最初にエラーが発生したときにデバッグセッションが開始されます jit の場…

array_map と等価な array_walk なら array_walk の方が早いっぽい

$rows が 7 件の場合・・・ // 1秒で約290000回程度実行 array_walk($rows, function(&$row){ $row['xxx'] = 123; }); // 1秒で約180000回程度実行 $rows = array_map(function($row){ $row['xxx'] = 123; return $row; }, $rows);

PHP で forkするときの注意点

PHP

以下のコードは子プロセスの終了時に親プロセスのMySQL接続が閉じられてしまうため意図した通りに動作しません。 子プロセスで明示的に mysql_close を行わなくても php プロセスの終了時の後処理で暗黙的に mysql_close されてしまうためです。SIGTERM など…