English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
なぜプロセスロックが必要ですか?
主な役割は、同じプログラムを重複して実行しないようにすることで、主にcron tabで使用されます。設定した定時タスクが毎分実行されるとき、プロセスロックを追加しない場合、前のプロセスが終了していない状態で新しいプロセスが生成されます。プロセスロックを追加すると、各定時タスクの実行時に前のプロセスロックが存在するかどうかを確認し、存在する場合は実行しません。
1.単一プロセスの状況でのプロセスロックの実現
例を示すために、phpスクリプトを作成してみましょう、まずはprocess.phpと名付けましょう、以下はコードです:
<?php $lock_file = dirname(__FILE__) . "/process.lock"; $lock_file_handle = fopen($lock_file, 'w'); if ($lock_file_handle === false) die("Can not create lock file {$lock_file}\n"); if (!flock($lock_file_handle, LOCK_EX + LOCK_NB)) { die(date("Y-m-d H:i:s") . " Process already exists.\n"); } while(1{ }
その後、Linux環境でこのコードを実行すると、最初は正常に動作します、次に実行すると「Process already exists.」と表示されます、その後、何回実行してもこのメッセージが表示され、プロセスが失敗したことを示します。
php process.php & //&シンボルは、バックグラウンドでphpを実行するシンボルです
上記のコードは、スケジュールされたスクリプトに適用することもできます、先頭に追加するだけで良いです。これは、単一のスクリプトにプロセスロックを追加するのと同じです。
2.多プロセス実現
上記は、1つのロックが1つのphpスクリプトに対応するという話ですが、多プロセスを実現するためには、1つのプロセスが複数のプロセスロックを持つことができます。
上記のコードのプロセスロックの名前部分を少し変更することで、引数によってプロセスロックの名前を決定できます、引数が一致すれば同じロックが対応します。
if(!($argc > 1)) { $lock_file = dirname(__FILE__) . "/process.lock"; }else{ unset($argv[0]); $lock_file = dirname(__FILE__) . "/process". implode('.', $argv) .".lock"; } $lock_file_handle = fopen($lock_file, 'w'); if ($lock_file_handle === false){ die("Can not create lock file $lock_file\n"); } if (!flock($lock_file_handle, LOCK_EX + LOCK_NB)) { die(date("Y-m-d H:i:s") . " Process already exists.\n"); } while(1{ }
Linux環境で、ファイルが所在するディレクトリに移動し、php process.phpを実行します 1、次に新しいウィンドウを開き、php process.phpを実行します 1、エラー「Process already exists」が表示されます、しかし、あなたが実行しているのはphp process.php 2、正常動作します、同様に、2つの引数を渡すことができます、例えばphp process.php 1 2、これは新しいプロセスロックの実装になります。この実装は、argcとargvというPHPの標準パラメータを使用して主に実装されています。argcはパラメータの合計数を示し、argvは実際に呼び出されたときに使用されたパラメータを示します。
3。yiiでのプロセスロック2での実装
yii2yiiのconsole内のコントローラを継承して、マルチプロセスのプロセスロックを実装する必要があります。これにより、引数の渡しが可能になり、use yii\console\Controller; を使用します;
それから crontab で、以下のコマンドを実行します。yiiのバックアップコマンドを使用して定期的なスクリプトを実行します。それからプロセスロックのコードは上記と同じです。
* * * * * root /usr/local/bin/php /data/www/html/newVanish/yii コントローラ名/引数を渡す方法 /dev/null 2>&1
4プロセスを殺すコマンド
これは本当に秘蔵のものです。私が教える人にはいません。
一つのコマンドで対応するプロセスを削除することができます。以下のコマンドは、プロセス名が process_name のすべてのプロセスを削除する直接の方法です。削除したいプロセス名を直接 process_name に変更してください。
ps aux|grep process_name |grep -v grep|awk '{print $2}'|xargs kill -9
まとめ
これでphpでのプロセスロックとマルチプロセスの実装に関するすべての内容が終わります。この記事の内容が皆さんのPHPの学習や使用に役立つことを願っています。何か疑問があれば、コメントを残してください。皆さんの「呐喊教程」へのサポートに感謝します。
声明:この記事の内容はインターネットから取得され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、このサイトは所有権を持ちません。また、人工的な編集は行われていません。著作権侵害が疑われる場合は、以下のメールアドレスにご連絡ください:notice#oldtoolbag.com(メール送信時は、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がついたら、このサイトは即座に侵害する疑いのあるコンテンツを削除します。)