2009-06-16 16 views
6

Después de luchar con la fuente PHP durante media hora, me di por vencido. : P La pregunta es: ¿a qué llamada del sistema se reduce la llamada a la función PHP flock() en un sistema Gentoo Linux? Estoy teniendo algunos problemas (como bloque por 30 segundos en cada uno de 20 iteraciones de bucle tipo de problemas) y me gustaría saber por qué es así.PHP flock() - ¿Qué hay debajo del capó?

Respuesta

0

A menos que malinterprete lo que está preguntando, PHP flock() es una llamada a la función del sistema Unix flock() en Gentoo. Tienen una semántica idéntica.

+0

Semántica - Sí. ¿Pero realmente llama flock()? –

+0

No puedo probarlo porque no estoy ejecutando una copia de PHP en este momento, pero lo creo, sí. ¿Por qué no probarlo usted mismo con strace? –

+1

Solo tengo acceso FTP al servidor. –

0

¿Lo está usando en una unidad en red o montada? No me sorprendería si lo que está experimentando es deadlock, y algunos de los comments in the documentation hablan sobre eso.

The documentation for flock.

+0

Lea atentamente - Gentoo Linux aquí. Pero la configuración completa es un poco complicada, así que solo quiero saber qué es lo que llama debajo, para que yo pueda armar la imagen completa yo mismo. –

+0

Y no, no es un punto muerto, de eso estoy seguro. Pero hay otras cosas que sospecho. –

+1

Ahh, acabo de descubrir que el archivo está en un montaje NFS. Y el cuadro de host también intenta agruparlo() (cargar servidores web equilibrados, verá). –

3

// example: $stream = fopen(FILE, 'rb') or die('???'); 
$md = stream_get_meta_data($stream); 
echo $md['wrapper_type'];
flock($stream);
Si se imprime plainfile entonces la llamada al rebaño php function() es manejado por php_stdiop_set_option (...) que llama a flock(). Dependiendo de si PHP se compiló con HAVE_FLOCK o no, esta puede ser la llamada al sistema flock() o una función definida en flock_compat.c que utiliza fcntl(). En mi sistema gentoo PHP fue compilado con HAVE_FLOCK.

principales/arroyos/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;
Cuestiones relacionadas