2

初め、

セットアップ:

ユーザーが必要なデータをスクリプトに送信する「アップロード」ボタンを押した後に、いくつかのタスクを実行するスクリプトがあります。現在、この部分は必須です。現時点では、アップロードを切り取ってライブ ソースから描画するオプションはありません。

このセクションは、要点を説明するために意図的に長文になっています。それが嫌なら飛ばしてください

現在、データは正規表現を使用して非常にファンキーなソースから解析され、配列に分解されます。次に、アップロードされたデータの日付範囲に既にあるデータがないかどうか DB をチェックします。データの日付範囲がまだ DB に存在しない場合は、データを挿入し、ユーザーに成功を出力します (いくつかのセキュリティ チェック、データ ソースの検証、および基本的なアップロードの検証もあります)... データが存在する場合、次にスクリプトは、DB に既にあるデータを取得し、2 つのセットの違いを見つけ、一致しない古いデータを削除し、新しいデータを追加してから、これらの変更の影響を受ける各人にメールを送信します (1 人につき 1 通のメール)。該当するすべての変更をメールに記載する必要があります。これはまったく別の手順です)。私たちのデータベースには仕事用の電子メールがありますが、LDAP には個人用の電子メールがあるため、電子メール アドレスは LDAP 検索によって取得されます。最後に、データ アップローダーに「変更が行われ、メールが送信されました」と通知されます。彼らが気にするのは本当にそれだけです。

ここで、ユーザーの Google カレンダーにデータを投稿する (データをスケジュールする場合) Google カレンダー API を追加する可能性があります。私は彼らの仕事の予定表を介してそれを行いますが、Exchange 用の WebDav システムのセットアップに対処する前に、Google の API に慣れる必要があると考えていました。

</backstory>

今!

実践的な質問

Google 統合前のこの時点では、スクリプトの実行にかかる時間はせいぜい 1 秒半です。それはかなり印象的です、少なくとも私はそう思います(私のコーディングではなくサーバー)。しかし、テストでは、Google ビットは SLOOOOW です。おそらく修正できますが、より大きな問題が発生します...

DB が更新されたことをユーザーが確認した後、作業の一部をオフロードする最善の方法は何ですか? これは彼が最も関心を持っている部分であり、最も重要な部分です。メール通知と Google カレンダーの更新は、アップロードの影響を受けるユーザーの利益のためだけに存在します。これらの通知に問題がある場合は、スクリプトの内容に関係なく、彼に通知されます (その後、私に通知されます)。彼を最初に。

たとえば、スクリプトの最後の実行によってトリガーされる cronjob を実行する方法はありますか? PHPはexec()機能を備えたcronジョブを作成できますか? 完了する必要がある実行後の作業を処理する正規化された方法はありますか?

これに関するアドバイスは本当にありがたいです。スクリプトの肥大化は、私の開発段階と、Web アプリで分業を行う方法を最終的に知る必要があることを反映しているように感じます。

しかし、ユーザーはすべてのタスクがいつ完了したかを知る必要があるなど、これが行われていないのではないかと心配しています。

ベストプラクティス/より主観的な質問

基本的に、進行状況バー、リアルタイムのオフロード、およびユーザーをスクリプトにつなぎ留めておくその他の方法は、もちろんコードの最適化と組み合わせると、単純な方法よりも優れた、より好ましい方法であるという考えはありますか? 「私たちはあなたの役割を終えました。あなたが私たちを必要とするなら、私たちはユーザーに通知します」など.

避けるべき大きなことはありますか (明らかにユーザーにフィードバックをまったく提供しないこと以外に)?

読んでくれてありがとう。コーディング部分は非常に重要なので、2 番目の部分をカバーする必要があると感じたり、コーディング部分をカバーするのを忘れたりしないでください。

4

2 に答える 2

2

これにはcronジョブが適しています。ユーザーがデータをアップロードしたときに「やあ、ユーザー、データをありがとう!」と言うだけなら、それならこれでいい。

より迅速なアプローチを希望する場合は、 を使用exec()してバックグラウンド プロセスを開始できます。Linux 環境では、次のようになります。

exec("php /path/to/your/worker/script.php >/dev/null &");

その&部分は「バックグラウンドで私を実行してください」と言っています。この>/dev/null部分は、出力をブラック ホールにリダイレクトします。すべてのエラーを処理し、適切な関係者に通知する限り、これはすべてワーカー スクリプトの設計にかかっています。

より柔軟なクロスプラットフォーム アプローチについては、このPHP マニュアルの投稿を確認してください。

于 2009-10-11T03:24:53.957 に答える
1

これにはいくつかの方法があります。上記のように exec() を実行することもできますが、送信のクリックが多すぎると、DoS 状況に陥る可能性があります。pcntl 拡張機能は、このようなプロセスを管理するのに間違いなく優れています。この投稿をチェックして、ディスカッションを確認してください (3 つのパートがあります)。

Javascript を使用して、後で適切なワーカー スクリプトを実行する 2 番目の ajax 投稿を送信できます。ignore_user_abort() を使用して Content-Length を送信することにより、ブラウザーは早期に切断できますが、Apache プロセスは引き続き実行され、データが処理されます。利点は forkbomb の可能性がないことです。欠点は、より多くの apache プロセスを開くことです。

さらに別のオプションは、バックグラウンドで cron を使用して、プロセス キュー テーブルを調べて「後で」行うことです。フロント エンドでこのテーブルに項目を貼り付け、処理中にバックエンドでそれらを削除します ( Zend_Queueを参照)。

もう 1 つは、gearmandのようなより分散されたジョブ フレームワークを使用することです。これは、他のマシンでアイテムを処理できます。

それはすべて、全体的な能力と要件に依存します。

于 2009-10-19T00:35:04.257 に答える