ホームページ  >  記事  >  バックエンド開発  >  PHPマルチタスク2次タイマーの実装方法

PHPマルチタスク2次タイマーの実装方法

不言
不言オリジナル
2018-06-01 09:56:481657ブラウズ

この記事では、主に PHP マルチタスクの第 2 レベルのタイマーの実装方法を紹介します。これは非常に優れており、必要な友人は参考にしてください。

crontab は分レベルまでしか到達できないため、PHP を使用してタイマーを実装できるかどうかを突然疑問に思いました。また、Swoole 拡張機能ではあまり多くのタイマーが実装されていないことも調べました。ミリ秒レベルのタイマーを実装するのは非常に効率的ですが、結局のところ純粋な PHP コードで書かれていないため、最終的に学習リファレンス用に PHP を使用してタイマー クラスを実装することを検討しました。

実装

タイマーコードを実装するとき、PHPシステムに付属する2つの拡張機能が使用されますPcntl - マルチプロセス拡張機能:

主な目的は、PHPが多くのサブプロセスを開始できるようにすることです。同時に、並行して Go がいくつかのタスクを処理します。

Spl - SplMinHeap - Small MinHeap

タイマーを実装する場合、この構造を使用すると効率が非常に良く、挿入と削除の時間計算量は libevent と同様に O(logN) です。タイマーも採用されています。このデータ構造はバージョン 1.4 以降、それ以前は rbtree を使用していました。リンク リストまたは固定配列を使用する場合は、挿入または削除のたびに再度トラバースまたはソートする必要があるため、依然としてパフォーマンスの問題が発生します。

プロセス

手順

1. タイマー構造体とそこにあるパラメーターを定義します。2. 次に、それらをすべてタイマー クラス Timer に登録します。 3. モニターを呼び出します。

4. 監視プロセスは無限 while ループであり、タイム ヒープの先頭が期限切れになっているかどうかを常にチェックします。当初は 1 秒ごとにループすることを考えていました。 sleep(1) のときにタイマーが期限切れになると、すぐに正確に実行できず、遅延が発生する可能性があるため、引き続き usleep(1000) ミリ秒を使用します。レベルビューでは、プロセスを一時停止して CPU 負荷を軽減することもできます。




もテスト済み極端なケースでは、1,000 個のタイマーがすべて同時に 1 秒で期限切れになり、タイム ヒープの調整にかかる時間はわずか 0.126 秒ですが、タイマーが調整されるたびに子プロセスを開始する必要があります。この 1,000 件は 1 秒で処理できない可能性があり、次の監視の継続に影響を与える可能性があります。ただし、子プロセスが開始されていない場合は、影響を受ける可能性があります。引き続き直接実行によって処理されます。 。 。 。もちろんもっと良い方法があるはずですが、今のところ思いつくのはこれだけです。

関連する推奨事項:

phpデータベースキャッシュ実装のアイデア

以上がPHPマルチタスク2次タイマーの実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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