独立したPHPタスクコンテナ環境を構築する方法。 PHPタイムタイムスクリプトを実行するためにコンテナを構成する方法
独立したPHPタスクコンテナ環境の構築は、Dockerを通じて実装できます。特定の手順は次のとおりです。1。dockerとdockerが基礎として構成するインストール。 2。DockerFileおよびCrontabファイルを保存するための独立したディレクトリを作成します。 3. PHP CLI環境を定義し、Cronと必要な拡張機能をインストールするためにDockerFileを書き込みます。 4.タイミングタスクを定義するためにCrontabファイルを書き込みます。 5。Docker-Compose.ymlを書き込み、スクリプトディレクトリをマウントし、環境変数を構成します。 6.コンテナを起動し、ログを確認します。 Webコンテナでタイミングタスクを実行するのと比較して、独立したコンテナには、リソースの分離、純粋な環境、強力な安定性、容易な拡張の利点があります。ログとエラーキャプチャを確保するには、出力をログファイルにリダイレクトし、PHPエラーログを標準エラーストリームに出力に構成し、モノログを使用して構造化されたログを記録し、合理的な出口コードを設定する必要があります。一般的なトラップには、タイムゾーンの不一致、環境変数の欠落、同時タスクの実行、制御不能、タスクの中断などが含まれます。タイムゾーンの設定、明示的に変数の渡し、タスク等式設計、リソース制限、信号キャプチャなどが含まれます。
私の意見では、特にタイミングのあるスクリプトを実行するために、特に時限スクリプトを実行するために、独立したPHPタスクコンテナ環境を構築することは、私の意見では複雑なアプリケーションを管理することに不可欠な部分です。 HTTPリクエストへの直接的な応答を必要としないバックグラウンドタスクを処理するためのクリーンで孤立した効率的な方法を提供します。簡単に言えば、Webサービスから時限タスクを実行するPHP環境を剥奪し、それぞれが互いに干渉しないようにすることです。

解決
独立したPHPタスクコンテナ環境を構築するには、通常、Dockerを使用します。これは、依存関係の競合の問題を解決するだけでなく、スケジュールされたタスクに安定した制御可能なランニングサンドボックスを提供します。
私は通常これをします:

まず、DockerとDockerのコンポースがホストマシンにインストールされていることを確認してください。これは基礎であり、それらがなければ、何も言えません。
次に、タイミングタスクの別のディレクトリ構造を作成します。個人的にはservices/cron
レベルが明確になるように、すべてのバックエンドサービスを親ディレクトリに配置するのが好きです。このcron
ディレクトリでは、 Dockerfile
およびcrontab
ファイルを配置します。

