在与PHP源摔跤半小时之后,我放弃了。 :P问题是 - PHP flock()函数调用在Gentoo Linux系统上调用的是什么系统调用?我遇到了一些问题(比如阻塞30秒,每20次循环迭代类型的问题)我想知道为什么是这样。
答案 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中的一些人谈到这一点,我不会感到惊讶。