致命错误:调用未定义的函数sem_get()

Ada*_*dam 6 php windows synchronization semaphore apache2.2

我是PHP的新手,我正在尝试运行我在Windows开发机器上从其他人处获得的代码.我安装了PHP 5和Apache 2.2,但是当我尝试运行它时,我得到错误:

Fatal error: Call to undefined function sem_get()
Run Code Online (Sandbox Code Playgroud)

抛出的线是:

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

Pas*_*TIN 9

sem_get()函数由信号量,共享内存和IPC组件提供.

引述介绍的是手册第:

此扩展程序在Windows平台上不可用.


fal*_*lla 7

我不知道这是否会按预期工作,但我在Windows上找到了sem_get解决方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,我也需要Windows上的ftok:

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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这里提供function_exists的+1,所以我可以在我的开发环境(Windows)中忽略它. (4认同)