1。DockerFile Dockerfile
書きます
このDockerfile
、PHP CLI環境を定義します。軽量のPHP CLI画像を選択することは、 php:8.x-cli-alpine
など、サイズが小さく、迅速な開始であるため、良いスタートです。次に、 cron
ツールと、PHPスクリプトが必要とする拡張機能( pdo_mysql
、 redis
、 amqp
など)をインストールする必要があります。
#サービス/cron/dockerfile PHPから:8.2-Cli-Alpine #cronをインストールし、一般的に使用されるphp拡張機能を実行すると、apk -no-cache cron \ && docker-php-ext-install pdo_mysql opcache bcmath \ && docker-php-ext-enable opcache#opcacheもCLIモードでのパフォーマンスを向上させることができます。 FPMほど明白ではありませんが、Redisなどの追加の拡張機能をインストールする必要がある場合は、#よりも悪いです #PECLインストールredis \を実行する #&& docker-php-ext-onable redis #カスタムクロンタブファイルをコンテナにコピーしますcrontab/etc/crotabs/rootをコピーします #crontabファイルに正しいアクセス許可を与え、cronサービスが実行されていることを確認しますchmod 0644/etc/crotabs/root \ && crontab/etc/crotabs/root \ && touch /var/log/cron.log #コンテナが起動したときにクロンサービスを実行し、コンテナを前景で走らせて、DockerがCMD ["crond"、 "-f"、 "-l"、 "/var/log/cron.log"を監視するように監視します。
crontab
ファイルを書き込みます
このファイルは、タイミングタスクを定義します。パスはコンテナ内のパスである必要があることに注意してください。
#services/cron/crontab #毎日午前2時にデータクリーニングスクリプトを実行します2 * * * * * * * * * * * * clean_data.php >> /var/log/cron.log 2>&1 #キュー処理スクリプトを5分ごとに実行 */5 * * * * * * * * * * * * * * * * * queue.php >> /var/log/cron.log 2>&1
3。Docker docker-compose.yml
を書き込みます
最後に、Project Root Directoryで、 docker-compose.yml
ファイルを作成して、このタイミングのタスクコンテナを調整します。ここでは、コンテナがそれらにアクセスできるように、PHPスクリプトが配置されているディレクトリをマウントする必要があります。
#docker-compose.yml バージョン: '3.8' サービス: #... Webサービス、データベースなどのその他のサービス。Cron_Worker: 建てる: コンテキスト:./services/cron#dockerfileのビルドコンテキストを指定しますdockerfile:dockerfile ボリューム: - ./src:/app/scripts#PHPスクリプトディレクトリをコンテナに/app/scriptsにマウントする #永続的なログが必要な場合は、ボリューム# -cron_logs:/var/log/cron.logをマウントできます 再起動:常に#コンテナがクラッシュした後、環境が自動的に再起動することを確認してください。 #データベース接続情報など、必要な環境変数を渡すDB_HOST:YOUR_DB_HOST db_name:your_db_name #... #ネットワーク: # -YOUR_APP_NETWORK#カスタムネットワークがある場合は、データベースなどのサービスが同じネットワーク#ボリュームにあることを確認してください。 #cron_logs:{}#持続ログの名前付きボリュームを定義します#ネットワーク: #your_app_network: #driver:ブリッジ
4。開始と検証
docker-compose.yml
が配置されているディレクトリで、実行してください。
docker -compose up -d -build cron_worker
これにより、タイミングのあるタスクコンテナが構築されて起動します。 docker-compose logs -f cron_worker
を使用して、Cron実行ログやスクリプト出力など、コンテナログをリアルタイムで表示できます。
Webサーバーコンテナで直接時限タスクを実行してみませんか?
これは本当に良い質問であり、私はよく聞かれます。正直に言うと、私は最初にこの種の怠inessを作り、「それは単なるPHP環境ではないのですか?なぜこれを悩ませますか?」しかし、練習の後、私はこれが悪い決定であり、次の理由であることがわかりました。
まず、リソースの分離とパフォーマンスの影響。 Webサーバー(NGINX PHP-FPMなど)のコアタスクは、ユーザーのHTTP要求にすばやく応答することです。タイミングタスク(特に時間がかかり、CPUが消費される、またはメモリが消費される可能性があるもの)とWebサービスがコンテナに絞り込まれた場合、タイミングタスクが実行されると、Webサービスのリソースを押収し、Webサイトがゆっくりとリクエストから均等に応答することができます。シェフがゲストのためにすぐに食べ物を調理し、同時にたくさんの汚れた服を洗う必要があるキッチンのようなもので、彼の効率は間違いなく影響を受けます。
第二に、環境の依存と純度。通常、Webサービスには、HTTPリクエストを処理するための少量のPHP拡張機能と構成のみが必要です。タイミングタスクには、完全に異なる拡張機能(メッセージキューの拡張、特定のAPIライブラリなど)または異なるPHP構成(実行時間制限が長くなるなど)が必要になる場合があります。それらを混ぜると、Webコンテナの画像が肥大化し、Webサービスが単に必要としない多くのものが含まれており、画像サイズと潜在的な競合が追加されます。
さらに、安定性とトラブルシューティング。スケジュールされたタスクスクリプトが十分に堅牢ではない場合、またはデータの問題によりタスクがクラッシュする場合、コンテナ全体が切れる可能性があります。 Webサービスとスケジュールされたタスクが一緒になっている場合、Webサイトも一緒に「ダウンライン」します。独立したコンテナの場合、タイミングのあるタスクコンテナがクラッシュしたとしても、Webサービスはまだ正常にサービスを提供できます。問題のトラブルシューティングの場合、それがWebサービスの問題であるか、時限タスクであるかをより明確に見つけることができます。
最後に、スケーラビリティと管理。通常、Webサービスはトラフィックに基づいて水平方向にスケーリングする必要がありますが、タイミングタスクには1つのインスタンスのみが必要な場合や、まったく異なるスケジューリングと監視方法が必要になる場合があります。それらを分離することで、ニーズに応じて独立して拡張、更新、管理することができ、柔軟性が大幅に向上します。私の意見では、これは日常開発におけるマイクロサービスアーキテクチャの概念の縮図です。
タイミングタスクの実行ログとエラーキャプチャを確保する方法は?
タイミングタスクの実行の透明性、つまり、いつ実行されるか、成功するかどうか、エラーがあるかどうかを確認できます。これは、運用、メンテナンス、デバッグの鍵です。この点で、私はいくつかの経験があります:
1。標準の出力とエラーのリダイレクト
これは最も基本的で効果的な方法です。 crontab
構成では、スクリプトの標準出力(STDOUT)と標準誤差(STDERR)をログファイルにリダイレクトしてください。
* * * * * php /app/scripts/your_script.php >> /var/log/cron.log 2>&1
>> /var/log/cron.log
は、スクリプトのすべての出力を/var/log/cron.log
ファイルに追加します。 2>&1
、標準誤差(ファイル記述子2)のリダイレクトを示すトリックで、標準出力(ファイル記述子1)ポイントです。このようにして、それがスクリプトの通常の出力であろうとエラーメッセージであろうと、 cron.log
に書き込まれます。
Dockerコンテナは、 crond
プロセスの標準出力と標準エラーをキャッチするため、 docker-compose logs -f cron_worker
を介してこれらのログを確認できます。
2。コンテナ内のPHPの設定を報告するエラー
コンテナ内のPHP環境がエラーレポートで正しく構成されていることを確認してください。 Dockerfile
では、カスタムphp.ini
ファイルを作成してコピーするか、 Dockerfile
に直接設定できます。
#サービス/cron/dockerfile #... COPY-PHP.ini /usr/local/etc/php/conf.d/custom-php.iniをコピーします #...
custom-php.ini
コンテンツ:
#custom-php.ini error_reporting = e_all&〜e_notice&〜e_deprecated&〜e_strict display_errors = off log_errors = on error_log = /dev /stderr; PHPエラーログを標準エラーに出力して、Dockerもキャプチャできるように
display_errors = Off
、エラーメッセージの出力を生産環境に直接出力しないようにするため、 log_errors = On
エラーがログに記録されるようにします。 error_log
への設定/dev/stderr
非常に良い習慣です。これにより、PHPの内部エラーログをコンテナの標準エラーストリームから出力できるようになり、Dockerログシステムの統一コレクションが容易になります。
3。アプリケーションレベルのロギング
より複雑なタイミングタスクについては、MonologなどのPHPスクリプト内でプロのログライブラリを使用することを強くお勧めします。これにより、タスクの開始、終了、キーステップ、ビジネスロジックエラー、警告など、より詳細で構造化された情報を記録できます。
// /app/scripts/process_queue.php <?php 「ベンダー/autoload.php」が必要です。 // Composerを使用しているとします Monolog \ Loggerを使用してください。 Monolog \ Handler \ StreamHandlerを使用します。 // logger $ log = new logger( 'queue_processor'); $ log-> pushhandler(new StreamHandler( 'php:// stdout'、logger :: info)); //標準出力への出力try { $ log-> info( '見積もり処理タスクStarts'); // ...あなたのビジネスロジック$ ProcessedCount = 0; //処理されているピースの数を想定してください// ... $ log-> info( 'Queue Processing Task Completed'、['Processed_Count' => $ ProcessedCount]); } catch(\ Exception $ e){ $ log-> error( 'キュー処理タスクが失敗した'、['エラー' => $ e-> getMessage()、 'trace' => $ e-> getTraceAsstring()]); 終了(1); //失敗したときにゼロ以外の出口コードを返します}
このように、Cronログがスクリプトの起動と終了のみを記録したとしても、 docker-compose logs
のスクリプト内の詳細な実行プロセスと潜在的なエラーを確認できます。
4。コードと監視を終了します
成功したときに0を終了し、失敗したときにゼロ以外の出口コードでPHPスクリプトを終了します。これは、UNIX/Linuxの普遍的な慣習であり、自動監視システムがタスクが成功したかどうかを判断する基礎でもあります。一部の外部監視サービス(HealthChecks.ioなど)と組み合わせることで、タスクが正常に実行された後にURLをpingするか、タスクが長期間実行されない場合に通知を受け取ることができます。
コンテナ化されたタイミングタスクの一般的な落とし穴と最適化の提案
コンテナ化されたタイミングタスクへの道で、私は多くの落とし穴に踏み込んで、いくつかの経験を要約しました。いくつかの一般的な落とし穴と対応する最適化の提案は次のとおりです。
1。タイムゾーンの問題:タイミングタスクは間違っていますか?
これは決まり文句ですが、無視するのは本当に簡単です。ホストに正しいタイムゾーンを設定している可能性がありますが、コンテナの内部では、PHPまたはcrond
がUTC時間を使用して、予想と一致しないタイミングタスクの実行時間を引き起こす可能性があります。
提案:
-
Dockerfile
では、タイムゾーンを明示的に設定します。PHPから:8.2-Cli-Alpine #... env tzアジア/上海 ln -snf/usr/share/zoneinfo/$ tz/etc/localtime && echo $ tz>/etc/timezoneを実行する #...
-
date.timezone
inphp.ini
:date.timezone = "アジア/上海"
- 統一されたタイムゾーン:データベース、Webサービス、およびタイミングタスクコンテナはすべて、データとロジックの混乱を避けるために同じタイムゾーンを使用していることを確認してください。
2。環境変数がありません:スクリプトがデータベースに接続できませんか?
Webサービスコンテナはdocker-compose.yml
またはその他の方法を介して、データベース接続情報、APIキーなどの環境変数を取得できます。ただし、独立したタイミングタスクコンテナが明確に構成されていない場合、この情報は取得されません。
提案:
-
docker-compose.yml
で、cron_worker
サービスの環境変数を明示的に通過します。cron_worker: #... 環境: db_host:your_db_host db_user:your_db_user db_pass:your_db_pass #...
- Dockerの秘密または構成管理ツールを使用する:機密情報については、
docker-compose.yml
に直接公開するのではなく、Hashicorp Vault、Kubernetesの秘密などのツールを使用する方が安全です。
3.タスクの同意と反復実行:データの根本原因カオス
タイミングタスクが非常に頻繁に実行され(1分に1回など)、最後のタスクが完了しておらず、新しいタスクが再度開始されると、データの矛盾またはリソーススクランブルにつながる可能性があります。特にコンテナが再起動されたり、スケジューリングシステムが再試行されたりした場合、繰り返し実行される場合もあります。
提案:
タスクIDEMPO設計: PHPスクリプトがiDempotentであることを確認してください。つまり、同じ操作を複数回実行し、かつてと同じ結果を実行します。たとえば、ステータスを更新するときは、単に設定するだけでなく、更新する前に現在のステータスを確認します。
ロックメカニズム:重要なタスクのために、ロックメカニズムが導入されています。これは次のことができます:
- ファイルロック:スクリプトの先頭で、ファイルロックを作成して、既に存在する場合は終了します。
- データベースロック:データベースの行ロックまたはテーブルロックを使用します。
- 分散ロック:複数のインスタンスを展開している場合は、RedisやZookeeperなどの分散ロックの使用を検討してください。
-
flock
機能: PHPビルトインflock
機能は、ファイルロックに使用できます。
//シンプルなファイルロック例$ lockfile = '/tmp/my_cron_job.lock'; $ fp = fopen($ lockfile、 'c'); if(!flock($ fp、lock_ex | lock_nb)){ //タスクが実行されていることを示すロックを取得できません。「タスクが実行されている、この実行をスキップしている。\ n」; fclose($ fp); 出口(); } //ロックを取得してタスクを実行しますecho "タスクは実行を開始します... \ n"; 睡眠(10); //シミュレーション時間のかかる操作エコー「タスクの実行が完了しました。\ n "; Flock($ fp、lock_un); //ロックfclose($ fp)を解放します。 Unlink($ lockfile); //ロックファイルを削除します
4。リソースの制限:「制御不能」タイミングタスクを防ぎます
不適切に書かれたタイミングタスクは、多くのCPUまたはメモリを消費する可能性があり、ホスト上の他のサービスの通常の操作に影響します。
提案:
-
docker-compose.yml
のリソース制限を設定します:cron_worker: #... 展開する: リソース: 制限: CPU: '0.5'#CPU使用量を0.5コアメモリに制限:256m#メモリ使用量を256MBに制限 予約: CPU: '0.1'#予約0.1コアメモリ:64m#予約64mbのメモリ
これにより、単一のタスクがシステム全体をドラッグすることを効果的に防ぐことができます。
5。エレガントなシャットダウン:タスクの完全性を確保します
コンテナが停止または再起動された場合、タイミングタスクが実行されている場合、現在の操作を完了するか、少なくともクリーンアップする機会が必要です。
提案:
- キャプチャシグナル: PHPスクリプトで
SIGTERM
信号をキャプチャして、進行状況を節約したりリソースのリリースなど、クリーンアップしたりします。 - dockerは
stop_grace_period
:stop_grace_period
を追加すると、シャットダウン信号を処理するための時間をコンテナに与えることができます。cron_worker: #... stop_grace_period:30s#コンテナに30秒を与えて、優雅に閉じる
これらは、私が実際に遭遇し、解決した問題の一部です。コンテナ化されたタイミングタスクは利便性をもたらしますが、彼らは彼らの利点に真に完全なプレイを与えるために慎重に検討と構成も必要です。
以上が独立したPHPタスクコンテナ環境を構築する方法。 PHPタイムタイムスクリプトを実行するためにコンテナを構成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Stock Market GPT
AIを活用した投資調査により賢明な意思決定を実現

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

