2011-03-09 34 views
6

Soy nuevo en PHP y estoy tratando de ejecutar el código que obtuve de otra persona en mi máquina de desarrollo de Windows. He instalado PHP 5 y Apache 2.2, pero cuando intento ejecutarlo me sale el error:Error fatal: llamada a la función no definida sem_get()

Fatal error: Call to undefined function sem_get() 

La línea que está siendo lanzada desde es:

private function UpdateCounter($semkey, $memkey, $count) 
{ 
    $sem_h = sem_get($semkey, 1);//this line is the problem 
    ... 
} 

Respuesta

9

La función sem_get() es proporcionada por el Semaphore, Shared Memory and IPC componente.

Citando al introduction de ello es la sección del manual:

This extension is not available on Windows platforms.

+0

Gracias. ¿Hay alguna solución para eso? – Adam

+0

Si el manual indica que no está disponible en Windows, no creo que exista - excepto que use Linux ;-) –

+0

elimine el código. –

6

No sé si eso va a funcionar como se esperaba, pero me pareció un workaround for sem_get on Windows:

if (!function_exists('sem_get')) { 
    function sem_get($key) { 
     return fopen(__FILE__ . '.sem.' . $key, 'w+'); 
    } 
    function sem_acquire($sem_id) { 
     return flock($sem_id, LOCK_EX); 
    } 
    function sem_release($sem_id) { 
     return flock($sem_id, LOCK_UN); 
    } 
} 

También, necesario ftok on Windows también:

if(!function_exists('ftok')) 
{ 
    function ftok($filename = "", $proj = "") 
    { 
     if(empty($filename) || !file_exists($filename)) 
     { 
      return -1; 
     } 
     else 
     { 
      $filename = $filename . (string) $proj; 
      for($key = array(); sizeof($key) < strlen($filename); $key[] = ord(substr($filename, sizeof($key), 1))); 
      return dechex(array_sum($key)); 
     } 
    } 
} 
+3

+1 para proporcionar function_exists aquí, así que puedo ignorar esto en mi entorno de desarrollo (Windows). – Christian

+0

'flock' en el ejemplo se bloqueará hasta que se libere el bloqueo. Es una buena idea agregar el indicador 'LOCK_NB' para que no bloquee la ejecución si no puede bloquear el archivo inmediatamente. –

Cuestiones relacionadas