ホームページ > バックエンド開発 > PHPチュートリアル > PHP 入門: セマフォと共有メモリ

PHP 入門: セマフォと共有メモリ

WBOY
リリース: 2023-05-20 08:30:01
オリジナル
818 人が閲覧しました

PHP はスクリプト言語として、ネットワーク アプリケーションで広く使用されています。一般に、PHP はシステムの根本的な動作に関連する言語ではありませんが、同時プログラミング、マルチプロセス プログラミング、プロセス間通信などの一部の特殊なシナリオでは、依然として一定の理解が必要です。基礎となるシステムの。この記事では、プロセス間通信に関連する 2 つの低レベルの知識、セマフォと共有メモリを紹介し、PHP でのセマフォと共有メモリの関連使用例を示します。

1. セマフォ

マルチプロセスプログラミングでは、複数のプロセス間の相互排他性を確保するために、同期のために何らかの技術的手段を使用する必要があり、セマフォもその 1 つです。セマフォは、利用可能なリソースの量を表す整数値です。プロセスはリソースを使用する前に、セマフォを申請する必要があります。セマフォが 0 より大きい場合、リソースが占有されていないことを意味します。プロセスはリソースを使用してセマフォを 1 減らすことができます。セマフォが 0 の場合、これは、リソースが占有されており、プロセスは待機する必要があることを意味します。他のプロセスがリソースを解放すると、リソースが解放され、セマフォが 0 より大きくなるまで、プロセスは一時停止されます。

PHP では、System V IPC モジュールが提供する関数を使用してセマフォを操作できます。サンプル コードは次のとおりです。

<?php
$sem_key = ftok(__FILE__, 't'); // 生成一个唯一的键值
$sem_id = sem_get($sem_key); // 根据键值获取一个信号量
if (sem_acquire($sem_id)) { // 获取信号量
    // 执行需要互斥的代码
    sem_release($sem_id); // 释放信号量
}
?>
ログイン後にコピー

上の例では、ftok() 関数を使用して一意のキー値を生成し、sem_get() 関数を通じてセマフォを取得しました。次に、sem_acquire() 関数を使用してセマフォを取得します。取得が成功した場合は、現在他のプロセスがリソースを使用していないことを意味し、相互排他を必要とするコードを実行できます。実行後、sem_release() 関数を使用して、セマフォを解放します。

注意すべき点は、PHP スクリプトの実行はシングルスレッドであるため、セマフォを使用する場合は子プロセスの状況を考慮する必要があることです。複数の子プロセスが同じリソースを同時に使用する場合、複数の子プロセスが同じセマフォを共有するようにセマフォを初期化する必要があります。このとき、親プロセスでセマフォの取得と初期値の設定を行った後、子プロセスをフォークアウトすることができ、子プロセスはリソースを使用する前に sem_attach() 関数を使用してセマフォを取得してから実行します。取得が成功した後に相互排他を必要とするコード。サンプル コードは次のとおりです。

<?php
$sem_key = ftok(__FILE__, 't'); // 生成一个唯一的键值
$sem_id = sem_get($sem_key, 1, 0666, 1); // 获取一个信号量,设置初值为1
if (pcntl_fork() == 0) { // fork出一个子进程
    $child_sem_id = sem_attach($sem_key); // 子进程获取信号量
    if (sem_acquire($child_sem_id)) { // 子进程获取信号量成功
        // 执行需要互斥的代码
        sem_release($child_sem_id); // 释放信号量
    }
    sem_remove($child_sem_id); // 子进程释放信号量
    exit;
}

if (sem_acquire($sem_id)) { // 父进程获取信号量成功
    // 执行需要互斥的代码
    sem_release($sem_id); // 释放信号量
}
sem_remove($sem_id); // 父进程释放信号量
?>
ログイン後にコピー

上の例では、pcntl_fork() 関数を使用して子プロセスをフォークアウトしました。子プロセスは親プロセスで作成したセマフォを sem_attach() 関数で取得して使用しますが、使用後は sem_remove() 関数を呼び出してセマフォを解放する必要があります。

2. 共有メモリ

共有メモリとは、複数のプロセスが同じメモリ領域を共有でき、各プロセスがローカル メモリのようにメモリ領域にアクセスできることを意味します。共有メモリは、複数のプロセス間の通信と同期を実現するために使用されるという点でセマフォと似ていますが、セマフォとの違いは、共有メモリが相互排他操作ではなくデータ共有に使用されることです。

PHP では、System V IPC モジュールが提供する関数を使用して共有メモリを操作できます。サンプル コードは次のとおりです。

<?php
$shm_key = ftok(__FILE__, 't'); // 获取唯一的键值
$shm_id = shmop_open($shm_key, 'c', 0666, 1024); // 打开共享内存并设置大小为1024字节
if ($shm_id) {
    $data = 'hello world';
    shmop_write($shm_id, $data, 0); // 向共享内存写入数据
    $read_data = shmop_read($shm_id, 0, 11); // 从共享内存读取数据
    echo $read_data;
    shmop_delete($shm_id); // 删除共享内存
}
?>
ログイン後にコピー

上の例では、ftok() 関数を使用して一意のキー値を取得し、shmop_open() 関数を使用してサイズが 100 の共有メモリを開きます。 1024 バイト、shmop_write() 関数は共有メモリにデータを書き込み、shmop_read() 関数は共有メモリからデータを読み取り、最後に shmop_delete() 関数を使用して共有メモリを削除します。

共有メモリを使用する場合、複数のプロセスが同じメモリ領域を同時に操作し、データの不整合が発生する可能性があることに注意してください。現時点では、データの不整合を避けるために、セマフォを使用して共有メモリ上の読み取りおよび書き込み操作を制御し、同時に 1 つのプロセスのみがメモリ領域の読み取りと書き込みを行うようにすることをお勧めします。

概要

この記事では、PHP のプロセス間通信に関連する 2 つの基礎知識、セマフォと共有メモリを紹介し、関連するコード例を示します。マルチプロセス プログラミングまたは同時プログラミングを行う場合、セマフォと共有メモリを理解すると、プロセス間の競合をより適切に回避し、データ共有を実現するのに役立ちます。

以上がPHP 入門: セマフォと共有メモリの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート