PHP
今更感ありますが、PHP 5.5 の目玉機能である finally、ジェネレータ、コルーチンを使ってみました。 finally これまでの PHP の例外処理だと fclose などの後処理を確実に行うためには try ブロックの最後と catch ブロックの両方に書く必要がありました。 …
この記事「PHP5.3.2以降ではfcloseで自動的にアンロックされない - 徳丸浩のtumblr」で PHP 5.3.2 から fclose で自動的に flock が呼ばれなくなったというのを知り衝撃を受けました。 衝撃だったのは PHP 5.3.1 以前は fclose で明示的に flock されている …
稀にある encoding="Shift_JIS" であるにも関わらず丸数字が使われている XML は、 SimpleXML で読むと次のようなエラーになり読むことが出来ません(DOM も libxml に基づくので同様です)。 simplexml_load_file(): ~~~ parser error : switching encod…
注:これは 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)から例外を投げると、関数やメソッドの引数に使っていないただのローカル変数でも、例外から参照されてしまいます。 サンプルコード _str = $str; echo __METHOD__ . " $this->_str\n…
PHP でリソース開放などの後処理をデストラクタに行わせるのは無理がありそうなので finally が早く使えるようになるといいなーとは常々思っていましたが、また新たに次のような期待に反してデストラクタが呼ばれないケースが見つかりました。 サンプルコー…
PHP の stream_socket_client() でリモートサーバと通信する処理を作っていたときに、引数で指定しているホスト名に対して複数のIPアドレスを返すように DNS サーバで設定していたにも関わらず特定の宛先に常に接続されていたので、その原因を調べてみました…
以下のコードを実行するとどのような結果になるでしょうか? _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 と 5.4 で動作が異なります。
(2012/09/03 追記) phpDocumentor2 も入れました。 PHPUnit で vfsStream というものを使うと ファイルシステムのモック なんてことが出来るらしいので入れてみました。 最初に このページ の通りにインストールしようとしましたが上手くいきませんでした。…
[PHP] 三項演算子より if の方が良いこともある 追記 2013-06-24PHP は別の変数でもメモリ上は同じ実体を指していたりすることがあるため*1、状況によっては三項演算子より if で分岐した方がいいよー、という話。下記の string_cast_? は単に与えられた引数…
PHPの数字だけで構成された文字列の比較が暗黙のうちに整数の比較になる話は有名ですが、16進数の文字列でもそうなります。
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…
mod_php(Apache/PHP)で、ページの表示時にバックグラウンドで別プロセスを起動して並列に処理したい場合、次のように書くことが出来ます。 /dev/null 2>&1 &'); ただし、この方法だと Apache の子プロセスの停止や再起動時に、起動したプロセス(上の例な…
前々回 に拡張モジュールを Windows でビルドするついでに PHP 本体を拡張機能を全て無効にしてビルドしましたが、今度は拡張機能を出来るだけ有効にして PHP をビルドします。 なお、前々回とディレクトリ構成を変えていますが深い意味はありません*1。 依…
ErrorException という例外クラスがあり set_error_handler で PHP エラーを例外にして送出する方法がよく紹介されていますが、拡張モジュールの1回の関数呼び出しで複数回の 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…
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 の「Fixed CVE-2012-2143」ですが、以下のように文字列中に 0x80 が含まれているとその後の文字が無視されてしまうようです(その他にも問題があるかもしれませんが)。 $ php -r 'echo crypt("r", "rl") . "\n";' rlQzQWiSUOMKQ $ php -r 'echo …
xdebug.remote_mode や xdebug.remote_autostart の設定がよくわからなかったので整理しました。 xdebug.remote_mode req リクエスト開始時にデバッグセッションが開始されます jit 最初にエラーが発生したときにデバッグセッションが開始されます jit の場…
$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);
以下のコードは子プロセスの終了時に親プロセスのMySQL接続が閉じられてしまうため意図した通りに動作しません。 子プロセスで明示的に mysql_close を行わなくても php プロセスの終了時の後処理で暗黙的に mysql_close されてしまうためです。SIGTERM など…