9

我正在使用信号量来同步我的应用程序中的某些部分。

在释放信号量(sem_release)时,我收到以下警告:

sem_release(): 未能释放密钥 0xc: 无效参数

首先我不知道信号量是否释放,但由于我没有得到“真实”的结果,我猜它没有释放。

PHP版本:5.6.30

ipcs -V => 来自 util-linux 2.25.2 的 ipcs

这是信号量:

key        semid      owner      perms      nsems 
0x0000000c 4124122    myUser      666        3

这是代码的一部分(同步类):

...
if ( !( $this->semaphoreId = sem_get( $this->id, 1 ) ) )
    throw new RuntimeException( 'Error getting Semaphore.');
...

if ( !sem_acquire( $this->semaphoreId ) )
   throw new RuntimeException( 'Error acquiring Semaphore.');
...
if ( !sem_release( $this->semaphoreId ) )
    throw new RuntimeException( 'Error releasing Semaphore.');

PS我只在我的生产环境中遇到这个错误,我无法在我的测试环境中重现/调试。

我在 Internet 上搜索此错误消息,但一无所获。

有谁知道这个消息是什么意思?

编辑:

  1. 每次脚本运行时都不会出现错误消息。
  2. 我确实有时会收到错误“获取信号量时出错”,类似警告“sem_acquire():未能获取密钥 0xc:标识符已删除”,但不是同时(一天)我得到“释放信号量时出错”
  3. 上面的类在各处使用不同的键来同步部分应用程序代码。我对其他键没有任何问题。是的,这个键“12”/“0xc”只在一个地方使用并且来自同一个用户。
  4. 不应出现权限问题,因为如果您检查信号量“0xc”的权限为“666”
4

1 回答 1

1

您能否从头开始执行以下步骤:

  • 获取信号量resource sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]] )
  • 获取信号量bool sem_acquire ( resource $sem_identifier [, bool $nowait = false ] )

并添加完整性检查以确保上述函数返回预期值。

您是否还可以检查应用程序的其他部分是否在同一用户下运行以避免权限问题。

于 2017-05-21T17:37:11.883 回答