forked from loveshell/cnxct
-
Notifications
You must be signed in to change notification settings - Fork 0
/
apc_dump.php
252 lines (226 loc) · 8.83 KB
/
apc_dump.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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
<?php
/*
** 说明:此文件为apc导出文件,只需要在导出服存在。在生产服务器只需要bin文件,即可。
** 需要保证导出服务器的web路径跟目标运行服务器的web路径一致
** 导出:要确认 wwwroot同级目录下,存在bin目录,之后,执行此文件(放在tool目录下),出现“Apc cache done!”即视为成功,之后将bin文件以及其他所有文件(多数已经被清空)复制到目标服务器。
** 导入:打过自动加载patch,在php.ini中新增apc.preload_binfile="/data/bin/xyws.bin" 即可
** AUthor CFC4N cfc4n@cnxct.com $Id: apc_dump.php 2812 2013-02-07 07:07:29Z cfc4n $
*/
if (php_sapi_name() == 'cli')
{
define('NEWLINE',"\n");
}
else
{
define('NEWLINE','<br />');
}
//define('PROJECTROOT',dirname(__FILE__));
define('PROJECTROOT','/data/htdocs'); //此处为项目路径,已经写死。可自行调整
/* 定义项目主路径信息 */
define('SYSTEMROOT',PROJECTROOT.DIRECTORY_SEPARATOR.'system');
define('WWWROOT',PROJECTROOT.DIRECTORY_SEPARATOR.'wwwroot');
define('SERVERROOT',PROJECTROOT.DIRECTORY_SEPARATOR.'server');
define('COREROOT',PROJECTROOT.DIRECTORY_SEPARATOR.'core');
define('DUMPROOT',PROJECTROOT.DIRECTORY_SEPARATOR.'dumproot');
define('APCBIN',DUMPROOT.DIRECTORY_SEPARATOR.'bin');
define('BINNAME','xyws.bin');
define('MD5FILENAME','xyws_files.md5');
$strDateTime = date('YmdHis');
//定义需要cache的目录
$arrCacheDir = array(COREROOT,SYSTEMROOT,WWWROOT,SERVERROOT);
/* 需要过滤的文件 */
$arrDropFile = array(__FILE__, WWWROOT.DIRECTORY_SEPARATOR.'AmfConfig.php',WWWROOT.DIRECTORY_SEPARATOR.'ResConfig.php');
/* 需要过滤的目录 */
$arrDropDir = array(WWWROOT.DIRECTORY_SEPARATOR.'config',WWWROOT.DIRECTORY_SEPARATOR.'views',WWWROOT.DIRECTORY_SEPARATOR.'tool',WWWROOT.DIRECTORY_SEPARATOR.'controllers'.DIRECTORY_SEPARATOR.'amfphp',SERVERROOT.DIRECTORY_SEPARATOR.'config',SERVERROOT.DIRECTORY_SEPARATOR.'logs',SYSTEMROOT.DIRECTORY_SEPARATOR.'logs');
/* 需要复制的文件 */
$arrCopyFile = array(
WWWROOT.DIRECTORY_SEPARATOR.'crossdomain.xml',
WWWROOT.DIRECTORY_SEPARATOR.'cross_origin.htm',
SERVERROOT.DIRECTORY_SEPARATOR.'restart_task.sh',
SERVERROOT.DIRECTORY_SEPARATOR.'start_task.sh',
SERVERROOT.DIRECTORY_SEPARATOR.'stop_task.sh',
);
/* 以下内容,请勿变更 */
$arrCacheFile = $arrCacheFileFailed = array();
/* bin 目的目录检测*/
if (!is_dir(APCBIN))
{
if(!mkdir(APCBIN,0777,true))
{
echo APCBIN,' can\'t to create!'.NEWLINE;
exit();
}
}
apc_clear_cache ('user'); //清空导出之前的缓存
/* 循环读取需要cache的目录*/
foreach ($arrCacheDir as $value)
{
compileDir($value);
}
/* 生成bin文件*/
if (!apc_bin_dumpfile($arrCacheFile, array(), APCBIN.DIRECTORY_SEPARATOR.BINNAME.'_'.$strDateTime))
{
exit('write to '.APCBIN.DIRECTORY_SEPARATOR.BINNAME.'_'.$strDateTime.' failed!!!'.NEWLINE);
}
$strBinMd5 = md5_file(APCBIN.DIRECTORY_SEPARATOR.BINNAME.'_'.$strDateTime);
/* 未被缓存的php警告*/
foreach ($arrCacheFileFailed as $value)
{
echo $value," cant't to cached .....".NEWLINE;
}
/* 清空被缓存文件*/
replaceFile($strBinMd5);
/* 复制被过滤文件 */
moveDropFile($arrDropFile);
/* 复制需要被复制文件 */
moveDropFile($arrCopyFile);
/* 复制被过滤目录 */
moveDropDir($arrDropDir);
exit('Apc cache done!'.NEWLINE);
function compileDir ($dir)
{
global $arrCacheFile, $arrCacheFileFailed, $arrDropDir, $arrDropFile;
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle))) {
if ($file != '.' && $file != '..')
{
if (is_dir($dir.DIRECTORY_SEPARATOR.$file))
{
//exit($dir.DIRECTORY_SEPARATOR.$file);
//判读是否为排除目录
if (!in_array($dir.DIRECTORY_SEPARATOR.$file,$arrDropDir))
{
compileDir($dir.DIRECTORY_SEPARATOR.$file);
}
else
{
echo 'skip dir : ',$dir.DIRECTORY_SEPARATOR.$file,NEWLINE;
}
}
elseif (is_file($dir.DIRECTORY_SEPARATOR.$file) && $file != '.svn')
{
$arrFileinfo = pathinfo($dir.DIRECTORY_SEPARATOR.$file);
if (isset($arrFileinfo['extension']) && $arrFileinfo['extension'] == 'php')
{
//判读是否为排除目录
if (in_array($dir.DIRECTORY_SEPARATOR.$file,$arrDropFile))
{
echo 'skip file: ', $dir.DIRECTORY_SEPARATOR.$file,NEWLINE;
continue;
}
// 检测文件是否为空(是否为已经导出过,防止导出成空文件的情况)
if (preg_match('/ md5 : \[([a-z0-9]{32})\]/',file_get_contents($dir.DIRECTORY_SEPARATOR.$file)))
{
exit($dir.DIRECTORY_SEPARATOR.$file.'. This file look like dumped,Please check it.'.NEWLINE);
}
//开始缓存文件
if (apc_compile_file($dir.DIRECTORY_SEPARATOR.$file))
{
$arrCacheFile[] = $dir.DIRECTORY_SEPARATOR.$file;
}
else
{
$arrCacheFileFailed[] = $dir.DIRECTORY_SEPARATOR.$file;
}
}
else
{
//非php拓展名的文件
}
}
else
{
// 非文件、非目录。。几乎不可能
}
}
}
closedir($handle);
}
else
{
exit('Can\'t to opendir '.$dir.NEWLINE);
}
}
function replaceFile ($strBinMd5)
{
global $arrCacheFile, $strDateTime;
$strTime = date('Y-m-d H:i:s');
$handle = fopen(APCBIN.DIRECTORY_SEPARATOR.MD5FILENAME.'_'.$strDateTime, 'w');
if (!$handle)
{
exit('Can\'t to create file: '.MD5FILENAME.'_'.$strDateTime.NEWLINE);
}
foreach ($arrCacheFile as $value)
{
$value1 = str_replace(PROJECTROOT,DUMPROOT,$value);
$dir = dirname($value1);
if (!is_dir($dir))
{
if(!mkdir($dir,0777,true))
{
echo $dir,' can\'t to create!'.NEWLINE;
exit();
}
}
$filemd5 = md5_file($value);
if (!file_put_contents($value1,"<?php\n/* \nThere is nothing,But do not be surprised,It's worked!\nCreated by JoyWay W1 Team (cfc4n@cnxct.com) at {$strTime}.\nThis file md5 : [".$filemd5."]\n".BINNAME." md5 : [{$strBinMd5}].\n*/\n?>"))
{
echo 'file can\'t write file '.$value1.NEWLINE;
exit();
}
fwrite($handle, $filemd5.' '.str_replace(PROJECTROOT, '*',$value)."\n");
}
fclose($handle);
return true;
}
function moveDropFile ($arrDropFile)
{
foreach ($arrDropFile as $key => $value)
{
if (is_file($value) && !copy($value,str_replace(PROJECTROOT,DUMPROOT,$value)))
{
echo 'file can\'t copy '.$value.NEWLINE;
}
}
return true;
}
function moveDropDir ($arrDropDir)
{
foreach ($arrDropDir as $dir)
{
if (is_dir($dir) && false !== ($handle = opendir($dir))) {
while (false !== ($file = readdir($handle))) {
if ($file != '.' && $file != '..')
{
if (is_dir($dir.DIRECTORY_SEPARATOR.$file) && $file != '.svn')
{
moveDropDir(array($dir.DIRECTORY_SEPARATOR.$file));
}
elseif (is_file($dir.DIRECTORY_SEPARATOR.$file) && $file != '.svn')
{
$newDir = str_replace(PROJECTROOT,DUMPROOT,$dir.DIRECTORY_SEPARATOR.$dir);
if (!is_dir($newDir))
{
if(!mkdir($newDir,0777,true))
{
echo $newDir,' can\'t to create!'.NEWLINE;
exit();
}
}
if (!copy($dir.DIRECTORY_SEPARATOR.$file,str_replace(PROJECTROOT,DUMPROOT,$dir.DIRECTORY_SEPARATOR.$file)))
{
echo 'file can\'t copy '.$value.NEWLINE;
}
}
}
}
closedir($handle);
}
else
{
echo 'Can\'t to opendir '.$dir,'. Maybe is not necessary.',NEWLINE;
}
}
return true;
}
?>