質問: こんにちは。 PHPで、既に存在しているファイル「aaa.cgi」に対し、 「排他ロック+何かしら処理+ファイル更新」という処理をしようと思っています。 <aaa.cgi の中身> > > あああああ > > いいいいい > > ううううう > > > <やろうとしている処理> 排他ロックを使用して、aaa.cgi の先頭や真ん中に文字を追加したり書き換えたりする。 イメージとしては次のような感じです。読み込みには配列(file関数)を利用したいと思います。 ``` $filename="aaa.cgi"; $fp=fopen("$filename", "r+"); if(flock($fp, LOCK_EX)) { $hairetsu=file("$file"); # 何かしら処理 // array_unshift($hairetsu, "なにこれ\n"); // 例えば先頭に追加 // array_splice($hairetsu, 2, 0, "なにこれ\n"); // 例えば3行目に挿入 // ?????? // 【※書き換えの処理※】 flock($fp, LOCK_UN); } fclose($fp); ``` 現在、この【※書き換えの処理※】で何かしらうまいコードを差し込んで、 実現できないかを検討しているのですが、いかがでしょうか... fwrite() ではstring型限定、file_put_contentsでは読み込みからの排他ロック実装が 問題としてあって解決法を探っています。 <別の解決策> ``` $filename="aaa.cgi"; file_put_contents("$filename", "なにこれ", FILE_APPEND | LOCK_EX); ``` 追記モードを使ってこのようにすると、aaa.cgi に排他ロックで追記できるのですが、 この場合末尾に追記されるので、上記のようにファイル先頭に追記したり、 ファイル中央付近に追記するような操作があれば...
回答: array_unshiftやarray_spliceで任意の場所に差し込みができているのであれば、 配列を改行コードでimplodeしたものをファイルに書き込めば良いだけだと思います。 改行コードで連結するので差し込むときに後ろにつけている改行コードは不要ですね。