gpt4 book ai didi

PHP sem_get 函数失败

转载 作者:搜寻专家 更新时间:2023-10-31 21:51:51 24 4
gpt4 key购买 nike

我已经实现了对用于预订服务的数据库表的插入的访问控制。它可以正常工作一段时间,然后 sem_get() 函数失败,尽管我在每个 sem_get() 之后调用了 sem_release()

case 'room':
$key = "room";
$semaphore = sem_get($key, 1, 0666, 1);
if ($semaphore) {
sem_acquire($semaphore);
//do some stuff
if ($already_reserved_rooms < $max_rooms) {
$return="ok";
sem_release($semaphore);
return $return;
}
sem_release($semaphore);
}
else {
//send me mail that semaphore failed
}

return 'no rooms';
break;

我是否也应该调用 sem_remove()

我按照 this 上的步骤操作网站。

最佳答案

移除信号量

是的,您应该在完成信号量集后调用 sem_remove()。否则,信号量集将一直存在于系统中,直到您将其删除。然而,信号量集持续存在的事实导致没有问题,而信号量的数量小于 SEMMNS 限制:

SEMMNS System-wide limit on the number of semaphores: policy dependent (on Linux, this limit can be read and modified via the second field of /proc/sys/kernel/sem).

sem_remove() 立即删除信号量集,唤醒所有使用该信号量阻塞的进程。

顺便说一下,您可以使用ipcrm 命令从命令行中删除信号量,并使用ipcs 命令显示IPC 设施(包括信号量)的信息。

释放信号量

当自动释放标志(sem_get 的第 4 个参数)打开时,您不需要调用 sem_release()。但只要您不需要获得的“锁”,释放信号量是个好主意。

sem_release() 只会增加内部信号量的值。将其视为解锁操作,与 sem_acquire() 相反。

sem_get() 失败

sem_get()函数在下列情况下返回 FALSE

  • PHP参数解析失败(E_ERROR);
  • 信号量存在,但调用进程没有权限访问该集合(E_WARNING);
  • 内存分配错误(E_WARNING);
  • 信号量集的最大数量,或系统范围内信号量的最大数量超过(E_WARNING)

在每种情况下,sem_get 都会记录错误或警告。所以您必须检查日志才能找出问题的根源。

由于您的代码已经运行了一段时间,所以这不是参数解析问题,也不是权限问题。内存分配问题很少见。所以很可能您已经超出了信号量数量限制。查看 semget 的手册页以供引用。手册页描述了如何通过 /proc/sys/kernel/sem 读取和修改限制。

引用this回答有关 sysvsem 扩展内部的更多信息。

关于PHP sem_get 函数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40400252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com