2012-09-13 29 views
24

Tengo el siguiente código y el semáforo no lo bloquearía como se esperaba.php semáforo no funciona

(soy consciente de apc_inc. Esto no es lo que estoy buscando.)

$semkey = sem_get(123); 
sem_acquire($semkey); 

$count = apc_fetch('count111'); 
if(!$count) $count = 0; 
$count++; 
apc_store('count111', $count); 

sem_release($semkey); 

seguido por

ab -n 4000 -c 200 http://localhost/test.php

0 solicitudes con error.

pero después de eso sólo muestra un apc_fetch('count111') ~ 1200 golpes

nginx en Ubuntu 12.04 (64 bits), PHP 5.3.16 ~ dotdeb, php-FPM

  • actualización 1: funciona perfectamente en Linux mint, 5.4.6 ~ dotdeb, servidor web incorporado. Voy a probar la misma máquina con la misma versión con nginx.
+2

Solo para aclarar: he intentado poner una llamada 'apc_inc' dentro del bloque bloqueado y se ejecutó todas las 4000 veces. – Alex

+0

Por lo que yo sé, el semáforo de PHP bloquea la memoria compartida y los recursos, no bloquea el código. Creo que funcionará con las funciones de memoria compartida PHP – Bnaya

+1

Supuse que sem_get inicializa todos los recursos necesarios y el código fuente de PHP lo confirma. Tienen una llamada directa al semget de posix, que toma desde allí. Además, los semáforos están sincronizados para sincronizar procesos que ** no ** comparten ninguna memoria. – Alex

Respuesta

1

El problema era, al parecer, con el propio APC, no con el semáforo.
Actualizando a PHP 5.4.8 -1 ~ dotdeb.0 ha resuelto el problema tanto para nginx como para ejecuciones de prueba de servidor incorporadas.