質問
PHPでスケジュールされたタスクを実行するためのさまざまなアプローチのリストを考えています。私の意図は、PHPでスケジュールされたタスクを実行する普遍的な方法を提供することです。これまでのところ:
1)サイトトラフィックを分析します。 1日あたり770ヒット(2分に1ヒット)を受信し、午前6:00にタスクを実行するようにスケジュールし、訪問者が午前5:59にページを要求した場合、次の訪問者は平均して午前6時1分に到着します。この場合、Run = exec( '/ usr / bin / php -f /home/account/cron.php')を実行します。
(+)パスが正しい限り、すべてのプラットフォームで動作します。
(-)いくらかのCPUパワーが必要です。
(-)exec()が必要です。
(-)小規模なサイトまたはトラフィックが急増するサイトでは正確ではありません。
2)上記の改善されたバージョン。ユーザーがページをリクエストし、タスクを実行する場合、exec()を使用せず、ユーザーにコンテンツをフラッシュした後にinclude()を使用します。
(+)すべてのプラットフォームで動作します。
(+)exec()はありません。
(-)いくらかのCPUパワーが必要です。
(-)小規模なサイトまたはトラフィックが急増するサイトでは正確ではありません。
3)別のプロセスバックグラウンドを実行して、一定のループで実行されるようにします。 「開始」できる管理インターフェースを提供します。および「終了」 「サービス」。次に、fsockopen()を使用して、無限に実行される.phpスクリプトを呼び出します。 sleep()を使用して、リソースを消費せず、時間が適切なときに起動します(time_sleep_until()を参照)。ファイルを検索して読み取り、どのタスクをいつ実行するかを理解できます。 「run-everyday-3.00am」というファイルを作成できます。これにより、スケジューラは内部でコードを実行します。
(+)すべてのプラットフォームで動作します。
(+)exec()はありません。
(+)非常に正確な場合があります(たとえば、1分ごとにスリープする場合)。
(-)は安定していません-サーバーがクラッシュするとスケジューラが完全に停止します。
(-)一部のホストは、365日24時間365日稼働するプロセスを好まない=リソースの占有?
4) Linuxなどでexec( 'crontab')を直接実行します。
(+)リソースの独占ではありません。
(+)は正確です。
(-)exec()。
(-)すべてのプラットフォームで機能するわけではありません。
5) cronを作成/管理/削除するために、cPanel資格情報を要求し、POSTを実行します。
(+)は正確です
(+)リソースの独占ではありません。
(-)セキュリティ上悪い
(-)ユーザーの詳細が必要=使いやすさの低下
(-)すべてのプラットフォームで動作しません(Windowsで動作しないcPanelが必要です)。
(-)cPanelが必要です。
その他のアイデア?
解決
ほとんどの場合は機能しますが、提案したほとんどすべてのメソッドはいものです。
私のい代替案は、数分ごとにcurlコマンドを実行するインターネット接続のあるローカルマシンでcronをセットアップすることです。
すべてのソリューションと同じようにいですが、少し信頼性があります。
他のヒント
VisualCronというWindowsツールを使用して、リモートサーバー上のhttp-password-protectedスクリプトにpingを実行し、特定のタスクを実行します。 V-Cには素敵なメールステータス通知も組み込まれています。
これは、ローカルcron + curlまたはcron + wgetの使用に関するZackの投稿と非常に似ていることに注意してください
http://www.visualcron.com http://www.visualcron.com/img/screenshots/v5/ mainwindow / mainwindow_bluetheme.png
windowsタスクスケジューラまたは atコマンド? UNIXのCRONの代替として使用できます。 (1)必要なすべての作業を実行するPHPスクリプトを作成できます(2)UNIXでCRONジョブをセットアップするか、WindowsでScheduled Taskをセットアップして、PHP CLIを介してこのスクリプトを実行できます。
リモートマシンからHTTPから開くことにより、スクリプトを実行することもできます。リモートマシンは、UNIXまたはWindowsボックスにすることができます。 Webブラウザの代わりに wget を使用でき、両方のプラットフォームで使用できます。
これらのタイプのスケジュールされたタスクを実行するために、2番目のサーバー/仮想マシンを選択します。その2番目のサーバーはオフサイトになり、プライマリサーバーが応答しなくなったときに通知するなど、他の機能を実行できます。
ところで、「正確?」の定義は何ですか
私見、これらのメソッドの上にレイヤーを書く必要があります...
User code <=> [User interface]<-> Your library <->[Technology interface] <=> Technology execution module (method)
すべてのメソッドを実装する必要はありませんが、あなたまたはあなたのクライアントが新しいメソッドを必要とする場合、彼がしなければならないのはあなたの技術インターフェースを実装することです。
ところで、「技術実行方法」より良いパフォーマンス/ホストシステム統合のためにPHPモジュールとして書くことができます。
私なら、既存のライブラリ/モジュールを探し、基礎となるシステムがスケジュールされたタスクを処理できない限り、バックグラウンドプロセスを作成しません(unixとwindowsはそれらを処理します)。