訊號量解決的問題
- 例如IO密集型操作,開啟了30個工作執行緒併發的讀取檔案,然後進行持久化操作,但是資料庫最大連線數為20,如果不控制,就出現獲取資料庫連線失敗錯誤,通過Semaphore控制併發連線資料庫執行緒數
sem_get 得到一個訊號量 id
sem_acquire 獲取一個訊號量
sem_release 釋放一個訊號量
sem_remove 移除一個訊號量
<?php
$key = 123456;
$resource = sem_get($key);//得到一個訊號量id
if ( false === $resource ) {//如果沒得到 就失敗了
die("Get sem failed\n");
}
// 獲取訊號量
if (sem_acquire($resource)) {//獲取這個訊號量
echo "Sem acquire success\n";
echo "Doing something ...\n";//處理業務邏輯
// 釋放訊號量, 使其它程式可以獲取該訊號量
sem_release($resource);
sleep(10);
}
echo "Done\n";
<?php
$key = 123456;
$resource = sem_get($key);
if ( false === $resource ) {
die("Get sem failed\n");
}
while (true) {
// 獲取訊號量
if (sem_acquire($resource)) {
echo "Sem acquire success\n";
echo "Doing something ...\n";
break;
}
}
sem_remove($resource);//移除訊號量
echo "Done\n";