我正在为网站设置配置文件,该文件将使用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)更直观地阅读,而不是简单地列出给定日期的秒数?
答案 0 :(得分: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;
正如我在评论中指出的那样,您也可以使用DateTimeInterval::createFromString()
和DateTime::diff
来执行相同的操作。
我还要注意,正确地格式化字符串虽然并不困难,但有时候比你想象的要复杂。对于像3 days
这样的简单字符串并不难,但3d
不 有效。因此,应该验证计算的时间,并且如果输入的内容不是有效的表达式,或者对 的“超出范围”,则向设置配置的人员提供错误预计(过去可能?)。
答案 1 :(得分:-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;
或使用屏幕计算器进行数学运算并将结果粘贴为值。