【问题标题】:Handling of time intervals in .ini settings files处理 .ini 设置文件中的时间间隔
【发布时间】:2013-03-03 16:23:15
【问题描述】:

我正在为一个网站设置一个配置文件,它将使用parse_ini_file 方法读取。选项之一是某些操作之前的秒数。我尝试将值设置为 60*60*24*3 以获得三天的秒数:

[mailer]
; Number of seconds before trial expiration an email should be sent
seconds     = 60*60*24*3;

但该变量只是作为字符串“60*60*24*3”读入 php。出于安全原因,我不想使用eval。有没有什么方法可以让 (a) 更容易使用和 (b) 比简单地列出到给定日期的秒数更直观?

【问题讨论】:

  • 您打算如何了解所有可能需要处理的由INI 启动的设置? INI 文件通常是一组有限的键和值集。所以感觉应该预先计算值(您已经在设置上方的评论中指出)。话虽如此,有bcMathParser
  • @JaredFarrish - 我知道,因为我是写它的人。我会指定哪些条目可以“处理”,哪些不可以。
  • 对于如此容易手动完成的事情,似乎可能有很多麻烦和“脆弱”(对我来说)。当然是我的意见。
  • @JaredFarrish - 没问题,如果这是一个坏主意,我可以避免它。只是试图使文件更易于阅读(60*60*24*3259200 更直观)。
  • 确实如此。您可以允许strtotime() 语句,例如:ignite.io/code/5133811cec221e283b000000

标签: php date time ini


【解决方案1】:

您可以使用supported date and time formats 制作一个人类可读的字符串,然后可以使用它来初始化并计算以秒为单位的差异:

$diff = "3 days 5 hours 10 seconds";
$now = strtotime('2010-04-01 00:00:00'); // No leap year funny business
$then = strtotime($diff, $now);
$diff = $then - $now;

echo "
Now: " . date('r', $now) . "
Then: " . date('r', $then) . "
Diff (seconds): $diff";

https://ignite.io/code/51338967ec221e0d3b000000

注意:关于闰年的问题是它是否会正确计算秒数(添加/删除一天?)。如果可能的话,应该独立测试。

以上输出:

Now: Thu, 01 Apr 2010 00:00:00 +0000
Then: Sun, 04 Apr 2010 05:00:10 +0000
Diff (seconds): 277210

然后让你这样做:

[mailer]
; Period before trial expiration an email should be sent.
; Use PHP-supported time statements in an expression to
; specify an interval, such as 3 days, or 72 hours, etc.
; See: http://www.php.net/manual/en/datetime.formats.php
expires     = 3 days;

正如我在 cmets 中所指出的,您也可以使用 DateTimeInterval::createFromString()DateTime::diff 来做同样的事情。

我还要指出,正确格式化字符串虽然并不困难,但有时可能比您想象的要棘手。对于像3 days 这样的简单字符串,这并不难,但3d 不起作用。因此,计算的时间应该得到验证,如果输入的内容不是有效的表达式,或者“超出范围”,则应向设置配置的人员提供错误 预期(过去可能?)。

【讨论】:

    【解决方案2】:

    将你的ini重命名为php并这样写

    # Number of seconds before trial expiration an email should be sent
    $cfg['somesection']['someparam'] = 'foo';
    ...
    $cfg['mailer']['seconds'] = 60*60*24*3;
    

    或使用屏幕计算器进行数学运算并将结果粘贴为值。

    【讨论】:

    • 这可能是一个很好的解决方法,但它并不能真正回答问题。
    猜你喜欢
    • 2012-04-06
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 2017-06-24
    • 2023-01-12
    • 2014-10-03
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多