PHP5のtempnam関数について
2007年10月15日 プログラミングTIPS
PHP5.2.4にアップデートしてから、超かんたん3D円グラフ作成!、超かんたんPDF作成!、はてブコメント最新情報のページで画像ファイルやPDFファイルが表示されなくなっていました。
原因を調べてみると、ファイル自体は生成されているものの、表示するURLがおかしくなっていました。
公式のPHP: PHP 5 ChangeLogを読んでも、それらしい修正や変更点は書かれていませんでした。
プログラムをチェックしてみたところ、tempnam関数の挙動が怪しく、
tempnam関数の返り値は、
仕様が変わったのかバグなのかわかりませんでしたが、一応この仕様に合わせて、上記サイトのプログラムも変更しておきました。
現在は正常に使えるようになっているはずです。
原因を調べてみると、ファイル自体は生成されているものの、表示するURLがおかしくなっていました。
公式のPHP: PHP 5 ChangeLogを読んでも、それらしい修正や変更点は書かれていませんでした。
プログラムをチェックしてみたところ、tempnam関数の挙動が怪しく、
生成したファイル名のみを返していた動作になっていました。
↓
uri全てを返す
tempnam関数の返り値は、
返り値と書かれているので、uriを返すのではなく、ファイル名だけを返す方が正しいような気がします。
新しいテンポラリファイル名を返し、失敗した場合には FALSE を返します。
仕様が変わったのかバグなのかわかりませんでしたが、一応この仕様に合わせて、上記サイトのプログラムも変更しておきました。
現在は正常に使えるようになっているはずです。
また、tempnam関数のページを詳しく読んでみると、このようなコメントが寄せられていました。
04-Oct-2007 07:17「非常にたくさんの我々のウェブページを壊しました」と書かれていました。
It seems that in between 5.2.2 and 5.2.4 tempnam() changed how it handles a relative path:
In 5.2.2:
$file=tempnam('tmpdownload', 'Ergebnis_'.date(Y.m.d).'_').'.pdf';
echo $file;
tmpdownload/Ergebnis_20071004_xTfKzz.pdf
In 5.2.4:
$file=tempnam('tmpdownload', 'Ergebnis_'.date(Y.m.d).'_').'.pdf';
echo $file;
/var/www/html/tmpdownload/Ergebnis_20071004_Xbn6PY.pdf
This broke quite a lot of our webpages as we try to display those pdfs (and other files) via the webbrowser and the resulting URI is of course invalid and gets the user a 404 page.
その割には、この件について日本語のページで検索しても全然引っかからなかったので、ここに書いておくことにしました。
バグが多く何かと問題が起きやすいtempnam関数を使っている人は、一度チェックしてみてください。
関連リンク
- PHP5.2.0とeAcceleratorのインストールメモ
- XCacheのインストールとphp用アクセラレータ比較
- 実際に買って読んだPHPの参考書レビュー
- PHPで動いている高度なオープンソースWebアプリレビュー
- プログラマを目指す人が読んで参考になる(?)ページ
- 複数ファイル内文字列を一括置換する方法
- XCacheのインストールとphp用アクセラレータ比較