ホームページ  >  記事  >  バックエンド開発  >  PHP ファイルロックは高い同時実行性を解決します

PHP ファイルロックは高い同時実行性を解決します

不言
不言オリジナル
2018-04-02 10:46:183665ブラウズ

この記事では、高い同時実行性を解決するためのphpファイルロックの方法について共有します。必要な友達は、この記事の内容を参照してください

高い同時実行性を解決するためのphpファイルロック

新しい.txtファイル、ファイルを作成します。には何も書く必要はありません。

[1]。ブロック (待機) モード: (他のプロセスがファイルをロックしている限り、現在のプロセスは他のプロセスがファイルのロックを解除するのを待ちます)

<?php//连接数据库$con=mysqli_connect("192.168.2.186","root","root","test");//查询商品数量是否大于0,大于0才能下单,并减少库存$fp = fopen("lock.txt", "r");//加锁if(flock($fp,LOCK_EX))
{    $res=mysqli_fetch_assoc(mysqli_query($con,&#39;SELECT total FROM shop WHERE id=1 LIMIT 1&#39;));    if($res[&#39;total&#39;]>0){mysqli_query($con,&#39;UPDATE shop SET total=total-1  WHERE id=1&#39;);}    //执行完成解锁
    flock($fp,LOCK_UN);
}//关闭文件fclose($fp);unset($res);
mysqli_close($con);?>

[2]。 : (他のプロセスがファイルをロックしている限り) プロセスはファイルをロックしており、現在のプロセスは他のプロセスがファイルのロックを解除するのを待たずに直接戻ります)

<?php//连接数据库$con=mysqli_connect("192.168.2.186","root","root","test");//查询商品数量是否大于0,大于0才能下单,并减少库存$fp = fopen("lock.txt", "r");//加锁if(flock($fp,LOCK_EX | LOCK_NB))
{    $res=mysqli_fetch_assoc(mysqli_query($con,&#39;SELECT total FROM shop WHERE id=1 LIMIT 1&#39;));    if($res[&#39;total&#39;]>0){mysqli_query($con,&#39;UPDATE shop SET total=total-1  WHERE id=1&#39;);}    //执行完成解锁
    flock($fp,LOCK_UN);
}//关闭文件fclose($fp);unset($res);
mysqli_close($con);?>

データベースへの接続に時間がかかる場合は、より直感的に理解できるように、以下の簡単なデモを示します。

demo.php

<?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

<?php$fp = fopen("file_lock.txt", "r");// 加锁(如果改成flock($fp, LOCK_EX | LOCK_NB),demo2.php会直接返回2,否则会等待demo.php执行完返回1)if(flock($fp, LOCK_EX))
{    echo 1;
} else {    echo 2;
}//关闭文件fclose($fp);

2 つのファイルを同時に実行し、demo2 でロック機構を変更すると、ブロッキング (待機) モード非ブロッキング (待機) モードが表示されます。モード
違いがあります。

ただし、これによりキューがブロックされます。10 人が同時にデータベースに書き込むと、10 人目は最初の 9 人が実行されるまで待機します。

php ファイル ロックは高い同時実行性を解決します

ファイルに何も書き込まずに、新しい .txt ファイルを作成します。

[1]。ブロック (待機) モード: (他のプロセスがファイルをロックしている限り、現在のプロセスは他のプロセスがファイルのロックを解除するのを待ちます)

<?php//连接数据库$con=mysqli_connect("192.168.2.186","root","root","test");//查询商品数量是否大于0,大于0才能下单,并减少库存$fp = fopen("lock.txt", "r");//加锁if(flock($fp,LOCK_EX))
{    $res=mysqli_fetch_assoc(mysqli_query($con,&#39;SELECT total FROM shop WHERE id=1 LIMIT 1&#39;));    if($res[&#39;total&#39;]>0){mysqli_query($con,&#39;UPDATE shop SET total=total-1  WHERE id=1&#39;);}    //执行完成解锁
    flock($fp,LOCK_UN);
}//关闭文件fclose($fp);unset($res);
mysqli_close($con);?>

[2]。 : (他のプロセスがファイルをロックしている限り) プロセスはファイルをロックしており、現在のプロセスは他のプロセスがファイルのロックを解除するのを待たずに直接戻ります)

<?php//连接数据库$con=mysqli_connect("192.168.2.186","root","root","test");//查询商品数量是否大于0,大于0才能下单,并减少库存$fp = fopen("lock.txt", "r");//加锁if(flock($fp,LOCK_EX | LOCK_NB))
{    $res=mysqli_fetch_assoc(mysqli_query($con,&#39;SELECT total FROM shop WHERE id=1 LIMIT 1&#39;));    if($res[&#39;total&#39;]>0){mysqli_query($con,&#39;UPDATE shop SET total=total-1  WHERE id=1&#39;);}    //执行完成解锁
    flock($fp,LOCK_UN);
}//关闭文件fclose($fp);unset($res);
mysqli_close($con);?>

データベースへの接続に時間がかかる場合は、より直感的に理解できるように、以下の簡単なデモを示します。

demo.php

<?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

<?php$fp = fopen("file_lock.txt", "r");// 加锁(如果改成flock($fp, LOCK_EX | LOCK_NB),demo2.php会直接返回2,否则会等待demo.php执行完返回1)if(flock($fp, LOCK_EX))
{    echo 1;
} else {    echo 2;
}//关闭文件fclose($fp);

2 つのファイルを同時に実行し、demo2 でロック機構を変更すると、ブロッキング (待機) モード非ブロッキング (待機) モードが表示されます。モード
違いがあります。

ただし、これによりキューがブロックされます。10 人が同時にデータベースに書き込むと、10 人目は最初の 9 人が実行されるまで待機します。

関連する推奨事項:

PHP ファイル ロック、共有ロック、排他ロックについて説明します

PHP ファイル ロックの同時実行操作の詳細な説明



以上がPHP ファイルロックは高い同時実行性を解決しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。