PHP flock () – что находится под капотом?

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

// example: $stream = fopen( FILE , 'rb') or die('???'); $md = stream_get_meta_data($stream); echo $md['wrapper_type']; 
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 = значение;
                 return 0;
             } else {
                 return -1;
             }
             ломать; 

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); 

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

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

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