6

折腾了半个小时的PHP源码后,我放弃了。: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()或flock_compat.c 中定义的使用fcntl()的函数。在我的 gentoo 系统上,PHP 是用 HAVE_FLOCK 编译的。

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

       案例 PHP_STREAM_OPTION_LOCKING:
            如果(fd == -1){
                返回-1;
            }

            如果((zend_uintptr_t)ptrparam == PHP_STREAM_LOCK_SUPPORTED){
                返回0;
            }

            if (!flock(fd, value)) {
                数据->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,我不会感到惊讶,并且文档中的一些评论谈到了这一点。

羊群的文档

于 2009-06-16T14:12:35.773 回答