Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在数据库中存储要执行的操作,还是根据代码决定?_Php_Database_Email_Cron_Structure - Fatal编程技术网

Php 在数据库中存储要执行的操作,还是根据代码决定?

Php 在数据库中存储要执行的操作,还是根据代码决定?,php,database,email,cron,structure,Php,Database,Email,Cron,Structure,我有一个网站,我想在顾客买东西后的几天内给他们发送一些后续电子邮件。我现在想知道怎么做。我认为有两种选择: 在数据库中创建一个表,在其中存储我计划发送的电子邮件。因此,我只需存储客户的电子邮件地址和发送日期。然后,我只需每天运行cron,发送需要发送的电子邮件,并将表中的状态设置为“已发送”。这种方法的优点是我知道需要发送哪些电子邮件。缺点是我不够灵活;更改我发送电子邮件的天数并不容易,因为它们存储在数据库中 我还可以通过运行cron从代码中获取x天前购买物品的客户列表,向他们发送电子邮件,然后

我有一个网站,我想在顾客买东西后的几天内给他们发送一些后续电子邮件。我现在想知道怎么做。我认为有两种选择:

  • 在数据库中创建一个表,在其中存储我计划发送的电子邮件。因此,我只需存储客户的电子邮件地址和发送日期。然后,我只需每天运行cron,发送需要发送的电子邮件,并将表中的状态设置为“已发送”。这种方法的优点是我知道需要发送哪些电子邮件。缺点是我不够灵活;更改我发送电子邮件的天数并不容易,因为它们存储在数据库中
  • 我还可以通过运行cron从代码中获取x天前购买物品的客户列表,向他们发送电子邮件,然后将我向他们发送电子邮件的事实存储在数据库中。这种方法的优点是我更灵活。如果我想稍后发送电子邮件,我可以在代码(或一些变量)中简单地定义它。缺点是我没有将要发送的电子邮件的列表(尽管我真的不知道这对什么有用)

  • 我的问题其实是,;在这种情况下,最佳做法是什么?大多数网站是如何处理的?为什么?

    我会选择方法2

    缺点并不是真正的缺点。假设您有一个“order”表,只需进行与cron使用的查询非常相似的查询,就可以获得要发送的邮件列表


    但这是个人的选择。我不知道通常使用哪种方法。

    我会将这两种方法结合起来,这就是我在当前开发的系统中实际使用的方法

    有一个“准备发送”列表对于记录和跟踪您的电子邮件非常有用,例如,如果您使用第三方电子邮件解决方案,并且您每月的电子邮件数量有限,您可以从您的程序中跟踪您的使用量,甚至可能触发自动“升级”如果您需要更多电子邮件,请在需要时使用该帐户

    所需的灵活性可以通过为该表设计良好的模式来实现

    您描述的解决方案将有一个类似的模式,因此我猜:

    |---------|---------|------|---------|-------|
    | send_to | subject | body | send_at | sent  |
    |---------|---------|------|---------|-------|
    
    这确实不灵活,因为一旦插入数据库,为了更改
    send_at
    列,您必须从订单中检索数据,并重新计算
    send_at

    我提出这样一个模式:

    |---------|---------|------|-----------|---------|-------|
    | send_to | subject | body | added_at  | send_in | sent  |
    |---------|---------|------|-----------|---------|-------|
    
    更改是,
    send_at
    列现在没有固定。当您运行
    cron
    时,将仅检索与以下查询匹配的电子邮件:

    !sent && added_at + send_in >= now
    
    这将返回与使用以下命令查询第一个架构相同的结果:

    !sent && send_at >= now
    

    但是现在,您可以轻松更改电子邮件添加到队列和实际发送之间的等待时间。

    第一部分对我来说更好。您实际上不必创建另一个表来存储电子邮件和日期。只需在您已经创建的表中创建另一个日期列,例如,电子邮件应在10天后发送,只需将该部分编码在类似“提醒日期”的列中,并使其在cron中运行。对于电子邮件来说,如果您在会话中存储了每个用户的电子邮件,那么它就很容易了。您所要做的就是在电子邮件中写入$会话['email']以分手,登录用户的电子邮件将发送给相应的人