Me doy cuenta de que tiene un año de antigüedad, pero acabo de tropezar con la pregunta mientras investigaba sobre bloquear PHP.
Se me ocurre que una solución podría ser posible utilizando el propio APC. Llámame loco, pero esto podría ser un enfoque viable:
function acquire_lock($key, $expire=60) {
if (is_locked($key)) {
return null;
}
return apc_store($key, true, $expire);
}
function release_lock($key) {
if (!is_locked($key)) {
return null;
}
return apc_delete($key);
}
function is_locked($key) {
return apc_fetch($key);
}
// example use
if (acquire_lock("foo")) {
do_something_that_requires_a_lock();
release_lock("foo");
}
En la práctica podría lanzar otra función allí para generar una clave para usar aquí, sólo para evitar la colisión con una clave de APC existente, por ejemplo:
function key_for_lock($str) {
return md5($str."locked");
}
El parámetro $expire
es una buena característica de APC a utilizar, ya que evita el bloqueo del detenido para siempre si su guión muere o algo por el estilo.
Esperemos que esta respuesta sea útil para cualquier otra persona que tropiece aquí un año después.
Qué contiene la variable, exactamente; ¿Por qué estás preocupado por el bloqueo? Es posible que pueda evitar el problema. – Rob
Una (última) palabra de advertencia: MySQL GET_LOCK() tiene un comportamiento muy peligroso.Un segundo GET_LOCK() libera silenciosamente el antiguo bloqueo en la misma conexión. MySQL solo puede contener UN bloqueo por conexión. Los bloqueos anidados son imposibles con stock MySQL. No debe usarse para bloqueo de uso general. – korkman