2

w/c テクニックを使用するかどうかを決めることはできません... ただし、配列の方がはるかに簡単で、コーディングが簡単/クリーンであるため、アレイの方法を使用したくなります...

簡単に説明してね..

私のメッセージング アプリには、2 つのテーブルがあります。

  1. 連絡先 - 名前と電話番号が含まれています (現在 5,000 件以上のレコード)
  2. メッセージ - メッセージと電話番号。メンバーの名前は含まれません。

可能であれば、対応する電話番号と名前を付けて、1000件のメッセージをリストする必要があります...

例えば。

  1. 「こんにちは」 - 565-1111 から (ジョン)
  2. "Bring Cheese" - from 565-2222 (ビーバー)
  3. 「へへへ」 - 565年から2332年まで
  4. 「アイアンマンかっこいい!」- 565-7748 から (アーニー)

等...

私は通常、電話番号を介して連絡先をメッセージに結合します...かなり標準的なものです...(しかし、実際には、私のクエリは単純な左結合よりも少し複雑です)

今、私はすべての連絡先をフェッチし、それをアプリ/システムがはるかに簡単で、より単純でクリーンなコードで使用できる配列に入れるというアイデアで遊んでいます...ここで:

  1. クエリSELECT * contacts

それらを配列に格納します。

contacts['555-7748'] = "John";
contacts['555-1111'] = "Joe";
contacts['555-2233'] = "Borat";
contacts['555-4234'] = "Arnie";
etc

このようにして、次のようにするだけで、ページ/スクリプトで何度も配列にアクセスして、連絡先の名前を簡単に検索できます。

$name = contacts[$phoneNumber];

私は実際にこれを実装しましたが、それは本当にクールです..頭痛の種に参加したり、連絡先テーブルを再クエリしたりする必要はもうありません..

今問題は..これは大丈夫ですか?実用的?または、ここでメモリ上限または何かにぶつかっている可能性がありますか?

それは基本的に、スクリプトが出力する各メッセージに対してJOINクエリを実行するか、すべての連絡先/レコードを配列(メモリ)に保存し、代わりにそれを参照して、クエリをより簡単にします..私の唯一の心配は、何千ものレコードを配列にクエリすることです.少し多すぎますか?それともこれは本当に問題ない/実用的ですか?特に、スクリプトが特定の連絡先を複数回取得する必要がある場合があるため...

さらに、その配列をセッション変数に格納することも考えていました! lolz..だから私のスクリプトはこのデータを簡単に共有できます..笑

良い情報をお待ちしております。ありがとうございました。


---- 2013 年 3 月 31 日 (日曜日) 時点の更新 ----


わかりました...私は今、まったく別のアプローチを考えています..

1)これはすべて、きちんとした/プレゼンテーションの目的で、各メッセージの「連絡先名」を表示する必要があるためです(電話番号ではなく、メッセージに連絡先の名前を表示する方が良いですか?)....

2) 各メッセージは、MESSAGES テーブルの電話番号に基づいて 2 つの連絡先名 (受信者と送信者) を表示する必要があるため.....

3) 代わりに、MESSAGES テーブルに 2 つのフィールドを追加することを考えています... "sender_name" と "receiver_name" ..掲示板/フォーラム ソフトウェアがこの手法を頻繁に使用するのを見てきました..

4)システムがメッセージを受信すると、メッセージに関連付けられた番号の既存の連絡先エントリをチェックします...存在する場合は、それぞれの名前を取得してストレージ/挿入に含めます

5) ..問題は、メッセージの受信中に連絡先情報が利用できないため、名前が保存されず、後で連絡先情報が作成された場合です...古いメッセージは連絡先名を意図したとおりに表示しません...

6) 3 通りの解決策... 1 つ目は、新しい連絡先が追加/変更されるたびに、私の php は一致する番号ですべてのメッセージを更新します... 2 つ目は、時々、月に 1 回、「同期ルーチン」を実行します。 「物事が同期していることを確認する..または、ユーザーが実際にメッセージを開くと、必須ルーチンが実行され、その特定のメッセージの連絡先名がまだ連絡先テーブル情報と同期しているかどうかが確認されます...そして次のように更新されます必要..

うーん...あなたに近づいたほうがいいですか?このように、単純で高速な単純な SELECT クエリを発行するだけで済みますが、名前を表示することはできます..

もう一度言いますが、QUICK 配列参照はとてもクールだと思います..笑

  • 優柔不断
4

2 に答える 2

1

DBにアクセスできますか?もしそうなら、PHP からのクエリがよりシンプルになるようにビューを作成することをお勧めします。多分それはあなたのために物事を単純化するでしょう. 単純に大きな配列ではなく、クエリを使用することをお勧めします。そうは言っても、これらにかけようとしている負荷がわかっていて、アレイが正常に機能している場合、それを避ける理由はありません。ベスト プラクティスは優れていますが、より優れたメンテナンスを生み出すコーディングの容易さについても言及すべきことがあります。

于 2013-03-30T15:36:13.390 に答える
1

先に進む方法を決めたかのように聞こえますが、その場合は、リストを管理するための最も効率的な方法を検討することをお勧めします. 私が遭遇したことのないセッション間でそれを「共有」します(セキュリティ上の理由でセッションを共有しない、またはすべきでない人)。あなたは redis.io と Memcached を複雑すぎると思い込んでいます。

これを行い、効率への影響を最小限に抑える方法の 1 つは、CRON をセットアップするか、contactsテーブルを PHP 解析可能なファイルに出力するスクリプトを定期的に実行するように一部のワーカーを構成することです。

例えば:

<?php

// Let's not run this if the app isn't accessing it.
if (!defined('APP_RUNNING_CONST')) {
    header('HTTP/1.1 401');
    exit;
}

$contacts = $db->query()... // Get the contacts list.
$lines = array();
$num_contacts = $contacts->getRows();

while ($contact = $contacts->nextRow()) {
    $contact->field->contactname = addslashes($contact->field->contactname);

    array_push($lines, "\$contacts['$contact->field->phone'] => '$contact->field->name';");
}

if (!empty($lines)) {
    $o_array = implode(PHP_EOL, $lines);
    $c_date = date('r');

    $o_array = "<?php

// CRON contact table cache to array
// Saved $c_date by __file__
// Number rows: $num_contacts

$contacts = array();
$o_array

";
}

// Write the PHP file over the last:
$contactsfilename = 'contacts.php' ...

その後、あなたがする必要があるのは

include '/secure/lists/contacts.php';

必要なページで。ファイルを置き換える方法 (コピー、保存、終了時に削除) にも注意する必要があります。

あなたができる他のいくつかの改善は、各市外局番/プレフィックスのファイルを出力することかもしれません....

contacts.403.555.inc.php
contacts.403.585.inc.php
contacts.461.550.inc.php

次に、必要な場合にのみ適切なファイル グループを自動ロードする関数を作成し (「遅延読み込み」)、static変数を使用して参照を関数内に保持します。これにより、global変数の問題も解決され、ファイルにアクセスする機能コードを中央の場所に保つことができます。もちろん、おそらく配列インターフェイスの実装を使用して、クラスを使用できます。

とにかく、さらに別のオプションは、ini ファイル形式を使用することです。

于 2013-03-30T16:09:41.750 に答える