0

我正在为网站设置一个配置文件,将使用该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)比简单地列出给定日期的秒数更直观?

4

2 回答 2

1

您可以使用支持的日期和时间格式来制作人类可读的字符串,然后可以使用它来初始化和计算以秒为单位的差异:

$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;

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

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

于 2013-03-03T17:39:41.623 回答
-1

将您的ini重命名为php并以这种方式编写

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

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

于 2013-03-03T16:27:44.110 回答