2011-03-09 34 views
6

我是新來的PHP,我試圖運行我的Windows開發機器上的其他人獲得的代碼。我安裝了PHP 5和Apache 2.2,但是當我嘗試運行它,我得到的錯誤:致命錯誤:調用未定義的函數sem_get()

Fatal error: Call to undefined function sem_get() 

它被從拋出該生產線是:

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

回答

9

sem_get()功能由Semaphore, Shared Memory and IPC提供零件。

引用它的introduction手冊第:

This extension is not available on Windows platforms.

+0

謝謝。有沒有解決方法? – Adam 2011-03-09 19:49:54

+0

如果手冊指出它在Windows上不可用,我不認爲有 - 除了使用Linux ;-) – 2011-03-09 19:51:40

+0

刪除代碼。 – 2011-03-09 19:52:36

6

我不知道這是否會按預期工作,但我發現一個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); 
    } 
} 

另外,我需要ftok on Windows

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在這裏提供了function_exists,所以我可以在我的開發環境(Windows)中忽略它。 – Christian 2014-09-12 08:49:20

+0

示例中的'flock'將會阻塞,直到釋放鎖。添加'LOCK_NB'標誌是一個好主意,因爲如果它不能立即鎖定文件,它就不會阻止執行。 – 2017-12-08 12:57:01

相關問題