MW211 EXIT

devlog
PHP/改行コード除去
2013年09月30日
改行コードを除去するには以下のようにやるのが主流らしい。
┌──────────────────────────────────────┐
│$文字列 = str_replace(array("\r\n","\r","\n"), '', $文字列);                │
└──────────────────────────────────────┘
CR、LF、CRLFいずれもいっぺんに除去できる。
分類:PHP
設計/日時の切り上げ
2013年09月29日
日時を切り上げる場合には注意が必要だ。

例えば、10秒単位に切り上げる場合(例えば、12秒は20秒に切り上げられる)、
51秒は60秒に切り上げられるのだが、時刻関数が0~59秒までしか許容していない場合、
エラーとなってしまう。
例)PHPのDateTimeクラスのコンストラクタなど

だからといって、「+1分と0秒」とかで安易に対応してはいけない。
今度は「59分51秒」の場合、「60分00秒」で0~59分しか許容していない場合、
こちらでエラーとなってしまうからだ。

切り捨てはたいてい問題はない。0秒を下回ることはないからだ。

ということで、切り捨てて、一単位分加算するという回避方法が考えられる。
例えば、こんな感じ(PHPのDateTimeクラスの例)。
┌──────────────────────────────────────┐
│if ($newDateTime->format('i') % $ブロック単位) {                            │
│    $ss = floor($newDateTime->format('s') / $ブロック単位) * $ブロック単位; │
│    $newDateTime->modify(sprintf('%04d-%02d-%02d %02d:%02d:00',             │
│                                 $newDateTime->format('Y'),                 │
│                                 $newDateTime->format('m'),                 │
│                                 $newDateTime->format('d'),                 │
│                                 $newDateTime->format('H'),                 │
│                                 $newDateTime->format('i'),                 │
│                                 $ss));                                     │
│    $newDateTime->modify('+' . $ブロック単位 . ' seconds');                 │
│}                                                                           │
└──────────────────────────────────────┘
分類:設計
PostgreSQL/現在操作中のデータベース名
2013年09月28日
現在操作中のデータベース名を取得するSQL。
┌──────────────────────────────────────┐
│SELECT current_database();                                                  │
└──────────────────────────────────────┘
分類:PostgreSQL
Windows/一時ファイル
2013年09月27日
Windows一時ファイル(「C:\Windows\Temp」配下など)は、Windowsアップデートなど
様々な処理を行った時に一時ファイルが作成される場所である。

一時ファイルなので、処理後削除されるものなのだが
削除が漏れている場合には、一時ファイルが残ってしまう場合がある。

Windows一時ファイルは定期的に自動で削除されるものではないので
削除処理を行わなければならない。
たいていの場合は、大勢に影響のないサイズなので放っておいてよいが
ディスクサイズを整理したい場合は削除がおすすめとなる。

削除方法としては、直接そのフォルダ配下から削除する方法がある。

また、「ディスククリーンアップ」でも削除できる。
その方法は、スタートメニューより以下の要領で「ディスククリーンアップ」を選択し、
「削除するファイル」で「一時ファイル」を選んで実行(OK)すればよい
┌───────────────┐┌──────────────┐
│スタートメニュー              ││ディスククリーンアップ      │
│└アクセサリ                  │├──────────────┤
│  └システムツール            ││┌───────────┐  │
│    └ディスククリーンアップ  │││ディスククリーンアップ│  │
└───────────────┘││                      └┐│
                                  ││削除するファイル        ││
                                  ││┌─────────┐  ││
                                  │││■一時ファイル    │  ││
                                  │└────────────┘│
                                  │            ┌──┐┌──┐│
                                  │            │ OK ││    ││
                                  └──────└──┘└──┘┘
分類:Windows
PHP/tempnam()の不正時
2013年09月26日
「tempnam()」は、一時ファイルを作成したい場合に、
適当なファイル名を作成してくれる便利な関数だ。

以下のように引数を指定すると、そのフルパスを返却してくれる。
┌──────────────────────────────────────┐
│tempnam(ディレクトリパス, ファイルの接頭辞);                                │
└──────────────────────────────────────┘

ところで、ディレクトリパスが存在しないものだった場合は?

この場合、Windows一時ファイル(「C:\Windows\Temp」配下など)のパスで
作成されるようだ。(但し、もちろんWindows環境での話)

