3

メイン ページの DB/テーブルのエントリ数を出力したいPHP/MySQL Web サイトがありますが、ユーザーがホームページにアクセスするたびにこのクエリを実行したくありません。1 日 1 回自動的に実行し、クエリ結果をフラット ファイルに出力して、それを含めることができるようにしたいと考えています。負荷がいくらか軽減されるはずだと思います。

これまで cron ジョブを実行したことがなく、Unix システムやコマンドにも精通していません。私のサイトは、Plesk コントロール パネルを備えた ISP にあり、cron ジョブをセットアップできる「crontab」セクションが表示されます。

どの「コマンド」を入力すればよいかよくわかりません。クエリをうまく作成できますが、PHP 経由で含めることができるフラット ファイルに結果を出力する方法がわかりません。また、理想的には、フラット ファイルは Web ルート ディレクトリ (サイトの残りの部分と共に) に表示され、毎日自分自身を上書きします。年末に 365 個のフラット ファイルで終わることは望ましくありません。

4

5 に答える 5

5

すべての作業を行うスタンドアロンの PHP スクリプトを作成し、次のように crontab に追加するだけです。

0 2 * * * cd /path/to/script; /usr/bin/php daily.php 1> output.txt 2> errors.log

daily.php午前 2 時にスクリプトが実行されるたびに、出力が にoutput.txtあり、生成されたエラー (display_errors をオンのままにしておく) はerrors.log. これには、クエリを直接 cron に入れるよりもいくつかの利点があります。

  • mysql 接続の詳細を cron に入れる必要はありません
  • 必要に応じて、サイトの PHP インクルード ファイルを含めることができます。
  • cron が実行するのを待たずに、スクリプトをスタンドアロンでテストできます。

おそらく、PHP ページにデータを含める最も簡単で安全な方法は、クエリからの結果の配列をserialize()してから、必要なときに unserialize() することです。

// daily.php
$data = array(
    'rows_in_table_foo' => 2343, // replace this with a query result
    'rows_in_table_bar' => 4321, // replace this with a query result
    );
echo serialize($data);
exit 0;

...そしてそれを読むには...

// index.php
$data = unserialize(file_get_contents('output.txt'));
于 2009-02-03T23:09:23.193 に答える
2

これは、ホスティングシステムに関する知識がなくても正しく理解するのが少し難しいかもしれません。利用可能なmysqlコマンドラインクライアントがある場合は、次のようなものを試すことができます。

/usr/bin/mysql -u db_user --password=db_password -e "SELECT COUNT(*) INTO OUTFILE '/tmp/myoutfile.txt' FROM my_table;" my_database

この呼び出しでは、「db_user」、「db_password」などを置き換える必要があることに注意してください。また/usr/bin、クライアントが私のシステム上にあるディレクトリであることに注意してください。ホスティングプラットフォームによって異なる場合があります。

Webフロントエンドでシェルコマンドを直接実行できる場合は、最初にその方法でコマンドを試してみます。これにより、何かが間違っているか欠落している場合に、より良いフィードバックが得られるはずです。

PHPのコーディングに慣れている場合、別の解決策は、ファイルの作成/更新を行う小さなPHPスクリプトを作成し、そのスクリプトをcrontabで呼び出すことです。

/path/to/php/bin/php /path/to/my/phpscript.php

もちろん、これはシステムで使用可能なPHPのコマンドラインバージョンによって異なります。

于 2009-02-03T18:18:17.710 に答える
1

質問のcrontab部分については、crontabに次のようなものを追加するだけです(コマンド「crontab-e」で編集します)。

0 0 * * * COMMAND TO EXECTUTE QUERY > THE_FILE

これは単にクエリを毎日実行し、その結果をTHE_FILEにパイプして、その内容を覆い隠します。

crontabエントリの形式は次のとおりです。

minutes hours day_of_month month day_of_week COMMAND
于 2009-02-03T18:28:01.950 に答える
0

まず最初に、「cron」と呼ばれ、実装が非常に簡単です。http: //en.wikipedia.org/wiki/Cronと入門ガイド:http://www.unixgeeks .org / security / newbie / unix/cron-1.html

このサイトではどのくらいのトラフィックが見込まれますか?ほとんどの場合、クエリの起動が大きな問題になる理由がわかりません...

  • ニコラス
于 2009-02-03T18:07:05.330 に答える
0

あなたの質問を要約しましょう。クエリ結果をキャッシュしたいのですが、どうすればいいですか?

質問に答える前に、ソリューション (フラット ファイルに保存) を提案しています。確かに、あなたはそれを行うことができます。しかし、ちょっとしたインフラストラクチャを作成する場合は、キャッシュ データ クラスを作成して、あらゆる種類のものをキャッシュしてみませんか。3つのプロパティを持つことができます

-- キャッシュ アイテム名 -- キャッシュ アイテムの値 -- キャッシュ アイテムの最終更新のタイムスタンプ

いくつかの機能を追加する

function loadCachedData($itemName);

//see if more time has passed than in the cache expiration window 
function isLoadedDataFresh($expirationWindowInSeconds);

function getLoadedItemValue();

function storeCacheValueForItem($itemName, $value);

アイテムを選択するためのクエリを既に作成する必要があるため、コントローラーで次のようにします。

$cacheHandle = new Cache();

$cacheHandler->loadCachedData('whateverMyVarIs');

$displayValue = '';
if($cacheHandler->isLoadedDataFresh(60 * 60 * 24) ) //sec*min*hour = 1 day
{
    $displayValue = $cacheHandler->getLoadedItemValue();
}
else
{
    //update the display value here with your real query
    $displayValue = doMyStuff();
    $cacheHandler->storeCacheValueForItem('whateverMyVarIs', $displayValue);

}

もちろん、そのコードを完全にクリーンアップし、有効期限ウィンドウを定数に変えて、クラスを実装する必要がありますが、それほど難しくはありません。さらに、あなたはすでにデータベースを持っています..それでキャッシュクラスをバックし、キャッシュしてください!!! または、高速キャッシングのためにさらに優れたツールを使用したい場合は、memcached を使用してください!! http://www.danga.com/memcached/

しかし最後に、私はただ尋ねなければなりません...あなたは時期尚早に最適化していますか? このページのパフォーマンスについて誰かが本当に不満を言っていますか?

于 2009-02-04T09:17:35.803 に答える