kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

PHP GZ压缩与解压

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*将字符串添加至GZ文件*/
function gz_str($str,$gz_name) {
	$fp = gzopen($gz_name, 'w9');
	gzwrite ($fp, $str);
	gzclose($fp); 
}

/*将文件添加至GZ文件*/
function gz_file($file,$gz_name) {
	$fp = gzopen($gz_name, 'w9');
	gzwrite($fp, file_get_contents($file));
	gzclose($fp); 
}

/*读取GZ文件*/
function read_gz($gz_file) {
	$buffer_size = 4096; // read 4kb at a time
	$file = gzopen($gz_file, 'rb');
	$str='';
	while (!gzeof($file)) {
		$str .= gzread($file, $buffer_size);
	}
	gzclose($file);
	return $str;
}
/*解压GZ文件*/
function unzip_gz($gz_file) {
	$buffer_size = 4096; // read 4kb at a time
	$out_file_name = str_replace('.gz', '', $gz_file);
	$file = gzopen($gz_file, 'rb');
	$out_file = fopen($out_file_name, 'wb');
	$str = '';
	while (!gzeof($file)) {
		fwrite($out_file, gzread($file, $buffer_size));
	}
	fclose($out_file);
	gzclose($file);
}

PHP 实现文件夹遍历

https://m.php.cn/faq/552354.html

opendir() 函数

opendir() 函数是 PHP 用于打开文件夹的函数,在调用该函数时需要传入文件夹路径作为参数。在文件夹打开成功后,可以通过 readdir() 函数读取文件夹中的内容。

1
2
3
4
5
6
7
8
$dir = './test';  //文件夹路径
$handle = opendir($dir);  //打开文件夹
while ($file = readdir($handle)) {  //循环读取所有文件
	if ($file != "." && $file != "..") {  //排除"."和".."两个特殊的文件夹
		echo $file."<br>";  //输出文件名
	}
}
closedir($handle);  //关闭文件夹

在上面的示例代码中,我打开了一个名为 “test” 的文件夹,并循环读取了该文件夹中的所有文件名,并忽略了 “.” 和 “..” 两个特殊的文件夹。

is_dir() 函数和递归遍历

如果要遍历一个目录下的所有子目录和文件,我们可以使用递归方法。在遍历过程中,我们还需要判断当前遍历到的是文件夹还是文件,可以使用 is_dir() 函数来进行判断。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function scanDir($dir) {
	if (!is_dir($dir)) {
		echo '不是一个有效的文件夹路径';
		return;
	}
	$handle = opendir($dir);  //打开文件夹
	while ($file = readdir($handle)) {  //循环读取所有文件
		if ($file == '.' || $file == '..') {  //忽略掉 ".",".." 特殊文件夹
			continue;
		}
		$path = $dir.'/'.$file;  //当前文件或文件夹的完整路径
		if (is_dir($path)) {  //如果是一个文件夹
			echo '<b>'.$file.'</b><br>';  //输出文件夹名称
			scanDir($path);  //递归遍历子文件夹
		} else {  //如果是一个文件
			echo $file.'<br>';  //输出文件名称
		}
	}
	closedir($handle);  //关闭文件夹
}

在上面的示例代码中,我定义了一个函数 scanDir(),该函数接受一个文件夹路径作为参数。在函数内部,我首先判断传入的路径是否为文件夹。如果不是文件夹,则直接返回。

接下来,我打开文件夹,并循环读取其中的文件和文件夹。当遍历到文件夹时,我会输出文件夹名称,并递归调用 scanDir() 函数遍历子文件夹。当遍历到文件时,我只是输出文件名称。

scandir() 函数

PHP 还提供了一个非常简单的函数 scandir(),可以用于一次性获取一个文件夹下的所有文件和文件夹名称。和 opendir() 函数不同的是,该函数返回的是一个数组,数组中包含了所有子文件夹和文件的名称。

1
2
3
4
5
6
7
8
$dir = './test';  //文件夹路径
$files = scandir($dir);  //获取文件夹下所有文件和文件夹名称
foreach($files as $file){  //循环遍历
	if($file == '.' || $file == '..'){  //忽略掉 ".",".." 特殊文件夹
		continue;
	}
	echo $file.'<br>';  //输出文件或文件夹名称
}

在上面的示例代码中,我调用了 scandir() 函数获取了文件夹下所有文件和文件夹名称,并循环遍历了这个数组。同样地,我忽略了两个特殊的文件夹 “.” 和 “..”,只输出了文件夹和文件的名称。

linux rsync 备份静态文件脚本

mysqlbak.sh

1
2
3
php rsync.php u8 2023-01-01

php rsync.php aps 2023-01-01

rsync.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?php