9月18日の最新ニュースであるHuawei Harmonyos6は、開発者向けに複数のラウンドのプレビューバージョンプッシュを開始し、最近、初めて試した一部のユーザーに経験資格を開きました。ユーザーのフィードバックによると、現在のシステム名は「次の」サフィックスを表示しなくなり、HarmonyOs6.0に正式に名前が変更されています。 Huaweiは、2023年8月の開発者会議で初めてHarmonyOsNextという名前を提案し、Hongmengシステムに新しい開発段階に入り、真のネイティブの自己開発を実現することを目指しています。 HarmonyOsNextの最もコアブレークスルーは、独立して開発された基礎となるシステムアーキテクチャを完全に採用し、LinuxカーネルとAndroid AOSPコードを完全に除去し、Harmonyosカーネルに基づいてアプリケーションのみを実行することです。

リセットコンピューターが立ち往生したら、ハードディスクのアクティビティを待って観察して、実行中かどうかを確認します。次に、ネットワークを切断して更新干渉を避けるか、ソフトウェアの競合を排除するためにセーフモードに入ります。 CHKDSKを介してディスクエラーを確認し、ソフトウェアドリビューションキャッシュをクリーニングして更新の問題を修正します。まだ無効な場合は、Windowsインストールメディアを使用して修理を開始し、リセット操作を実行します。

