2009-06-16 10 views
6

PHPソースと30分レスリングした後、私は諦めました。 :P質問は、PHP flock()関数呼び出しがGentoo Linuxシステム上でどのようなシステムコールを呼び出すのですか?私はそれにいくつかの問題を抱えています(ブロック30秒間に1つの20ループ反復種類の問題)と私はそれがなぜそうであるか知りたいと思います。PHP flock() - 何がフードの下にありますか?

答えて

0

あなたが尋ねていることを誤解していない限り、PHPのflock()は、GentooのUnixシステム機能flock()への呼び出しです。彼らは同じセマンティクスを持っています。

+0

セマンティクス - はい。しかし、それは本当に群れ()と呼ぶのですか? –

+0

私はPHPのコピーを今実行していないので、私はそれを証明することができませんが、私はそう信じています。 straceで自分で試してみませんか? –

+1

私はサーバーへのFTPアクセスしか持っていません。 –

0

ネットワークドライブまたは搭載ドライブで使用していますか?私はあなたが経験しているものがdeadlockで、それについてcomments in the documentationが話しているのであれば驚かないでしょう。

The documentation for flock

+0

注意深くお読みください - Gentoo Linuxはこちら。しかし、完全なセットアップはちょっと複雑なので、私はちょうどそれが下に呼び出すものを知りたいので、私は完全な絵を自分で一緒に置くことができます。 –

+0

いいえ、デッドロックではありません。私は確信しています。しかし、私が疑っている他のものがあります。 –

+1

ああ、私はそのファイルがNFSマウント上にあることを知りました。ホストボックスも(ロードバランスのWebサーバーを参照してください)集めようとしています。 –

3

// 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;