0

parse_ini_fileこのメソッドを使用して読み取られるWebサイトの構成ファイルを設定しています。オプションの1つは、アクションの前の秒数です。60*60*24*33日分の秒数を取得するように値を設定してみました。

[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

注:うるう年に関する懸念は、秒を正しく計算するかどうかです(1日を追加/削除しますか?)。これが可能な場合は、個別にテストする必要があります。

上記の出力:

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()withを使用しDateTime::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 に答える