我偶尔会在星期一00:00对网站进行一些更改。这些都是非常小的修正,例如更改图像或单词。 该网站使用PHP构建,并没有使用数据库。 在半夜手动完成它会非常烦人所以我正在使用纪元时间和if语句这样:
<img src="/
<?php
$timestamp=time();
if ($timestamp<1433769105) {
echo "image1.jpg";
}
else {
echo "image2.jpg";
}
?>
">
它完成了这项工作,但想象一下像这样的20个代码分散在几个php文件中。它看起来并不专业。没有提到删除它们的时间。
我正在寻找这种方法的替代方案,但我似乎没有想出任何东西。我对任何建议持开放态度。
答案 0 :(得分:1)
在单独的服务器上编写部署服务可能会对您有所帮助,该服务器可以在星期一00:00安排FTP上载(使用cron作业)。如果你想节省一点钱,可以使用Raspberry Pi:)
进一步详细说明,服务器(或Pi)可以准备好上传新文件的副本,并准备好上传的FTP信息。然后,您可以编写一个bash脚本,通过FTP详细信息将新文件上传到您的Web服务器。
然后,您只需创建一个cron作业,以便在星期一00:00运行bash脚本。知道您的新代码将在您的服务器上,只要它在线并且可以在星期一00:00通过FTP接收文件,请坐下来放松。
要扩展部署脚本,您可以添加日志记录,以便第二天早上醒来并查看部署中的日志,以查看是否遗漏了任何文件或是否出现任何问题。
希望这有帮助!
答案 1 :(得分:1)
我在某处放置了一个migrations
文件夹并进行了迁移,如
<?php
// when the time has come
if (time() > strtotime())
{
// do the changes you wanted to make
rename("image1.jpg", "image2.jpg");
// move this migration into the done folder so
// that it doesn't get executed once more
rename(PHP_SELF, __DIR__."/done/".PHP_SELF);
}
然后,您只需包含迁移文件夹中的所有文件。然后,每次迁移都会检查是否应该执行。
// include all files in migrations
foreach (new DirectoryIterator('migrations') as $script)
{
if ($script->isFile() && substr($script, -4) === '.php')
include 'migrations/' . $script;
}
或者将日期/时间戳放入迁移名称,并且只有在时间到来时才执行:
2015-06-09.php
或1433800800.php
<?php
rename("image1.jpg", "image2.jpg");
在index.php
// include all files in migrations
foreach (new DirectoryIterator('migrations') as $script)
{
// only execute *.php files
if (! $script->isFile() || substr($script, -4) !== '.php')
continue;
// extract date
$date = substr($script, 0, -4);
// convert string dates to timestamp
// if they are not timestamps already
if (! is_numeric($date))
$date = strotime($date);
// time has come?
if (time() >= $date)
{
require 'migrations/' . $script;
// move out of migrations folder so that it
// doesn't get executed once more
rename('migrations/' . $script, 'migrations/done/' . $script);
}
}