PHP

配列からホワイトリストで指定したキーの値のみ抽出する

PHP

ポストされたデータがのなかで指定したパラメータの値のみの配列が欲しいことがよくある。foreach() や array_filter() とかでぐるぐる回さなくても良い方法があった。 http://blog.pixelastic.com/2011/05/11/whitelisting-keys-array/ より

fputcsv() で作成しする CSV ファイルの改行コードを CRLF にする

PHP

Linux などは、fputcsv() の改行コードが LF になってしまうのだが、 CRLF が望ましい場合が多いので困る。 以下のようにストリームフィルタを使う例が紹介されていた。http://stackoverflow.com/questions/12722894/how-can-i-change-the-line-endings-used…

PHP でディレクトリ以下を再帰的にファイル削除

PHP

RecursiveDirectoryIterator を使って削除。 isFile() || $item->isLink()) {…

SplFileObject で標準入力を扱うには

PHP

http://d.hatena.ne.jp/hnw/20090523 より、NoRewindIterator でラップする。

PHP の動作環境が 32bit か 64bit かを確認する

PHP

確認する方法はINTサイズを見るのが手っ取り早い。 PHP_INT_SIZE 定数が 4 の場合は 32bit、8 の場合は 64bit となる。

PHP の単体テストでファイルシステムのモックを使う

PHP

単体テストでは外部リソースへのアクセスは行わないのが基本。もちろんファイルシステムも含まれる。テスト対象コード内にある外部リソースへのアクセス処理は、アクセス先を「モック」に差し替えることで対応できる。 なるべく設計レベルでモックへの差し替…

PHP で pkcs12 形式の SSL 証明書を pem 形式に変換

PHP

ApnsPHP でプッシュ通知するのにサーバ側にPEM形式の証明書が必要。 https://code.google.com/p/apns-php/wiki/CertificateCreation証明書を更新するたびに openssl コマンドを打つのも面倒なので、PHP プログラム内で作成できるようにした。ついでに秘密鍵…

外部プログラムの呼び出し方法いろいろ

PHP

PHPで外部プログラムを呼び出すには exec() paththru() popen() proc_open() shell_exec() system() などの関数を使う。shell_exec() は、「実行演算子 バッククォート (``)」 のエイリアスでもある。popen(), proc_open() は、標準入出力をストリームとして…

array_map() を使って配列のキー/値に対して処理する

PHP

実際には foreach を使えばいいだけの話だが、 array_map(), array_keys(), array_values() の 3つの関数を組み合わせると、配列のキーと要素に対して処理できる。例: 'valueA', 'b' => 'valueB'); $result = array_map(function ($key, $value) { return …

定義済みのクラス・関数・定数・変数を取得する

PHP

PHP ソース解析のために必要になった。 定数:get_defined_constants() 変数:get_defined_vars() 関数:get_defined_functions() クラス:get_declared_classes() インターフェース: get_declared_interfaces() 命名規則で "defined" 派と "declared" 派が…

Composer で PHPUnit のインストール

php

ちまたで人気の Composer を試してみた。http://getcomposer.org/だが、pear 経由では PHPUnit がインストールに失敗する。もしかしたら Composer の不具合かもしれないが、どうやら PHPUnit のpear の管理情報 (packages.json) に問題(?)があるらしい。http…

Pimple を考える

PHP

Pimple とはなんぞや?ということで、ソースコードやドキュメントから、どのようなものかを判断してみた。(つまり実際に動作は確認していないw)Pimple とは、Silex のベースとなっている PHP5.3 上で動作する DI コンテナとのこと。 公式サイト: http://pi…

PHPで使えるDBマイグレーションツール phpmig

PHP

dbdeploy 並みにシンプルで、PHP でわりと汎用的に使えるマイグレーションツールはないかと探しているところ。 初めは、 http://www.ryuzee.com/contents/blog/4268 を参考に Doctrine1 を試してみたのだが、ORM用ファイルがたくさん生成されるのが気に入ら…

PHP の配列演算子(結合)について

PHP

配列演算子の仕様で(使えるかどうかは不明だが)オモシロい?挙動をすることが分かった。http://www.php.net/manual/ja/language.operators.array.php より + 演算子は、右側の配列を左側の配列に追加したものを返します。 両方の配列に存在するキーについ…

PHP で月の末日を取得する

PHP

指定した月の末日を取得する方法として、 「翌月1日の前日」 というロジックが常套手段だったが、 「指定した月の日数」 という考え方もできる。こちらのほうがシンプル。PHP の場合、 date() 関数のフォーマット "t"を用いて簡単に取得できる。

PHP でクローラー判定する

PHP

(参考) http://memorandum.yamasnet.com/archives/Post-217.htmlWebサーバへのリクエストがクローラーかどうかを判定したい。 今回は、リクエストヘッダーの User-Agent で判定する。 get_browser() を使う PHP では、get_browser() 関数を使うと簡単。

PHP の JpGraph を日本語対応する

Ubuntu 10.10 上で PHP のグラフ描画ライブラリ JpGraph 3.5.0b1 を試してみた。日本語対応するには、 http://blog.syuhari.jp/archives/408 に書いてあるとおりなんだけど、IPAフォントでなくてもいけた。今回は、Takaoフォントを使用してみた。

Debian lenny の PHP セッション GC メモ

Debian lenny の PHP セッションは、ファイルを CRON で削除していた。 そして、php.ini の設定で セッションGC は無効な状態だった。php.ini を見ると、コメントで以下のように書かれている。 ; This is disabled in the Debian packages, due to the stric…

PHP で帳票出力

PHP

PHPでお金をかけずにPDF出力する方法の覚書 によると、 PHPからPDFを出力する方法は大まかに分けて3種類ある。 文字とか画像を座標を指定してページ上にコツコツ配置していく方法 テンプレートとなるwordやpdfファイルの文字列や画像を置換する方法 pdf以外…

PHP の float から文字列への型キャスト

PHP

http://d.hatena.ne.jp/mikeda/20090228/1235839592より、浮動小数点数(float型)を文字列に変換する場合、printf(), spfintf()を使おう。 結果が意図した書式にならない場合(科学表記)になることがある。 1.0E-5 echo sprintf('%f', $f), "\n" # => 0.00001…

PHP マジック:パラメータ名にドット(.)を使ってはいけない

PHP

register_global を有効にした場合、パラメータ名にドットがあると不都合があるという理由で、リクエストのパラメータ名にドット(.)が含まれていると無条件にアンダースコア(_)に変換されることが分かった。 この変換ルールは、 $_POST, $_GET, $_COOKIE, $_…

PHP で非同期処理(キューイング)

beanstalkd というジョブキュー管理サーバを使って PHP で非同期処理をしてみる。Ubuntu 10.04 にはパッケージが用意してあった。beanstalkd のインストール: $ sudo aptitude install beanstalkd/etc/defaults/beanstalkd を編集: # ↓以下のオプションを有…

64bit 環境での PHP マジック (その1)

PHP

64bit 環境で PHP を使うと整数の方が浮動小数の仮数部よりも精度が高いために、== での比較の前に丸め込みが発生し、以下のようなおかしな結果がえられる。 true 今のところ、PHP を使ってこの境界値付近を計算することはないと思うけどね。

PHPで扱える整数の上限

PHP

PHP_INT_MAX で整数の上限が分かる。徐々に 64 bit 環境が増えてきたので、どのくらい違うのか調べてみた。(32 bit の場合): $ php -r 'echo PHP_INT_MAX, "\n";' 2147483647 (64 bit の場合): $ php -r 'echo PHP_INT_MAX, "\n";' 9223372036854775807 整数…

携帯の絵文字出力

PHP

文字列中に埋められた「絵文字番号」を本来のコードに変換したい。絵文字を出力する方法として、 http://www.trekdevel.net/archives/633 が、ほぼ完璧に要件を満たしてくれている。今回は、以下の制約があるため、自分で実装することにした。 文字コードは…

APC (Alternative PHP Cache) を使ってみた

APC (Alternative PHP Cache) は PHP の実行コードをキャッシュするモジュール。追加するだけでパフォーマンスをアップできる。また、実行コードだけでなく、任意のオブジェクトのキャッシュもできる(最近知った)。http://php.net/manual/ja/book.apc.php …

Debian lenny で php5-curl と php5-pgsql の相性悪い

Debian lenny にて、php をコマンドラインで実行していると、特定のスクリプトで pg_close() 時に "Segmentation fault" が発生してしまう。php5-curl を外せばパーフェクトに動作する。残念だけど、以下のバグが残っているようだ。 http://bugs.php.net/bug…

PHP の mb_encode_mimeheader() の正しい使い方

PHP

「mb_encode_mimeheader()に渡す文字列はISO-2022-JPに変換するな。」 http://blog.cheki.net/archives/1125 ということらしい。mb_encode_mimeheader() は、 第一引数:内部エンコードの文字列 第二引数:"ISO-2022-JP" でいいみたい・・・。

一時ファイル用ディレクトリのパスを取得

PHP

PHP 5.2.1 から sys_get_temp_dir() が使える。それ以前なら環境変数から取得する。http://php.net/manual/ja/function.sys-get-temp-dir.php

variables_orderの設定とgetenv()推進キャンペーン

PHP

PHP で環境変数を取得したい場合、$_ENV は、variables_order の設定によって使えたり使えなかったりするので、getenv() を使いましょうというキャンペーンらしい。http://blog.asial.co.jp/316う〜これにはハマりました。INI ファイルで仕様が変わる言語っ…