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 のマルチスレッドバージョンとマルチプロセスの違いが分からないことにも触れました。知っている人がいれば教えてください。 、教えてください