После борьбы с 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. Они имеют идентичную семантику.
Используете ли вы его на сетевом или смонтированном диске? Я не удивлюсь, если вы переживаете тупик , и некоторые из комментариев в документации говорят об этом.
Документация для стаи .