Hola de nuevo,
Respecto a tu primera pregunta... bueno, se me ocurren dos formas para saber si el intérprete de PHP que tienes instalado soporta semáforos.
Puedes intentar escribir un programa que utilice alguna de las funciones relacionadas con semáforos, como por ejemplo sem_get(), y tratar de ejecutarlo. Si recibes un mensaje parecido a este:
Cita: Fatal error: Call to undefined function: sem_get() in /ruta/hacia/archivo.php on line N
Entonces seguramente tu intérprete carece de soporte para semáforos... :)
Otra forma podría ser que escribieras un pequeño script que use la función phpinfo():
En condiciones normales, este programa debe producir una salida extensa con información relacionada a tu intérprete PHP, tu sistema y el entorno en el momento de la ejecución del programa. Uno de los primeros campos con información está etiquetado como ``Configure Command'' (al menos en sistemas de la familia Unix, desconozco si sea así en otro tipo de sistemas), en donde puedes ver todas las opciones con las que PHP fue configurado para su compilación. Observa si en medio de esa cadena se encuentra la opción '--enable-sysvsem'.
Ahora bien, he notado que la dirección que has indicado como la fuente desde donde descargaste PHP apunta a un archivo `exe'. Si estás usando PHP sobre un sistema windows, como parece ser el caso, entonces los semáforos no funcionarán (el manual de PHP dice explícitamente que las funciones relacionadas con semáforos no están disponibles en la versión para windows).
Así que, si te parece buena idea, te propondría buscar otra solución a tu problema. A fin de cuentas, los semáforos son recursos más orientados al control de procesos que trabajan directamente con la gestión de memoria y recursos del sistema, y en tu caso creo que bien podría usarse otro tipo de mecanismo más simple y natural al entorno de desarrollo web.
Por ejemplo, podrías usar un archivo físico como mecanimo de bloqueo. En este caso, el algoritmo de tu programa tendría algo así en alguna parte:
0) (paso previo) definir un archivo determinado que actúe como "guardián" que controla la ejecución de algunos procesos críticos.
1) Revisar si existe el archivo de bloqueo.
2) Si existe, lo que quiere decir que ya alguien está trabajando en los procesos críticos, terminar.
3) Si no existe, crearlo inmediatamente.
4) Realizar todos los procesos críticos.
5) Eliminar el archivo de bloqueo, dando paso a otros usuarios.
Una implementación simple en PHP de tal comportamiento podría ser:
Código:
<?php
print "<pre>\n";
$bloqueo = './bloqueo'; // Nombre del archivo de bloqueo
clearstatcache (); // Evitar cualquier posible problema que nos
// produzca el cache interno de PHP
if (is_file ($bloqueo)) {
print "Lo siento, alguien ha bloqueado el sistema.\n" .
"Intente mas tarde.\n</pre>\n";
exit (1);
}
touch ($bloqueo); // Crear el archivo, creando en efecto un bloqueo
// Aqui se hacen todos los procesos criticos... Cosas interesantes que
// contribuyan con la dominacion del mundo, si se quiere.
print "Se ha adquirido el permiso para hacer cosas interesantes...\n" .
"Esperemos 5 segundos\n";
flush (); // Posiblemente el cliente pueda ver la informacion de
// forma mas fluida
sleep (5); // Por ahora, solo retengamos es bloqueo por 5 segundos
unlink ($bloqueo); // Retirar el bloqueo
print "Listo, el bloqueo se ha retirado.\n";
print "</pre>\n";
?>
Intenta ejecutar este mismo programa simultáneamente 2 o más veces.
Si estás pensando en otro tipo de solución, sería interesante discutirlo y llegar a la solución más adecuada para tu caso. :)
Saludos