2

我不能决定 w/c 技术去 w/... 尽管我很想采用 Array 方式,因为它更直接并且更容易/更清洁编码......

让我用简单的方式解释..

对于我的消息传递应用程序,我有 2 个表

  1. 联系人 - 包含姓名和电话号码(目前有 5,000 多条记录)
  2. 消息 - 消息和电话号码,但不是成员的姓名

如果可能的话,我需要列出 1000 条消息,包括相应的电话号码和姓名……

例如。

  1. “嗨,伙计” - 来自 565-1111(约翰)
  2. “带奶酪” - 来自 565-2222(比伯)
  3. “呵呵呵呵” - 来自 565-2332
  4. “钢铁侠好帅!” - 从 565-7748 (阿尼)

ETC...

我通常会通过电话号码将联系人加入到消息中......非常标准的东西......(但实际上我的查询比简单的左连接要复杂一些)

现在,我一直在玩弄获取所有联系人并将其放入数组中的想法,我的应用程序/系统可以在其中以更简单、更直接和更简洁的代码使用它......其中:

  1. 询问SELECT * contacts

并将它们存储到一个数组中:

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

这样,我可以通过访问数组轻松查找联系人的名称,在我的页面/脚本中多次,只需执行以下操作:

$name = contacts[$phoneNumber];

我实际上已经实现了这一点,它真的很酷.. 没有更多的加入头痛和重新查询联系人表等..

现在的问题是..这样可以吗?实际的?或者我可以在这里达到一些内存上限或其他东西吗?

它基本上是在我的脚本输出的每条消息上运行 JOIN 查询或将所有联系人/记录存储到数组(内存)中并引用它,使查询更简单.. 我唯一担心的是,将数千条记录查询到一个数组中,可能是不是有点过分?或者这真的可以/实用吗?特别是因为有时我的脚本需要多次获取特定联系人......

另外,我还考虑将该数组存储到 Session 变量中!大声笑..所以我的脚本可以简单地共享这些数据..大声笑

期待一些好的投入谢谢大家。


---- 2013 年 3 月 31 日(星期日)更新 ----


好的......我现在正在考虑一种完全不同的方法......

1)因为这一切真的是我需要为每条消息显示“联系人姓名”以用于整洁/演示目的(最好在消息上看到联系人的姓名而不是电话号码是吗?)....

2)并且由于每条消息都需要根据他们在 MESSAGES 表中的电话号码显示 2 个联系人姓名(收件人和发件人).....

3)我现在正在考虑将 2 个字段添加到 MESSAGES 表中......“sender_name”和“receiver_name”..我已经看到公告板/论坛软件大量使用这种技术..

4)当系统收到一条消息时,它会检查与消息相关联的号码的现有联系人条目......如果存在,获取相应的名称并将其包含到存储/插入中

5)..问题是如果在收到消息期间,联系信息不可用,因此没有保存姓名..然后创建联系信息......旧消息不会按预期显示联系人姓名......

6)3路解决方案... 1st,每次添加/更改新联系人时,我的php都会更新所有带有匹配号码的消息... 2nd,不时可能每月一次,运行“同步例程” “以确保事情是同步的..或者,当用户实际打开一条消息时,将运行强制例程以检查该特定消息的联系人姓名是否仍然与联系人表信息同步......并进行更新必要的..

嗯...更好地接近你的东西?这样,我只需要发出直接的 SELECT 查询,简单,快速..但能够显示名称..

话又说回来,我还是觉得 QUICK 数组引用的东西很酷.. lolz

  • 优柔寡断
4

2 回答 2

1

听起来您似乎已经决定如何进行,在这种情况下,我建议您寻找最有效的方法来管理您的列表。在我没有遇到过的会话中“共享”它(出于安全原因,他们不共享会话,或者不应该)。你把 redis.io 和 Memcached 说得太复杂了。

您可以做到这一点并将其对效率的影响降到最低的一种方法是设置 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 回答
1

您可以访问数据库吗?如果是这样,我建议创建一个视图,以便您的 PHP 查询更简单。也许这会为你简化事情。我仍然建议使用查询而不是简单的大数组。话虽如此,如果您知道要在这些设备上施加的负载并且阵列工作正常,则没有任何理由避免它。最佳实践是好的,但是为了便于编码,有一些话要说,这会带来更好的维护。

于 2013-03-30T15:36:13.390 回答