ぶっちゃけ適当な文字列を指定しても(空文字も含む)、同じようだ。
分類:PHP
PHPダウンロード/readfile()は大きなファイルには使えないⅡ
2013年09月25日
「readfile()」で、大容量のファイルをダウンロードした場合以下のエラーとなる。
┌──────────────────────────────────────┐
│Fatal error:  Allowed memory size of xxxxxxxxx bytes exhausted              │
│                                   (tried to allocate xxxxxxxxx bytes) in …│
└──────────────────────────────────────┘

これを回避するには「while (@ob_end_clean());」で、
出力バッファリングをオフにしてやればいい。
┌──────────────────────────────────────┐
│while (@ob_end_clean());                                                    │
│readfile($大容量ファイル);                                                  │
└──────────────────────────────────────┘
「ob_end_clean()」の前に「@」を付けてエラーメッセージを抑止しているのは、
万一既に出力バッファリングがオフだとエラーとなってしまうため。
デバッグで「ob_get_level()」でその時点での状況を確認してみればよい。
「1」以上だとオンだ。

ということで、「fread()」とかを使わずにそのまま対応できるようだ。
分類:PHP
PHP/ZipArchive
2013年09月24日
PHP標準でZIP圧縮ができるようになった(って結構前から?)。
ZipArchiveクラスである。
include不要、即使える。

こんな感じ。
┌──────────────────────────────────────┐
│$newZipArchive = new ZipArchive();                                          │
│$result = $newZipArchive->open('test.zip',                                  │
│                               ZIPARCHIVE::CREATE);                         │
│if ($result !== TRUE) {                                                     │
│    exit('エラー');                                                         │
│}                                                                           │
│$newZipArchive->addFromString('test.txt',                                   │
│                              'てすと');                                    │
│$newZipArchive->close();                                                    │
└──────────────────────────────────────┘
即席でテキストファイルを作り、圧縮している例だ。

「addFromString()」メソッドの部分を、「addFile()」メソッドにすれば
既存ファイルを参照して、圧縮することができる。
┌──────────────────────────────────────┐
│$newZipArchive->addFile('C:\input.txt',                                     │
│                        'test.txt');                                        │
└──────────────────────────────────────┘
分類:PHP
PECL/PECLバッチのシンタックスエラー
2013年09月23日
「pecl.bat」を実行した場合に発生する以下のエラー。
  ┌────────────────────────────────────┐
  │syntax error,unexpected '(' in Unknown on line 9                        │
  └────────────────────────────────────┘
