PHPでSeマップホレのプロセスロックを使用する

WBOY
リリース: 2016-06-13 12:51:45
オリジナル
883 人が閲覧しました

PHP でのセマフォのプロセス ロックの使用

ほとんどの PHP 開発ではロック メカニズムが使用されることはほとんどありませんが、データのキャッシュが失われるとバーストが発生するなど、状況によってはロックの処理が必要になります。バックエンドのデータ要求が多いと、バックエンドがハングアップする可能性があります。このとき、Windows では拡張機能が実装されていないため、ここでは主にセマフォに基づくメモリ ロックを紹介します。 Linux でテスト済み。

<?php 
$key = ftok('/tmp', 'a');


$id = sem_get($key);


if (sem_acquire($id)) {
    echo "acquire id, and sleep 5s\n";
    sleep(5);
    echo "5s past, release id\n";
    sem_release($id);
}
ログイン後にコピー

このファイルをコマンドラインで実行するには、2 つの独立したシェル環境で実行する必要があります。そうしないと、最終的に、2 番目の実行は最初の実行が完了するまで待ってから実行を開始することになります。 .

<?php 
$key = ftok('/tmp', 'a');

$id = sem_get($key);
$k = 1;
$i = array('k'=>0);

if (sem_acquire($id)) {
    $shmid = shm_attach($key);
    if (shm_has_var($shmid, $k)) {
        $i = shm_get_var($shmid, $k);
        $i['k']++;
        shm_put_var($shmid, $k, $i);
    }
    else { 
        shm_put_var($shmid, $k, $i);
    }
        
    sem_release($id);
}
ログイン後にコピー

このコードが実装するのは、共有メモリをロックし、ロックされたメモリに変数値を書き込むことです。書き込まれる変数は、シリアル化をサポートする型である必要があります


ここで 2 つの質問があります。

1.

sem_get は、sem_acquire によって使用される セマフォ ID を返します。

2.

shm_attach は、shm_* 一連の関数 によって使用される共有メモリ ID を返します。

テスト結果から判断すると、ここではシェルテストが使用されており、結果を表示するために複数回実行されます

for i in `seq 1 1000`; do php test-sysvsem.php ;done

<?php 
$key = ftok('/tmp', 'a');


$id = sem_get($key);
$k = 1;
$i = 0;


$shmid = shm_attach($key);
if (shm_has_var($shmid, $k)) {
    var_dump(shm_get_var($shmid, $k));
}
else { 
    echo "var $k is not find";
}
ログイン後にコピー

テスト後の結果が正しくありません

最後に、私が通常 fastcgi + php 設定を使用する場合、php のマルチスレッドバージョンとマルチプロセスの違いが分からないことにも触れました。知っている人がいれば教えてください。 、教えてください

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!