Andy's Blog » » [21Andy.com原创] CodeIgniter中文手册克隆工具

[21Andy.com原创] CodeIgniter中文手册克隆工具

[21Andy.com原创] CodeIgniter中文手册克隆工具

今天写了个小脚本, 用于克隆最新版CodeIgniter中文手册

原理是, 根据CodeIgniter英文手册的目录文件结构, 克隆CodeIgniter中文站的中文手册

改一下设置, 可以克隆Discuz模板什么的

当年我写了个Discuz克隆机, 克隆了Adsenser那破站, 克隆模板的时候就用的这个原理, 呵呵, 我做得太细, 完全一模一样, 以致于小龙以为是我黑了他服务器.

废话不说, 先看图
[21Andy.com原创] CodeIgniter中文手册克隆工具

源代码&下载

andy_clone.php
<?php
/*
 * 21Andy.com 出品
 * =====================================
 * 作者网站 :
http://www.21andy.com/
 * 作者邮箱 :
[email protected]
 * =====================================
 * 功能 : 根据本地目录结构, 克隆远程目录
 */

 
ob_implicit_flush();
set_time_limit(0);
 
header('Content-Type: text/html; charset=utf-8');
header('Expires: Wed, 11 Jan 1984 05:00:00 GMT');
header('Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ).' GMT');
header('Cache-Control: no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');
 
// 要克隆的本地目录
$local = dirname(__FILE__).'/user_guide';
// 把远程目录克隆到哪里
$new = dirname(__FILE__).'/user_guide_cn/';
// 要克隆的远程目录
$remote = 'http://codeigniter.org.cn/user_guide/';
 
// 开始
clone_local_from_remote($local, $new, $remote, $error);
 
echo '<hr />ALL OK!';
 
if (!empty($error)) {
    
echo '<h2>ERROR:</h2><xmp>';
    
print_r($error);
    
echo '</xmp>';
    
exit;
}
 
function open($url = '') {
    
if (!$url) return;
    
$header_send = array(
        
"User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
        
"Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
        
"Accept-Language: en-US,en;q=0.7,chrome://global/locale/intl.properties;q=0.3",
        
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
        
"Keep-Alive: 300",
        
"Connection: keep-alive",
        
"Cache-Control: max-age=0"
    
);
    
$url_info = parse_url($url);
    
$referer = !empty($referer) ? $referer : $url_info['scheme'] . '://' . $url_info['host'] . $url_info['path'];
    
$ch = curl_init();
    
curl_setopt($ch, CURLOPT_URL, $url);
    
curl_setopt($ch, CURLOPT_HTTPHEADER, $header_send);
    
curl_setopt($ch, CURLOPT_REFERER, $referer);
    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    
$result = curl_exec($ch);
    
if (curl_errno($ch) == 23 || curl_errno($ch) == 61) {
        
curl_setopt($ch, CURLOPT_ENCODING, 'none');
        
$result = curl_exec($ch);
    
}
    
if (curl_errno($ch)) {
        
$error = 'cURL error ' . curl_errno($ch) . ': ' . curl_error($ch);
        
return;
    
}
    
else {
        
curl_close($ch);
        
return $result;
    
}
}
 
function mkdirs($pathname, $mode = 0755) {
    
is_dir(dirname($pathname)) || mkdirs(dirname($pathname), $mode);
    
return is_dir($pathname) || @mkdir($pathname, $mode);
}
 
function clone_local_from_remote($local_dir = '', $clone_dir = '', $remote_dir = '', &$error, $deep = 0) {
    
if (!$local_dir) exit('please set local_dir');
    
if (!$clone_dir) exit('please set clone_dir');
    
if (!$remote_dir) exit('please set remote_dir');
    
$local_dir = rtrim(str_replace('\\', '/', $local_dir), '/') . '/';
    
$clone_dir = rtrim(str_replace('\\', '/', $clone_dir), '/') . '/';
    
$remote_dir = rtrim(str_replace('\\', '/', $remote_dir), '/') . '/';
    
if (!is_dir($local_dir)) exit("$local_dir is not a dir!");
    
if (!is_dir($clone_dir)) mkdirs($clone_dir);
    
$dirs = array_diff(scandir($local_dir), array('.', '..'));
    
if (empty($dirs)) return;
    
foreach ($dirs as $d){
        
if (is_dir($local_dir.$d)) {
            
$new_deep = $deep + 1;
            
clone_local_from_remote($local_dir.$d, $clone_dir.$d, $remote_dir.$d, &$error, $new_deep);
        
}
        
else {
            
$url = $remote_dir.$d;
            
$data = open($url);
            
$retry = 0;
            
while (!$data) {
                
if ($retry >= 3)
                    
break;
                
$data = open($url);
                
$retry++;
            
}
            
if ($data) {
                
$ext4 = strtolower(substr($d, -4));
                
if ('.css' == $ext4) {
                    
$data = str_replace('../images/user_guide/', 'images/', $data);
                
}
                
elseif (!in_array($ext4, array('.jpg', '.gif', '.css'))) {
                    
$data = replace_data($data, $deep);
                
}
                
file_put_contents($clone_dir.$d, $data);
                
echo "$url<br />";
            
}
            
else {
                
echo "<font color=red>$url</font><br />";
                
$error = (array)$error;
                
$error[] = $url;
            
}
        
}
    
}
}
 
function replace_data($data = '', $deep = 0) {
    
if ($deep == 0) $dir = './';
    
elseif ($deep == 1) $dir = './../';
    
elseif ($deep == 2) $dir = './../../';
    
elseif ($deep == 3) $dir = './../../../';
    
$data = str_replace('http://codeigniter.org.cn/user_guide/', $dir, $data);
    
$data = preg_replace('~</div>\s*<script[^>]*>[^<]*google\-analytics\.com.*</body>~isU', "</div>\n\n</body>", $data);
    
return $data;
}

使用方法

1. 下载andy_clone.php, 把它放到你的CodeIgniter根目录, 确保
2. 打开浏览器, 运行http://localhost/你的CodeIgniter目录/andy_clone.php

Incoming search terms:

Tags: CodeIgniter, 手册, 采集, 克隆

本文地址: http://www.21andy.com/new/20090512/1274.html

5 评论 to “PHP开源CMS之MODx”

  1. Andy 于 2009-05-13 02:06:49 发表:

    好东西,谢谢分享,什么时候能介绍几个国外优秀的空间?

    21andy 于 2009-05-13 02:57:23 回复:

    没空哦~

  2. 裸舞ing 于 2009-05-13 02:54:05 发表:

    老而弥辣

  3. 铁牛仔 于 2011-05-20 14:55:16 发表:

    还有一种办法 wget -rp http://codeigniter.org.cn/user_guide/ /temp/ci_user_guide/

  4. [email protected] 于 2011-07-30 21:15:00 发表:

    请问这是干啥用的啊