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.
Solo para aclarar: he intentado poner una llamada 'apc_inc' dentro del bloque bloqueado y se ejecutó todas las 4000 veces. – Alex
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
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