素人開発者が戯言
そんな技術備忘録。カテゴリの偏りからすでに得た知識も書くかも。←そんなことはなかった
ちゃんとロックされるfile_get_contents | file
2010/11/29
Mon. 00:47
前回の記事、file_put_contentsの罠にて標準関数の脆弱性について触れましたが、読み込みを行う場合にもロックは必要です。
例によってfile_get_contents等の関数はロックしてくれません。
そんなわけで、以下は安全安心なfile_get_contents関数およびfile関数です。
file関数の方はFILE_SKIP_EMPTY_LINESとFILE_IGNORE_NEW_LINESの二点のフラグに対応しています。
function _file_get_contents($fname) {
if ($fp = fopen($fname, 'c')) {
flock($fp, LOCK_EX);
$buf = '';
while ($get = fgets($fp, 1024)) $buf .= $get;
fclose($fp);
return $buf;
} else {
return false;
}
}
function _file($fname) {
$buf = array();
$flg = func_get_args(1);
$f_FSEL = $flg & FILE_SKIP_EMPTY_LINES;
$f_FINL = $flg & FILE_IGNORE_NEW_LINES;
if ($fp = fopen($fname, 'r')) {
flock($fp, LOCK_EX);
while ($get = fgets($fp, 1024)) {
if ($f_FSEL) {
if (trim($get) == '') continue;
}
$buf[] = ($f_FINL) ? trim($get) : $get;
}
fclose($fp);
return $buf;
} else {
return false;
}
}
例によってfile_get_contents等の関数はロックしてくれません。
そんなわけで、以下は安全安心なfile_get_contents関数およびfile関数です。
file関数の方はFILE_SKIP_EMPTY_LINESとFILE_IGNORE_NEW_LINESの二点のフラグに対応しています。
function _file_get_contents($fname) {
if ($fp = fopen($fname, 'c')) {
flock($fp, LOCK_EX);
$buf = '';
while ($get = fgets($fp, 1024)) $buf .= $get;
fclose($fp);
return $buf;
} else {
return false;
}
}
function _file($fname) {
$buf = array();
$flg = func_get_args(1);
$f_FSEL = $flg & FILE_SKIP_EMPTY_LINES;
$f_FINL = $flg & FILE_IGNORE_NEW_LINES;
if ($fp = fopen($fname, 'r')) {
flock($fp, LOCK_EX);
while ($get = fgets($fp, 1024)) {
if ($f_FSEL) {
if (trim($get) == '') continue;
}
$buf[] = ($f_FINL) ? trim($get) : $get;
}
fclose($fp);
return $buf;
} else {
return false;
}
}
スポンサーサイト
[edit]
« [PHP]様々な速度計測 | [PHP]file_put_contentsの罠 »
この記事に対するコメント
気づいた事を2点ほど。
・_file_get_contents()で使用しているfopen()は、'c'モードではなく'r'モードでオープン。
・PHP5.3.2からはflock($fp, LOCK_UN);を明示しないといけません。
通りすがり #- | URL | 2011/11/08 12:22 * edit *
トラックバック
| h o m e |