PHP flock() - 什么是引擎盖?

时间:2009-06-16 14:08:32

标签: php flock

在与PHP源摔跤半小时之后,我放弃了。 :P问题是 - PHP flock()函数调用在Gentoo Linux系统上调用的是什么系统调用?我遇到了一些问题(比如阻塞30秒,每20次循环迭代类型的问题)我想知道为什么是这样。

4 个答案:

答案 0 :(得分: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()或flock_compat.c中定义的函数,它使用fcntl()。在我的gentoo系统上,PHP是用HAVE_FLOCK编译的。

main / streams / plain_wrapper.c @ static 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;

答案 1 :(得分: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);

答案 2 :(得分:0)

除非我误解了你的要求,否则PHP的flock()是对Gentoo上的Unix系统函数flock()的调用。它们具有相同的语义。

答案 3 :(得分:0)

您是在联网或已安装的驱动器上使用它吗?如果您遇到的是deadlock,而comments in the documentation中的一些人谈到这一点,我不会感到惊讶。

The documentation for flock