tosetupavpnonlinux:1。installopenvpnandnetworkmanager.2.importan.ovpnfileorconfiguremaniall.3.usewireguardforfasterconnections.4.connectvianmcliforautomation.ensurecredentionalsentionalsandentiveSandicatificationaleconfigured。

Query Information_schema.Tables MySQLデータベースサイズを正確に取得する。 2. Table_schemaを指定して、特定のデータベースのバイトとMBサイズの総数を確認します。 3。すべてのデータベースのMBサイズを取得し、下降順に配置するためにTable_schemaでグループ化して要約します。 4.結果にはデータとインデックスの長さが含まれており、ログファイルは含まれておらず、テーブルのないデータベースは表示されないか、nullです。 5. information_schemaにアクセスするための対応する許可が必要です。

ブックマークバーは、Chromeの右上隅にある3ドットメニューをクリックし、「ブックマーク」>「showブックマークバー」を選択することで復元できます。 2。CTRLシフトB(Windows)またはコマンドシフトB(MAC)ショートカットキーを使用して、ディスプレイをすばやく切り替えます。 3.「showブックマークバー」が、設定ページの「外観」に「常に表示」するように設定されていることを確認してください。 4.無効な場合は、ブラウザの設定をリセットしてデフォルトの状態を復元できます。

leftjoinreturnsallrowsfromthelelefttable andmatchingRowsRowsRowsRowStable、withnullvaluesfornon-matchingcolumns.2.syntax:selectcolumnsfromleft_tableleftjoinright_tableoncondition.3.3.example:retiveallusandtheordersorders binging

tolistalluseraccountsonalinuxsystem、usecat/etc/passwdorgetpasswd.extractusernameswithcut-d:-f1.filterusersersbyuid≥1000usingawk-f: '$ 3> = 1000 && $ 7!= "/usr/sbin/nologin" && $ 7!= "/bin/false"'。

MySQLはトリガーの直接無効化をサポートしませんが、トリガーロジックを変更してセッションフラグチェックを追加し、必要に応じて一時的に無効にするようにsetSessionskip_triggers = 1を設定し、操作が完了した後に0に設定することができます。この方法は安全であり、トリガーの削除または再構築を必要としません。
