Ver Mensaje Individual
  #2 (permalink)  
Antiguo 29/07/2003, 20:16
leonardop
 
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