質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1283閲覧

PHPのファイルロック:配列によるオープンと更新

SQLinjection

総合スコア36

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/09/29 18:52

こんにちは。
PHPで、既に存在しているファイル「aaa.cgi」に対し、
「排他ロック+何かしら処理+ファイル更新」という処理をしようと思っています。

<aaa.cgi の中身>

あああああ

いいいいい
ううううう

<やろうとしている処理>
排他ロックを使用して、aaa.cgi の先頭や真ん中に文字を追加したり書き換えたりする。
イメージとしては次のような感じです。読み込みには配列(file関数)を利用したいと思います。

PHP

1$filename="aaa.cgi"; 2$fp=fopen("$filename", "r+"); 3if(flock($fp, LOCK_EX)) 4{ 5 $hairetsu=file("$file"); 6 7 # 何かしら処理 8// array_unshift($hairetsu, "なにこれ\n"); // 例えば先頭に追加 9// array_splice($hairetsu, 2, 0, "なにこれ\n"); // 例えば3行目に挿入 10 11// ?????? // 【※書き換えの処理※】 12 flock($fp, LOCK_UN); 13} 14fclose($fp);

現在、この【※書き換えの処理※】で何かしらうまいコードを差し込んで、
実現できないかを検討しているのですが、いかがでしょうか…
fwrite() ではstring型限定、file_put_contentsでは読み込みからの排他ロック実装が
問題としてあって解決法を探っています。

<別の解決策>

PHP

1$filename="aaa.cgi"; 2file_put_contents("$filename", "なにこれ", FILE_APPEND | LOCK_EX);

追記モードを使ってこのようにすると、aaa.cgi に排他ロックで追記できるのですが、
この場合末尾に追記されるので、上記のようにファイル先頭に追記したり、
ファイル中央付近に追記するような操作があれば…

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

array_unshiftやarray_spliceで任意の場所に差し込みができているのであれば、
配列を改行コードでimplodeしたものをファイルに書き込めば良いだけだと思います。
改行コードで連結するので差し込むときに後ろにつけている改行コードは不要ですね。

投稿2018/09/29 21:31

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SQLinjection

2018/09/30 09:10 編集

ありがとうございます。 implode() を使うのは盲点でした。面白いですねぇ… 確かにこれでstringにしてfwrite() 使って書き込むことができますね。 ただ、今回やろうとしてることは現存するファイルを読み込んで、 そのファイルの中身に対して、array_unshift() や array_splice() で追記しようとしているので、 【読み~書き までの間で排他ロックする】必要があります。 ただ、排他ロックの関係で file() のアクセスができないので、 読みの段階で共有ロックをして、書きの段階で排他ロックを掛けるしか方法はないでしょうか。 アクセスの多いコンテンツのログであるため、この方法だとログが飛ぶケースが何度かあり、改善の余地があります…。
m.ts10806

2018/09/30 10:34

今一つやりたいことがわかりませんけど、同じファイルを参照する以上は更新中は後からのアクセスには待ってもらう必要があります。 DBも同じですね。 ロック中かどうかを取得してロック中の場合は一定時間スリープして自身がロック取得できるまで再起処理するしかないのではないでしょうか。 というか、質問内容に現れていない大事な前提をさらっとコメントで書かれると回答が無駄になることがあります。 要件として質問に追記してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問