4

PHP は、シャットダウン関数を登録するメカニズムを提供します。

register_shutdown_function('shutdown_func');

問題は、PHP の最近のバージョンでは、この関数がまだリクエスト中に実行されることです。

リクエスト全体のコードの一部がデータベースにログインするエントリを登録できるプラットフォーム(それが重要な場合はZend Framework内)があります。リクエスト全体で大量の個別の挿入ステートメントを使用してページを遅くするのではなく、リクエストの最後に挿入されるようにそれらをキューに入れます。HTTP 要求がユーザーで完了した後にこれを実行できるようにしたいので、ログに記録したり、他のクリーンアップ タスクを実行したりする時間が、ユーザーが認識したページの読み込み時間に影響を与えないようにします。

これを行うためのPHPの組み込みメソッドはありますか? または、外部プロセスを使用してある種の共有メモリ空間スキームを構成し、そのプロセスにログを記録するように通知する必要がありますか?

4

4 に答える 4

4

MySQL の挿入時間が本当に気になる場合は、原因ではなく症状に対処している可能性があります。

たとえば、ユーザーが HTML を取得した後に PHP/Apache プロセスが実行されている場合、PHP/Apache プロセスは引き続きその要求にロックされます。忙しいので、別のリクエストが来ると、Apache は別のスレッドを fork し、そのスレッドにより多くのメモリを割り当て、追加のデータベース接続を開く必要があります。

パフォーマンスの問題が発生している場合は、PHP/Apache の実行から重労働を取り除く必要があります。大量のクリーンアップ タスクが実行されている場合、貴重な Apache プロセスが消費されています。

エントリをファイルに記録し、crontab でこれらを帯域外でデータベースにロードすることを検討します。他にも負荷の高いタスクがある場合は、キューイング/ジョブ処理システムを使用して帯域外で作業を行います。

于 2008-11-16T06:30:20.347 に答える
1

register_shutdown_function() 以外に、スクリプトがいつ終了したかを判断する組み込みメソッドはありません。ただし、Zend Framework には、ディスパッチ プロセスの特定のポイントでコードを実行するためのフックがいくつかあります。要件に最も関連するのは、アクションがディスパッチされた直後に発生するアクション コントローラーのポスト ディスパッチ フックと、コントローラー プラグイン ブローカーのdispatchLoopShutdown イベントです。

マニュアルを読んで、どちらが自分に適しているかを判断する必要があります。

編集:私は完全に理解していなかったと思います。これらのフックから、現在のプロセスを何らかの形でフォークできます。プログラムの実行中のマニュアルで読むことができるように、PHP にはプロセスをフォークする方法がいくつかあります。pcntl 拡張機能について調べることをお勧めします。このブログ投稿を読んで、子プロセスをフォークしてバックグラウンドで実行する例を確認してください。

于 2008-11-16T03:10:44.510 に答える
0

このランダムな男のブログへのコメントは、あなたが望むものに似ています。そのヘッダー トリックが機能しない場合、そのブログのコメントの 1 つにexec()、別の PHP スクリプトをバックグラウンドで実行するように提案するものがあります (Web ホストの構成で許可されている場合)。

于 2008-11-16T04:09:37.777 に答える
0

これはあなたの好みには少しハックかもしれませんが、効果的で簡単な回避策です。

選択したDBによって管理される「キュー」を作成し、最初にリクエストをデータベースのキューテーブルに保存してから、スクリプトにつながるiframeを出力して、キューのqueue_idと一致する命令をトリガーすることができますデータベース。

元:

<?php
mysql_query('INSERT INTO queue ('instructions') VALUES ('something would go here');
echo('<iframe src="/yourapp/execute_queue/id?' . mysql_insert_id() . '" />');
?>

フレームは次のようになります

元:

<?php
$result = mysql_query('SELECT instructions FROM queue WHERE id = ' . $_GET['id']);
// From here, simply execute some instruction based on the "instructions" field, then delete the instruction from the database.
?>

私が言ったように、これをハックだと考える方法はわかりますが、フレームは親ページとは無関係に読み込まれるため、バックグラウンドで他のアプリを実行しなくても目的を達成できます。

これが少なくともあなたを正しい方向に向けることを願っています。

乾杯!

于 2008-11-16T04:14:12.557 に答える