Foros del Web » Programando para Internet » PHP »

Semáforos en PHP

Estas en el tema de Semáforos en PHP en el foro de PHP en Foros del Web. Hola a todos, ¿Alguien a usado semáforos con PHP? Estoy haciendo una aplicación Web que tiene algunas partes que no permiten el trabajo en paralelo ...
  #1 (permalink)  
Antiguo 29/07/2003, 15:34
 
Fecha de Ingreso: junio-2003
Mensajes: 38
Antigüedad: 20 años, 10 meses
Puntos: 0
Semáforos en PHP

Hola a todos,

¿Alguien a usado semáforos con PHP?

Estoy haciendo una aplicación Web que tiene algunas partes que no permiten el trabajo en paralelo de dos personas. Asi que me gustaría restringir partes de la ejecución para que fueran ejecutadas solamente por una persona.

Les agradecería muchísimo su ayuda ya que en este tema ando un poco perdido..

Un saludo,
Carlos.
  #2 (permalink)  
Antiguo 29/07/2003, 20:16
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Hola,

¿En qué sentido estás perdido con los semáforos? Si necesitas alguna explicación sobre algo en particular, por favor déjanos saber, de modo que sepamos un poco mejor con qué cosas ayudarte exactamente.

Posiblemente ya le habrás echado un vistazo a la sección del manual de PHP que habla de los semáforos y otras funciones para la comunicación entre procesos y gestión de memoria compartida. Hay muchos temas interesantes allí, aunque por lo que alcanzo a interpretar de tu mensaje, me concentraré en el control de "vías" por medio de semáforos, con el propósito de obligar a que haya como máximo un usuario concurrente realizando algunas operaciones determinadas.

Básicamente el proceso es como sigue:

- Se obtiene un ID para un semáforo determinado (con la función sem_get())
- Se pide vía al semáforo (sem_acquire())
- Se realizan los procesos que se deseen
- Se libera la vía (sem_release()), de modo que el semáforo le de paso a otros usuarios que puedan estar esperando

Considera por ejemplo el siguiente programa pequeño:

Código:
<?php

print "<pre>\n";

$clave_semaforo = 33;  // Clave de ejemplo para el semaforo

$sem_id = sem_get ($clave_semaforo, 1);
print "Se obtuvo el ID de semaforo $sem_id\n";

print "Esperando al semaforo...\n";

if (! sem_acquire ($sem_id))
    die ('Ocurrio un fallo esperando al semaforo.');

print "Se obtuvo el permiso para disponer de la via a las " .
      date ('H:i:s') . "\n";

// Aqui deberian hacerse cualquier cantidad de cosas interesantes

print "Reteniendo la via durante 10 segundos...\n";

sleep (10);  // Solo como ejemplo, vamos a detenernos por 10 segundos
             // antes de decirle al semaforo que la via esta libre de
             // nuevo.

if (! sem_release ($sem_id))
    die ('Ocurrio un fallo liberando la via');

print "Listo, la via fue liberada.\n";

print "</pre>\n";

?>
Ahora, para ver cómo funciona el semáforo, trata de ejecutar este script dos o más veces al tiempo. Fíjate en las horas que reporta cada instancia del programa.

(Claro está que para hacer uso de las funciones relacionadas con semáforos, el intérprete debe soportarlas, lo que quiere decir que PHP debió compilarse con soporte para semáforos estilo System V (--enable-sysvsem)).

Si necesitas ayuda con algo más específico, ya lo sabes... :)

Un cordial saludo
  #3 (permalink)  
Antiguo 29/07/2003, 21:01
Avatar de biblio  
Fecha de Ingreso: enero-2002
Ubicación: Urano
Mensajes: 577
Antigüedad: 22 años, 3 meses
Puntos: 0
Aquí hay un artículo relaciondao que habla del tema en cuestion, no está demas informarse.

http://www.doorsoft.es/portal/article.php?23.0

Saludos
  #4 (permalink)  
Antiguo 30/07/2003, 09:10
 
Fecha de Ingreso: junio-2003
Mensajes: 38
Antigüedad: 20 años, 10 meses
Puntos: 0
Muchas gracias por vuestra ayuda.

Mi primera pregunta es: ¿como puedo saber si mi versión de PHP soporta semáforos?

Estoy usando la última versión estable de PHP (PHP 4.3.2) con el software para servidor Xitami. Concretamente me bajé el instalable. He estado mirando las release notes pero no veo ninguna referencia a si soporta System V.

¿Me podríais confirmar si con esta versión puedo usar semáforos?

Por otro lado, yo quiero que las personas que accedan a mi página y no puedan ejecutar la herramienta ya que hay otro usuario usandola, se encolen y reciban un mensaje de advertencia. ¿Podría obtener esto con un while?

Código PHP:
while (! sem_acquire ($sem_id))
    die (
'Ocurrio un fallo esperando al semaforo.'); 
Muchas gracias de antemano por vuestro soporte.

Un saludo,
Carlos.
  #5 (permalink)  
Antiguo 30/07/2003, 13:05
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
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():

Código:
<?php

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
  #6 (permalink)  
Antiguo 30/07/2003, 13:27
 
Fecha de Ingreso: junio-2003
Mensajes: 38
Antigüedad: 20 años, 10 meses
Puntos: 0
Un millón de gracias Leonardop. Estoy usando PHP sobre un servidor que tiene instalado Windows 2002, y la verdad es que no había reparado en la nota que aparece en el manual de PHP....

"Note: This extension is not available on Windows platforms."

Nunca hubiera pensado que en Windows no se permitieran semáforos... Menos mal que me has avisado.

Respecto a la solución que me propones, me parece genial. Solamente quiero que haya una parte del código de una de mis páginas que sea excluyente y a simple vista, tu programa lo hace.

Voy a probarlo y te cuento como me ha ido.

Un saludo y muchas gracias otra vez por tu ayuda.

Carlos.
  #7 (permalink)  
Antiguo 30/07/2003, 16:38
 
Fecha de Ingreso: junio-2003
Mensajes: 38
Antigüedad: 20 años, 10 meses
Puntos: 0
Hola Leonardop,

He probado a implementar lo que me comentabas anteriormente y funciona perfectamente. Lo voy a adaptar a mi programa y a seguir probando.

Muchísismas gracias por todo.

Un saludo,
Carlos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 10:36.