2 min read

使用PHP在虚拟主机部署HUGO

#环境:

客户端:windows10,python3.6
服务端:PHP

#说明:

使用python脚本。调用HUGO生成静态文件,打包public然后上传。
虚拟主机的PHP脚本。删除所有文件,解压压缩包。
效果:我这个几十篇文章的小站,写完博文。双击PY脚本,1-2秒就能重新部署好。配合香港小鸡鸡,速度嗷嗷的。
【理论上适用于所有静态博客】

#服务端PHP文件(单文件): x.php文件内容,把x.php文件放到虚拟主机即可,Key和文件名可自行修改

<?php
//认证KEY
$mykey = '68464331-0d15-4118-6213-964c5d5eftee';
if (!isset($_POST["my_key"]) || $_POST["my_key"] != $mykey) exit('get out!');

//临时压缩文件名
$tmp_filename = '09asf0j0ihasdfsadfasdifna.zip';
$tmp_filename_full_path = getcwd().DIRECTORY_SEPARATOR.$tmp_filename;


// 允许上传的图片后缀
$allowedExts = array("zip");
$temp = explode(".", $_FILES["file"]["name"]);

$extension = end($temp);     // 获取文件后缀名
if (($_FILES["file"]["size"] < 20480000)   // 小于 20000 kb
&& in_array($extension, $allowedExts))
{
    if ($_FILES["file"]["error"] > 0)
    {
        echo "错误:: " . $_FILES["file"]["error"] . "<br>";
        exit();
    }
    else
    {

        if (file_exists( $tmp_filename_full_path ))
        {
            echo $tmp_filename . " 文件已经存在。\n ";
        }
        else
        {
            //清空当前目录所有文件,排除文件自身
            print('clean files... \n');
            do_rmdir(getcwd(), false);
            //exit();
            //var_dump( glob(getcwd().'\*') );
            // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
            move_uploaded_file($_FILES["file"]["tmp_name"], $tmp_filename_full_path);
            echo "file upload ok! \n";
        }
    }
}
else
{
    echo "非法的文件格式\n".$_FILES["file"]["name"];
    exit();
}

//解压缩到当前目录
$zip = new ZipArchive;
if ($zip->open( $tmp_filename_full_path  ) === TRUE) {
    $zip->extractTo( getcwd() );
    $zip->close();
    echo 'uzip ok! \n';
} 
else
{
    echo 'uzip failed\n';
    exit();
}

//删除压缩文件
if (!unlink($tmp_filename_full_path)) echo ("Error deleting tmp_zip_file\n");
else echo ("Deleted tmp_zip_file ok! \n"); 



///////////////////////////////////函数部分
/**
 * 清空/删除 文件夹
 * @param string $dirname 文件夹路径
 * @param bool $self 是否删除当前文件夹
 * @return bool
 */
function do_rmdir($dirname, $self = true) {
  if (!file_exists($dirname)) {
    return false;
  }
  //排除自身
  if ( $dirname == getcwd().'/'.basename(__FILE__)) {
    return false;
  }
  if (is_file($dirname) || is_link($dirname)) {
      return unlink($dirname);
  }
  $dir = dir($dirname);
  if ($dir) {
    while (false !== $entry = $dir->read()) {
      if ($entry == '.' || $entry == '..') {
        continue;
      }
      do_rmdir($dirname . '/' . $entry);
    }
  }
  $dir->close();
  $self && rmdir($dirname);
}
?>

#PYTHON上传脚本

#需要配置好HUGO的环境变量,任意目录都可调用
#HUGO目录:d:\hugo\mashaji.cc
#脚本地址:d:\hugo\x.py
#HUGO生成静态文件地址:d:\hugo\mashaji.cc\public
#脚本只要放在和mashaji.cc同级路径即可。 需要修改的地方看注释,双击即可运行

python脚本内容:x.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#压缩静态网页文件(ZIP)。通过POST上传

import os
import zipfile
from pathlib import PurePath
import subprocess

#判断是否存在requests模块。没有则安装
try:
    import requests
except :
    import os
    os.system('pip install requests')
    import requests

 #本文件路径
this_path = PurePath(os.getcwd())

#######################需要修改的部分
#提交网址,密匙,这里需要改成自己的网址。hugo目录名(和本文件同级的HUGO目录名称)
my_url = 'https://mashaji.cc/x.php'
my_key = '68464331-0d15-4118-6213-964c5d5eftee'
hugo_path_name = 'mashaji.cc'
#######################需要修改的部分结束   

#文件路径和临时压缩包地址,无需改动
hugo_path = str( this_path / hugo_path_name )
source_dir = str( this_path / hugo_path_name / 'public' )
zipname = str( this_path / 'hugo_tmp.zip' )

#hugo重新生成静态
print ('===========hugo重新生成静态文件...')
p = subprocess.Popen(args='hugo.exe --cleanDestinationDir --forceSyncStatic --gc --ignoreCache --minify', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, cwd=hugo_path)
p.wait()
print(p.stdout.read())
print ('===========静态文件生成完毕...')

#压缩文件
x = 1
startdir = source_dir  # 要压缩的文件夹路径
file_news = zipname  # 压缩后文件夹的名字
z = zipfile.ZipFile(file_news, 'w', zipfile.ZIP_DEFLATED)  # 参数一:文件夹名
for dirpath, dirnames, filenames in os.walk(startdir):
    fpath = dirpath.replace(startdir, '')
    fpath = fpath and fpath + os.sep or ''
    for filename in filenames:
        z.write(os.path.join(dirpath, filename), fpath+filename)
        x = x +1
z.close()
print ('=>压缩成功*'+str(x))

#上传文件
print ('=>开始上传文件:'+ zipname)
r = requests.post(url=my_url,data={'my_key':my_key}, files={'file' : open( zipname , 'rb')})
print('=========上传结果==========')
print(r.text)
print('=========上传结果==========')

#删除临时压缩包
print('=>删除临时压缩包:'+ zipname)
os.remove(zipname)
os.system('pause') #按任意键继续