PEARの場合と同件で、パスに「Program Files (x86)」のように括弧が混じっていると、
発生するもの。
解消策としては以下の通り(PEARの場合と同じ)。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  このエラーの解消策としては、例えば「pecl.bat」の中身を以下のように変更する
  ┌────────────────────────────────────┐
  │include_path="%PHP_PEAR_INSTALL_DIR%"                                   │
  └────────────────────────────────────┘
    ↓
  ┌────────────────────────────────────┐
  │"include_path='%PHP_PEAR_INSTALL_DIR%'"                                 │
  └────────────────────────────────────┘
  全体を「"」で囲ってやるのだ(右辺だけではなく全体という点に注意)
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
なお、シンタックスエラーの行番号は直す場所の行番号と全く関係ないから注意。
分類:PECL
PHP/出力制御関数の例
2013年09月22日
まず、標準出力の例。
┌──┬───────────────────────────────────┐
│記述│echo '出力';                                                          │
├──┼───────────────────────────────────┤
│結果│出力                                                                  │
└──┴───────────────────────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
続いて、出力制御(ob)を経由した場合の例。
┌──┬───────────────────────────────────┐
│記述│ob_start();                                                           │
│    │echo '出力';                                                          │
│    │ob_end_flush();                                                       │
├──┼───────────────────────────────────┤
│結果│出力                                                                  │
└──┴───────────────────────────────────┘
ちなみに、途中で投げたしても(最後の処理を書き忘れても)補足されるようだ。
でも、これはやめた方がいいだろう。
┌──┬───────────────────────────────────┐
│記述│ob_start();                                                           │
│    │echo '出力';                                                          │
├──┼───────────────────────────────────┤
│結果│出力                                                                  │
└──┴───────────────────────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
次に、出力しないで破棄する場合の例。当然ながら何も出力されない。
┌──┬───────────────────────────────────┐
│記述│ob_start();                                                           │
│    │echo '出力';                                                          │
│    │ob_end_clean();                                                       │
├──┼───────────────────────────────────┤
│結果│(出力なし)                                                            │
└──┴───────────────────────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
直前に文字列に退避しておいた場合の例。本体がなくなっても退避されている。
┌──┬───────────────────────────────────┐
│記述│ob_start();                                                           │
│    │echo '出力';                                                          │
│    │$ob = '[' . ob_get_contents() . ']';                                  │
│    │ob_end_clean();                                                       │
│    │echo $ob;                                                             │
├──┼───────────────────────────────────┤
│結果│[出力]                                                                │
└──┴───────────────────────────────────┘
本体も出力すれば、二重に出力される。(本体はなくなっていない)。
┌──┬───────────────────────────────────┐
│記述│ob_start();                                                           │
│    │echo '出力';                                                          │
│    │$ob = '[' . ob_get_contents() . ']';                                  │
│    │ob_end_flush();                                                       │
│    │echo $ob;                                                             │
├──┼───────────────────────────────────┤
│結果│出力[出力]                                                            │
└──┴───────────────────────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ちなみにクリアして退避にすれば、本体はなくなっているので、重複しない。
┌──┬───────────────────────────────────┐
│記述│ob_start();                                                           │
│    │echo '出力';                                                          │
│    │$ob = '[' . ob_get_clean() . ']';                                     │
│    │ob_end_flush();                                                       │
│    │echo $ob;                                                             │
├──┼───────────────────────────────────┤
│結果│[出力]                                                                │
└──┴───────────────────────────────────┘
分類:PHP
PHP/出力制御関数
2013年09月21日
そのまま標準出力するのではなく、一旦出力バッファに溜め込んでから出力する。
出力バッファ内で一括置換的なことができるので便利であるらしい。

【基本】
┌──────────────┬───────────────────────┐
│ob_start()                  │開始                                          │
├──────────────┼───────────────────────┤
│ob_get_contents()           │取得                                          │
│ob_flush()                  │出力                                          │
│ob_clean                    │消去                                          │
├──────────────┼───────────────────────┤
│ob_end_flush()              │終了(出力)                                    │
│ob_get_flush()              │=ob_get_contents()+ob_end_flush()           │
│ob_end_clean()              │終了(破棄)                                    │
│ob_get_clean()              │=ob_get_contents()+ob_end_clean()           │
└──────────────┴───────────────────────┘
【確認】
┌──────────────┬───────────────────────┐
│ob_get_status()             │各種情報確認                                  │
│ob_get_level()              │階層確認                                      │
├──────────────┼───────────────────────┤
│ob_get_length()             │サイズ確認                                    │
├──────────────┼───────────────────────┤
│ob_list_handlers()          │使用中ハンドラ確認                            │
└──────────────┴───────────────────────┘
【特殊】
┌──────────────┬───────────────────────┐
│ob_gzhandler()              │gzip圧縮設定(「ob_start('ob_gzhandler');」)   │
├──────────────┼───────────────────────┤
│output_add_rewrite_var()    │URLにGETパラメータを付加                      │
│output_reset_rewrite_vars() │output_add_rewrite_var()を終了                │
└──────────────┴───────────────────────┘
【フラッシュ】
┌──────────────┬───────────────────────┐
│flush()                     │フラッシュ                                    │
├──────────────┼───────────────────────┤
│ob_implicit_flush(TRUE)     │自動フラッシュ設定(flush()不要)               │
└──────────────┴───────────────────────┘
  実際に出力するためには「ob_flush()」系の直後に「flush()」も必要。
  以下のような関係となる。
  ┌──────────────────┐
  │                        │(echo)    │
  │┌─────┌─────↓─┐      │
  ││PHP       │ 出力バッファ │      │
  │└─────└─────┬─┘      │
  │                        │ob_flush()│
  │┌─────┌─────↓─┐      │
  ││Webサーバ │ 出力バッファ │      │
  │└─────└─────┬─┘      │
  │                        │flush()   │
  │┌───────────↓┐        │
  ││ブラウザ                │        │
  │└────────────┘        │
  └──────────────────┘
分類:PHP
前へ 1 2 3 次へ