0

我有一些对我很有效的代码。但是,我现在希望对其进行修改,以便不会在每次刷新页面时都进行更改,而是每周仅在星期一刷新一次。

每次刷新时更改它的代码是:

<center><?php
    ?><div style="min-height: 75px; padding-top: 0px; padding-left: 5px; padding-right: 5px;">
    <?php
$file  = "/pathway/to/the_file/on_the_server/theme_name/file_name.txt";
$quote = file($file);
echo $quote[array_rand($quote)];
?></div></center>

我一直在寻找答案,但还没有找到足够的例子来改变这一点。我认为迄今为止我发现的最接近的可能示例是 [here][1]

[1]:如何在 php 中每 2 周显示不同的图像?. 我从该链接定位的具体示例是:

$week = date('W');
$changes = (int)(($week-1)/2);
$image = $changes % 8 + 1;

printf("Week: %d, Images changed: %d, Current Image: %d\n"
   , $week, $changes, $image);

现在,通过那个例子,似乎需要知道“图像”的数量。由于我正在使用我将不断添加的报价文件,因此我不想计算有多少报价,也不会在每次向文件中添加更多报价时不断更改此代码。

有没有办法改变这个例子以适应我正在努力做我正在寻找的东西,或者我不是在正确的道路上?

提前感谢您的意见。

4

2 回答 2

0

您可以使用filemtime()来确定文件上次更改的时间。文档说“时间作为Unix 时间戳返回”,这意味着它以秒为单位。您可以使用 获取当前时间time()。您可以使用date('N'). file_get_contents()您可以使用and获取和写入“当前报价文件”的内容file_put_contents()

为了稳定性,检查file_exists().

$currentQuoteFile = "current-quote.txt";
$quoteFile = "all-quotes.txt";

if (!file_exists($currentQuoteFile)) {
    // Create a new "current quote file" if it doesn't exist yet.
    $pickNewQuote = true;
} else {
    $lastModified = filemtime($currentQuoteFile);

    $oneDayInSeconds = 60 * 60 * 24;
    $oneWeekInSeconds = $oneDayInSeconds * 7;

    // Look for the Monday on or before the last modified date. This lets us
    // emulate "updating on Monday" without actually requiring someone to visit
    // this page every Monday.
    $lastModified -= (date("N", $lastModified) - 1) * $oneDayInSeconds;

    // If the current time is at least a week later than the Monday on or
    // before the quote file was updated, we need to pick a new quote.
    $pickNewQuote = time() - $oneWeekInSeconds > $lastModified;
}

if ($pickNewQuote) {
    $quotes = file($quoteFile);
    $quote = $quotes[array_rand($quotes)];
    file_put_contents($currentQuoteFile, $quote);
} else {
    $quote = file_get_contents($currentQuoteFile);
}

有关“查找上次修改日期或之前的星期一”的进一步解释,请考虑如果您的网站在星期四和星期二访问会发生什么。在星期四,您将创建一个新的当前报价文件,而在星期二,距离该文件上次更新不到一周,但我们想让它看起来像是在星期一更新的。通过查看上次修改时间之前的星期一,我们会看到距离那一天已经过去了一周,因此我们将创建一个新的当前报价文件。

您可以通过删除小时和分钟部分来使它变得更好,因此它总是会在星期一午夜“更新”,但是我太累了,无法写,您应该能够使用date(),或者只是一些巧妙的除法和乘法。

于 2013-08-23T03:13:31.763 回答
0

你可以做这样的事情。您可以将照片文件名和上次更改日期存储在文件中。在星期一,照片会更改并记录到文件中。使用 array_rand 可能会每周重复一次。您可以轻松添加额外的逻辑,以确保阵列中的新照片与前一周不同。希望有帮助

if (date('l') == 'Monday') {
   $aFileContents = file('photoDate.txt');

   if($aFileContents[1] == date('Y-m-d')) {
      $photo = $aFileContents[0];
   } else {
      $photo = array_rand($aPhotoArray);
      $fp = fopen('photoDate.txt', 'w');
      fwrite($fp, $photo . '\n');
      fwrite($fp, date('Y-m-d'));
      fclose($fp);
   }
} else {
   $aFileContents = file('photoDate.txt');
   $photo = $aFileContents[0];
}
于 2013-08-23T03:29:20.230 回答