タグ

ロックとphpに関するiwwのブックマーク (7)

  • PHP: flock - Manual

    flock() を使うと、(ほとんどの Unix、そして Windows さえ含む) 事実上すべてのプラットフォームで使用可能な、簡易な読み手/書き手モデルを実現できます。 ロックの解放は、fclose() が実行されるか、 stream がガベージコレクションされた段階で行われます。 PHP は、恣意的にファイルをロックする汎用の手段を提供します (これは、アクセスする全プログラムが同一のロックの方法を使用する必要があり、 そうでない場合は動作しないことを意味します)。 デフォルトでは、要求したロックが確保されるまでこの関数はブロックします。 以下で説明する LOCK_NB オプションでこの挙動を制御することができます。 パラメータ stream fopen() を使用して作成したファイルシステムポインタリソース。 operation operation は以下のいずれかとなります。 共

    iww
    iww 2018/08/01
    『5.3.2 ファイルのリソースハンドルを閉じたときにロックを自動的に解放する機能が削除されました。』
  • PHPでセッションの排他ロックを解除する

    サイトではアフィリエイト広告を利用しています。記事内および商品リンクにはプロモーションが含まれる場合があります。 session_start()についてWebを探してもあまり記事が拾えなかったので、放流しておく。 PHPでWebからAPIのモジュールを呼ぶシステムを作っていたら、モジュールの呼び出しが逐次処理になっていることが分かった。 そのシステムでは、セッションを使ってデータの読み書きをしている。 どうやらsession_start()を呼んだあと、モジュールの実行が終わるまで、セッションに排他ロックがかかってしまう模様。 PHPのセッション関連の調べ物をする時に、この辺りの話がでてこなかったので、今まで気付かなかった。 session_start()の説明を見ても、やっぱりそんなこと書いてない。 …と思っていたが、フォーラムのところに、まさにその話が出ていた。 dave1010

    PHPでセッションの排他ロックを解除する
  • PHP5.3.2以降ではfcloseで自動的にアンロックされない

    PHP家サイトでflockの説明を読んでいたら、以下の変更履歴に気がつきました。 5.3.2 ファイルのリソースハンドルを閉じたときにロックを自動的に解放する機能が削除されました。 ロックの解放は、常に手動で行わなければなりません。 http://php.net/manual/ja/function.flock.php ところがネットの解説を見ると、ロック開放はflock($fp, LOCK_UN); ではなく、fcloseでやれとしている解説が結構あります。 (4)fcloseの前にflock解除するな … fcloseの前にflock(ファイルポインタ, LOCK_UN) する人は実に多いのですが、これははっきりと間違いだと断言します @ITPHPの記事が突っ込みどころ満載 - 暴言満載 LOCK_UNは普通は使われない。ロック開放はfclose()関数でやるのが鉄則。 http

    PHP5.3.2以降ではfcloseで自動的にアンロックされない
  • @ITのPHPの記事が突っ込みどころ満載 - 暴言満載

    サンプルで理解! フォームデータの受け渡し 1ページ目 menu.phpは、排他処理を扱ったようですが、早速ひどいです。 「一般的なオンラインシステムでは同時処理に対するデータの矛盾が発生しないよう留意する必要があります。」と書いているので、単にファイルが壊れなければいいという考えではないみたいなのに。 (1)flockするまえにデータを読むな (2)file_existsのあとでwモードでファイルを開くな (3)set_file_bufferはOSのバッファリングは関係ない (4)fcloseの前にflock解除するな (1)について。ファイルにはあらかじめ 1000000004 と書いてあるとします。 ユーザー1が4行目でファイルを開く ↓ ユーザー1が5行目で $order_no に 1000000005 を代入 ↓ ユーザー2が4行目でファイルを開く ↓

    iww
    iww 2014/04/11
    『バッファを無効にしてこの問題を回避と言うのは俺に言わせれば邪道です』 邪道か・・・
  • 排他処理に stream_set_write_buffer は不要じゃね? - 暴言満載

    PHPの話。 「set_file_buffer (stream_set_write_buffer) でバッファを0にしないと排他処理が正常に行われない」なんて感じの記述がgoogleで見つかったり、PHPのユーザーの間で常識のように語られたりするんですが、なんなんでしょうかこれ。 stack*の連載PHP set_file_buffer という関数では、書き込みバッファを 0 にするという操作をしています。なぜこんなことをするかというと、通常、あるファイルに書き込みをする際には、「バッファ」...

  • Apocripha.net [PHP] fopen() "r+" "w+" どちらも「読み込み/書き込み共用です」 どない違うねんという話

    テキストファイルに書かれた数値を読み込んで1プラスして再書き込み。 カウンタとか、なにかのユニークな数値を管理するためによくやる手法かと思います。 で、同時アクセスされたときに読み書きの間で処理が前後すると同じ値が採番されてしまったりするので、だいたいは下記のような手順で進みますよね。(詳細なソースは省きます) fopen() でファイルオープン ↓ flock() で排他ロック ↓ fread() で読み込み ↓ 加算した値を計算 ↓ rewind() とか fseek() とかでファイルポインタを先頭に移動 ↓ fwrite() とかで書き込み ↓ flock() でロック解除 ↓ fclose() でファイルを閉じる ありふれた処理ではあるのですが、そういった処理はたいていDB処理することが最近多かったので、はて fopen() では読み書き両方したいときにはどんな感じで読み込めばよ

  • Perl の flock は PHP の flock をブロックするか?

    Perl の flock は PHP の flock をブロックするか? Permalink URL http://www.magicvox.net/archive/2006/04150151/ Posted by ぴろり Posted at 2006/04/15 01:51 Trackbacks 関連記事 (0) Post Comment コメントできます Category またはその逆のケース。それぞれ PerlPHP で書かれたプログラムがあって、その両者が同じファイルに読み書きする処理を考えます。ここで Perl の flock 命令でファイルを排他ロックをした場合、PHP から同じファイルへの読書きは PHP の flock でブロックされるのか?という疑問。

    Perl の flock は PHP の flock をブロックするか?
  • 1