PHP flock () - что под капотом? - PullRequest
6 голосов
/ 16 июня 2009

После полчаса борьбы с исходниками PHP я сдался. : P Вопрос в том, к какому системному вызову сводится вызов функции PHP flock () в системе Gentoo Linux? У меня возникли некоторые проблемы (например, блок-на-30-секунд-в-каждом-одном-из-20-повторений цикла ), и я хотел бы знать, почему это так поэтому.

Ответы [ 4 ]

3 голосов
/ 16 июня 2009

// example: $stream = fopen(<strong>FILE</strong>, 'rb') or die('???');
$md = stream_get_meta_data($stream);
echo $md['wrapper_type'];<br>
flock($stream);
если это печатает plainfile , тогда вызов функции php flock () обрабатывается php_stdiop_set_option (...), который вызывает flock (). В зависимости от того, был ли 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;
2 голосов
/ 16 июня 2009

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);
0 голосов
/ 16 июня 2009

Вы используете его на сетевом или подключенном диске? Я не удивлюсь, если вы испытываете тупик , и некоторые из комментариев в документации говорят об этом.

Документация для стада .

0 голосов
/ 16 июня 2009

Если я не понимаю, о чем вы спрашиваете, PHP flock() - это вызов системной функции Unix flock() в Gentoo. У них одинаковая семантика.

...