function sDir(&$fpa, &$dones, $logs, $ptime, $dir, $pre = 0)
{
	if (!is_dir($dir))
		return;

	// 类型 大小 时间 是否gzip 文件名或目录名
	$path = $dir;
	if (!isset($dones[$path])) {

		$tp = is_link($path) ? 'dir_link' : 'dir';
		$s = filesize($path);
		$t = filectime($path);
		$gz = 'no';

		echo "同步 {$tp}: {$path}\n";
		exec("echo 同步 {$tp}: {$path} >> {$logs}");

		exec("rsync -avd --max-size 0 {$path}/. root@192.168.1.2:/home/bak/rsync_178/{$path} >> {$logs} 2>&1");
		fputcsv($fpa, array(date('Y-m-d_H:i:s'), $tp, $s, $t, $gz, $path), "\t");
		$dones[$path] = array('', $tp, $s, $t, $gz, $path);
	}
	if (is_link($path))
		return;

	$handle = opendir($dir);
	while ($file = readdir($handle)) {
		if ($file == '.' || $file == '..')
			continue;

		$path = $dir . '/' . $file;

		$tp = '';
		$s = filesize($path);
		$t = filemtime($path);
		$gz = 'no';

		if (is_dir($path)) {

			sDir($fpa, $dones, $logs, $ptime, $path, $pre + 8);

		} elseif (isset($dones[$path])) {

			if ($s >= 100 and $t < $ptime and $dones[$path][1] == 'file') {
				$suf = substr($path, -3);
				$retval1 = $retval2 = '';
				if ($suf != '.gz') {

					$spath = str_replace(' ', '\\ ', str_replace(')', '\\)', str_replace('(', '\\(', $path)));

					exec("gzip {$spath}", $output, $retval1);
					$tp = 'gz';
					$gz = 'yes' . $retval1 . $retval2;
					fputcsv($fpa, array(date('Y-m-d_H:i:s'), $tp, $s, $t, $gz, $path), "\t");

					echo "{$dones[$path][0]} 已经同步, gzip压缩: {$path}\n";
				}
			}

		//    if ($tp == '')
		//        echo "{$dones[$path][0]} 已经同步: {$path}\n";

		} elseif (is_link($path)) {

			$tp = 'link';
			echo "同步 {$tp}: {$path}\n";
			exec("echo 同步 {$tp}: {$path} >> {$logs}");

			exec("rsync -akv {$path} root@192.168.1.2:/home/bak/rsync_178/{$path} >> {$logs} 2>&1");
			fputcsv($fpa, array(date('Y-m-d_H:i:s'), $tp, $s, $t, $gz, $path), "\t");
			$dones[$path] = array('', $tp, $s, $t, $gz, $path);
		} else {

			$spath = str_replace(' ', '\\ ', str_replace(')', '\\)', str_replace('(', '\\(', $path)));

			$tp = 'file';
			echo "同步 {$tp}: {$path}\n";
			exec("echo 同步 {$tp}: {$spath} >> {$logs}");

			$suf = substr($path, -3);
			$addsuf = ($suf != '.gz') ? '.gz' : '';
			$retval1 = $retval2 = '';

			if ($s < 100) {
				exec("rsync -av {$spath} root@192.168.1.2:'/home/bak/rsync_178/{$spath}' >> {$logs} 2>&1");
			} elseif ($t < $ptime) {
				$gz = 'yes';
				if ($suf != '.gz')
					exec("gzip {$spath}", $output, $retval1);
				exec("rsync -av {$spath}{$addsuf} root@192.168.1.2:'/home/bak/rsync_178/{$spath}{$addsuf}' >> {$logs} 2>&1");
			} else {
				$gz = 'yes';
				if ($suf != '.gz')
					exec("gzip {$spath}", $output, $retval1);
				exec("rsync -av {$spath}{$addsuf} root@192.168.1.2:'/home/bak/rsync_178/{$spath}{$addsuf}' >> {$logs} 2>&1");
				if ($suf != '.gz')
					exec("gunzip {$spath}{$addsuf}", $output, $retval2);
			}
			$gz .= $retval1 . $retval2;
			fputcsv($fpa, array(date('Y-m-d_H:i:s'), $tp, $s, $t, $gz, $path), "\t");
			$dones[$path] = array('', $tp, $s, $t, $gz, $path);
		}
	}
	closedir($handle);
}

if ($argc != 3) {
	echo "run: {$argv[0]} dir 2023-01-01\n";
	exit(-1);
}

$dir = $argv[1];
$ptime = strtotime($argv[2]);


$files = "rsync_{$dir}.files";
$logs = "rsync_{$dir}.log";


// 读取已经同步的列表
$dones = array();
if (file_exists($files)) {
	$fp = fopen($files, 'r');
	while ($line = fgetcsv($fp, 0, "\t")) {
		if ($line[1] == 'gz')
			continue;
		$file = $line[5];
		$dones[$file] = $line;
		$dones[$file . '.gz'] = $line;
	}
	fclose($fp);
}


$fpa = fopen($files, 'a');
sDir($fpa, $dones, $logs, $ptime, $dir);
fclose($fpa);