この記事では、主に PHP でのファイル ロックの使用法を紹介し、高同時性の問題を解決するための PHP ブロッキング モードと非ブロッキング モードのファイル ロックの関連使用スキルを例の形で分析します。参考になれば幸いです。
ファイルには何も書き込まずに、新しい .txt ファイルを作成します。
【1つ】。ブロッキング(待機)モード: (他のプロセスがファイルをロックしている限り、現在のプロセスは他のプロセスがファイルのロックを解除するのを待ちます)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php
$con =mysqli_connect( "192.168.2.186" , "root" , "root" , "test" );
$fp = fopen ( "lock.txt" , "r" );
if ( flock ( $fp ,LOCK_EX))
{
$res =mysqli_fetch_assoc(mysqli_query( $con ,'SELECT total FROM shop WHERE id=1 LIMIT 1'));
if ( $res ['total']>0){mysqli_query( $con ,'UPDATE shop SET total=total-1 WHERE id=1');}
flock ( $fp ,LOCK_UN);
}
fclose( $fp );
unset( $res );
mysqli_close( $con );
?>
|
ログイン後にコピー
【2つ】. ノンブロッキング(待機)モード: (他のプロセスがファイルをロックしている限り、現在のプロセスは他のプロセスがファイルのロックを解除して直接戻るのを待ちません
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php
$con =mysqli_connect( "192.168.2.186" , "root" , "root" , "test" );
$fp = fopen ( "lock.txt" , "r" );
if ( flock ( $fp ,LOCK_EX | LOCK_NB))
{
$res =mysqli_fetch_assoc(mysqli_query( $con ,'SELECT total FROM shop WHERE id=1 LIMIT 1'));
if ( $res ['total']>0){mysqli_query( $con ,'UPDATE shop SET total=total-1 WHERE id=1');}
flock ( $fp ,LOCK_UN);
}
fclose( $fp );
unset( $res );
mysqli_close( $con );
?>
|
ログイン後にコピー
)データベースへの接続に時間がかかる場合は、簡単なデモを使用すると、より直観的に理解できるようになります。
demo.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php
$fp = fopen ( "file_lock.txt" , "r" );
if ( flock ( $fp , LOCK_EX))
{
sleep(10);
echo 1;
flock ( $fp ,LOCK_UN);
} else {
echo 2;
}
fclose( $fp );
|
ログイン後にコピー
demo2.php
1 2 3 4 5 6 7 8 9 10 11 | <?php
$fp = fopen ( "file_lock.txt" , "r" );
if ( flock ( $fp , LOCK_EX))
{
echo 1;
} else {
echo 2;
}
fclose( $fp );
|
ログイン後にコピー
2 つのファイルを同時に実行し、demo2 でロック メカニズムを変更すると、ブロック (待機) モードと非ブロック モードが確認できます。ブロッキング(待機)モードの違い。
ただし、これによりキューがブロックされます。10 人が同時にデータベースに書き込むと、10 人目は最初の 9 人が実行されるまで待機します。
以上がPHP がファイル ロックを使用して同時実行性の高い問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。