畫江湖之 PHP 多程式開發 【通過訊號量控制併發量】

Krisji發表於2019-04-03

訊號量解決的問題

  • 例如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";

相關文章