2013-03-03 41 views
0

我設置了一個配置文件的網站,該網站將使用parse_ini_file方法來讀取。其中一個選項是某些操作之前的秒數。我試着將該值設置爲60*60*24*3拿到秒3天的價值:處理中的.ini設置的時間間隔的文件

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

但變量只是讀入PHP作爲字符串「60 * 60 * 24 * 3」。出於安全原因,我不想使用eval。有沒有什麼辦法可以讓這個(a)更容易使用,(b)更直觀的閱讀比簡單地列出給定日期的秒數?

+0

你怎麼打算知道每個地方*可能*需要處理的INI發起的設置?通過dint,INI文件通常是一組有限的鍵和值集。所以感覺這些值應該是預先計算出來的(您已經在設置的上面註釋中指出了這些值)。這就是說,有[bcMathParser](http://www.bestcode.com/math-parser-php-docs/)。 – 2013-03-03 16:40:35

+0

@JaredFarrish - 我知道,因爲我是寫它的人。我會指定哪些條目可以被「處理」,哪些條目不會。 – eykanal 2013-03-03 16:44:40

+0

似乎可能有很多麻煩和「脆弱」(對我來說)手動操作很容易。我的意見,當然。 – 2013-03-03 16:51:17

回答

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

或使用屏幕計算器做數學和粘貼結果作爲值。

+1

這可能是一個很好的解決方法,但它並沒有真正回答這個問題。 – eykanal 2013-03-03 16:33:07

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工作。這樣計算時間應進行驗證,並提供給個人設置,如果輸入的內容配置錯誤是不是一個有效的表達式,或者是「越界」到什麼預期(過去也許?)。