日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php sem acquire,PHP | 关于php中sem_get failed for key no space left on device问题的解决方案...

發布時間:2024/7/5 php 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php sem acquire,PHP | 关于php中sem_get failed for key no space left on device问题的解决方案... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時我們在處理并發操作時會使用信號量做進程同步,如下一個php應用的例子

$sem_id = sem_get($id,1,0666,true);

sem_acquire($sem_id);

...

sem_release($sem_id);

我們release了資源,但是系統沒有真正的釋放資源 通過 [root@localhost ~]# ipcs -s

------ Semaphore Arrays -------- key semid owner perms nsems 0x0002152f 32769 www 666 3 0x00019fff 65538 www 666 3 0x00019ff1 98307 www 666 3 ....

我們知道 ,Semaphores 會很快達到上限

#ipcs -l

max semaphores per array = 250

系統默認是250個,于是當我們再次通過sem_get()獲取資源句柄時就會得到以下錯誤: Warning: sem_get() [function.sem-get]: failed for key 0x(n): No space left on device in ...

最后修改程序,加入 sem_remove($sem_id);

新的問題出現了 sem_release() [function.sem-release]: failed to release key 0xxxxxxx: Invalid argument in...

這是由于出現競爭,假設a進程等待b進程,b完成時執行了sem_remove,所以a進程執行sem_release就會出錯,因為信號里已經被釋放了,故提示信號量無效.

所以php下的信號量不適用于需要創建大量不同鎖的環境. 折衷的方法就是將鎖hash到一個范圍:

如: $sem_id = sem_get($id % 100,1,0666,true); ...

另外記得信號量上限的配置,這里是調整到2048 sysctl -w kernel.sem="1024 32000 100 2048" echo "kernel.sem=1024 32000 100 2048" >> /etc/sysctl.conf

最后想提一個非常重要的問題,當sem_get第4個參數auto_release為true時,php的信號里的作用范圍只限當前區間,如:

function lock() { $sem_id = sem_get($id,1,0666,true); sem_acquire($sem_id); ... }

lock (); //函數中調用了信號量,作用域只在函數內 lock(); // 再次調用不會死鎖,因為第一個信號量鎖定作用已消失

移除: for whatever in `ipcs -s | awk '{print $2}'`; do echo $whatever; done

總結

以上是生活随笔為你收集整理的php sem acquire,PHP | 关于php中sem_get failed for key no space left on device问题的解决方案...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。