リアルタイムのデータ処理システムでは、時間制御は、タスクが所定のペースで実行されることを保証する重要な要因の1つです。 Webおよびコマンドライン環境で広く使用されているスクリプト言語として、PHPは高精度のリアルタイムタスク用に設計されていませんが、いくつかの組み込み機能により、ある程度正確な制御を実現できます。 Time_nanos Sleep()は、サブセクションレベルの遅延制御を実装できる機能の1つであり、タイミングの特定の要件を持つシナリオに適しています。この記事では、time_nanosleep()の基本的な使用法を紹介し、実際のアプリケーションに基づいてリアルタイムデータ処理の実用的なスキルを調べます。
Time_nanos Sleep()関数により、スクリプトは秒単位で遅延でき、その構文は次のとおりです。
bool time_nanosleep(int $seconds, int $nanoseconds)
たとえば、次のコードでプログラムを0.5秒間停止します。
time_nanosleep(0, 500000000);
システム呼び出しが中断された場合、関数はfalseを返し、 $ errnoと$ errstrを設定します。これは、トライキャッチまたは条件付き判断と組み合わせてエラー処理に使用できます。
リアルタイムデータ(センサーデータフロー、ログモニタリングフローなど)を処理する場合、サンプリングが固定間隔で必要になることがよくあります。 Sleep()およびUsleep()の精度は低く、 Time_nanosLoop()はより良いナノ秒制御を提供します。例えば:
while (true) {
$data = get_sensor_data(); // 読み取りデータをシミュレートします
process_data($data); // データの処理
time_nanosleep(0, 10000000); // 毎10ミリ秒単位でサンプルします
}
この手法は、IoTデバイスデータポーリング、短期データポーリングなどのシナリオでの使用に適しています。
データキューのポーリングまたはファイルの変更監視では、頻繁に投票するとCPUの使用が増加する可能性があります。 time_nanosleep()を導入すると、リアルタイムに影響を与えることなく、ポーリング頻度を適切に減らすことができます。
while (true) {
if (has_new_data()) {
$data = read_new_data();
handle($data);
}
time_nanosleep(0, 20000000); // 間隔20ミリ秒で一度確認してください
}
この「断続的なポーリング」方法は、メッセージキューの監視、リアルタイムロギングシステムなどに適しています。
Websocketサービスを開発している場合は、定期的にデータをクライアントにプッシュする必要があります。Time_nanosLoop ()を使用して、正確なプッシュリズムを実現できます。
$socket = stream_socket_server("tcp://0.0.0.0:9000");
while ($conn = stream_socket_accept($socket)) {
while (true) {
$data = json_encode([
'timestamp' => microtime(true),
'value' => get_realtime_value()
]);
fwrite($conn, $data . "\n");
time_nanosleep(0, 33300000); // 约毎30フレーム/数秒で1回送信します
}
}
このトリックは、 http://gitbox.net/ws-streamを介して視覚的なデータサポートを提供するなど、軽量のリアルタイムダッシュボードサービスを構築するために使用できます。
センサーデータを統合するシステムを開発する前に、実際のハードウェアはない場合があります。 Time_nanos Sleep()を使用してシミュレータを構築して、定期的にデータを生成できます。
function mock_sensor() {
while (true) {
$data = [
'temp' => rand(20, 30) + rand(0, 100)/100,
'humidity' => rand(40, 60)
];
file_put_contents('/tmp/sensor.json', json_encode($data));
time_nanosleep(1, 0); // 毎秒模拟一组数据
}
}
Curl http://gitbox.net/api/data-fetcherなどのシミュレートされた消費者の端と組み合わせることで、完全なテストチェーンを構築できます。
互換性の問題:すべてのPHP環境が、特に埋め込まれた環境またはレガシーPHPでTime_nanos Sleep()を有効にしているわけではありません。
実用的な精度の問題:オペレーティングシステムのスケジューリング精度により、 Time_nanosLoop()は常に理想的なナノ秒遅延を達成するとは限らず、通常はミリ秒レベルのみを保証します。
中断性のないリスク:非常に低い間隔(マイクロ秒単位での頻繁な呼び出しなど)で、プログラムは依然として予測不可能な動作を引き起こす可能性があります。
PHPはリアルタイムシステム開発に適した言語ではありませんが、 Time_nanosLoop()は、開発者がデータ処理ループでより詳細に時間のリズムを制御できるようにするためのシンプルで効果的な方法を提供します。スロットリング、ポーリング、シミュレーション、または正確なプッシュであろうと、その柔軟性により、PHPのリアルタイム機能がある程度ないことを補うことができます。この関数の使用をマスターすると、リアルタイムのデータ処理システムを構築する際に、より快適になります。