PHPソースと30分レスリングした後、私は諦めました。 :P質問は、PHP flock()関数呼び出しがGentoo Linuxシステム上でどのようなシステムコールを呼び出すのですか?私はそれにいくつかの問題を抱えています(ブロック30秒間に1つの20ループ反復種類の問題)と私はそれがなぜそうであるか知りたいと思います。PHP flock() - 何がフードの下にありますか?
答えて
あなたが尋ねていることを誤解していない限り、PHPのflock()
は、GentooのUnixシステム機能flock()
への呼び出しです。彼らは同じセマンティクスを持っています。
ネットワークドライブまたは搭載ドライブで使用していますか?私はあなたが経験しているものがdeadlockで、それについてcomments in the documentationが話しているのであれば驚かないでしょう。
注意深くお読みください - Gentoo Linuxはこちら。しかし、完全なセットアップはちょっと複雑なので、私はちょうどそれが下に呼び出すものを知りたいので、私は完全な絵を自分で一緒に置くことができます。 –
いいえ、デッドロックではありません。私は確信しています。しかし、私が疑っている他のものがあります。 –
ああ、私はそのファイルがNFSマウント上にあることを知りました。ホストボックスも(ロードバランスのWebサーバーを参照してください)集めようとしています。 –
// example: $stream = fopen(FILE, 'rb') or die('???');
$md = stream_get_meta_data($stream);
echo $md['wrapper_type'];
flock($stream);
プレーンファイルの場合、php関数flock()の呼び出しは、flock()を呼び出すphp_stdiop_set_option(...)によって処理されます。 PHPがHAVE_FLOCKでコンパイルされているかどうかによって、
flock()システムコールか、
fcntl()を使用するflock_compat.cで定義された関数になる可能性があります。私のgentooシステムでは、PHPはHAVE_FLOCKでコンパイルされました。
メイン/ストリーム/ plain_wrapper.c @静的int型php_stdiop_set_option(...):
case PHP_STREAM_OPTION_LOCKING: if (fd == -1) { return -1; } if ((zend_uintptr_t) ptrparam == PHP_STREAM_LOCK_SUPPORTED) { return 0; } if (!flock(fd, value)) { data->lock_flag = value; return 0; } else { return -1; } break;
http://www.opengroup.org/onlinepubs/009695399/functions/fcntl.html
/etc/standard/flock_compat.c [line 66]
ret = fcntl(fd, operation & LOCK_NB ? F_SETLK : F_SETLKW, &flck);
この関数が呼び出されるかどうかは、コンパイル時に依存します。定義:HAVE_FLOCK – VolkerK
セマンティクス - はい。しかし、それは本当に群れ()と呼ぶのですか? –
私はPHPのコピーを今実行していないので、私はそれを証明することができませんが、私はそう信じています。 straceで自分で試してみませんか? –
私はサーバーへのFTPアクセスしか持っていません。 –