6

PHP ソースと 30 分間格闘した後、あきらめました。:P 問題は、Gentoo Linux システムで、PHP flock() 関数呼び出しがどのようなシステム コールになるかということです。私はそれにいくつかの問題を抱えています ( 20 ループ反復ごとに 30 秒間ブロックするような問題) があり、その理由を知りたいです。

4

4 に答える 4

3

// example: $stream = fopen(FILE, 'rb') or die('???');
$md = stream_get_meta_data($stream);
echo $md['wrapper_type'];
flock($stream);
これがplainfileを出力する場合、php 関数 flock() の呼び出しは、flock() を呼び出す php_stdiop_set_option(...) によって処理されます。PHP が HAVE_FLOCK でコンパイルされたかどうかに応じて、これはシステム コールflock()またはfcntl()を利用する flock_compat.c で定義された関数である可能性があります。私の gentoo システムでは、PHP は HAVE_FLOCK でコンパイルされていました。

main/streams/plain_wrapper.c @ static int php_stdiop_set_option(...):

       ケース PHP_STREAM_OPTION_LOCKING:
            もし (fd == -1) {
                -1 を返します。
            }

            if ((zend_uintptr_t) ptrparam == PHP_STREAM_LOCK_SUPPORTED) {
                0 を返します。
            }

            if (!群れ(fd, 値)) {
                data->lock_flag = 値;
                0 を返します。
            } そうしないと {
                -1 を返します。
            }
            壊す;
于 2009-06-16T14:49:33.170 に答える
2

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);
于 2009-06-16T15:00:59.450 に答える
0

あなたが求めていることを誤解していない限り、PHPはGentoo 上flock()の Unix システム関数の呼び出しです。flock()それらは同一のセマンティクスを持っています。

于 2009-06-16T14:12:18.207 に答える
0

ネットワークまたはマウントされたドライブで使用していますか? あなたが経験しているのはdeadlockであり、ドキュメントのコメントのいくつかがそれについて語っている場合でも、私は驚かないでしょう。

flock のドキュメント

于 2009-06-16T14:12:35.773 に答える