PHPDocumentor安装与使用

PHPDocumentor 是一个用PHP写的工具, 对于有规范注释的php程序, 它能够快速生成具有相互参照,索引等功能的API文档.

安装环境:
本机安装的是 EasyPHP-5.3.2i 套件,

安装目录是 D:\Program Files\EasyPHP-5.3.2i\
php.exe 所在路径是 D:\Program Files\EasyPHP-5.3.2i\php\php.exe

首先安装 PEAR:
1, 修改 D:\Program Files\EasyPHP-5.3.2i\php\go-pear.bat 内容如下:

@ECHO OFF
set PHP_BIN=%CD%\php.exe
"%PHP_BIN%" -d output_buffering=0 -d phar.require_hash=0 PEAR\go-pear.phar
pause

2, 开始->运行->cmd, 执行 go-pear.bat 开始安装 Pear, 一路回车

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\kuco>D:

D:\>cd D:\Program Files\EasyPHP-5.3.2i\php

D:\Program Files\EasyPHP-5.3.2i\php>go-pear.bat

3, 修改 php.ini 中的 include_path

include_path = ".;${path}\php\includes;${path}\php\PEAR"

4, EasyPHP 套件中的 php.ini 没有存放在 php.exe 所以目录中,所以要复制一份.

复制 D:\Program Files\EasyPHP-5.3.2i\apache\php.ini
  到 D:\Program Files\EasyPHP-5.3.2i\php\ 目录下

开始安装 PhpDocumentor:
5, 安装 PhpDocumentor 依赖包 XML_Parser

D:\Program Files\EasyPHP-5.3.2i\php>pear install XML_Parser
downloading XML_Parser-1.3.4.tgz ...
Starting to download XML_Parser-1.3.4.tgz (16,040 bytes)
......done: 16,040 bytes
install ok: channel://pear.php.net/XML_Parser-1.3.4

6, 安装 PhpDocumentor

D:\Program Files\EasyPHP-5.3.2i\php>pear install PhpDocumentor
Did not download optional dependencies: pear/XML_Beautifier, use --alldeps to do
wnload automatically
pear/PhpDocumentor can optionally use package "pear/XML_Beautifier" (version >=
1.1)
downloading PhpDocumentor-1.4.3.tgz ...
Starting to download PhpDocumentor-1.4.3.tgz (2,423,486 bytes)
......done: 2,423,486 bytes
install ok: channel://pear.php.net/PhpDocumentor-1.4.3

使用 PhpDocumentor 生成注释文档
7, 假设我们要给 Smarty 的源码包生成一个注释文档

Smarty 源码存放目录为: E:\www\IDE\Smarty\libs\
注释文档存放的目录为: E:\www\IDE\doc
开始在命令行执行命令:
D:\Program Files\EasyPHP-5.3.2i\php>phpdoc.bat -o HTML:Smarty:PHP -d E:\www\IDE\Smarty\libs\ -t E:\www\IDE\doc

可以通过下面的命令得到更多的帮助说明

D:\Program Files\EasyPHP-5.3.2i\php>phpdoc -h
Posted in PHP, Tool, pear | Tagged , | Leave a comment

Windows 下安装 SVN-Server

1, 下载 svn 服务器端程序


http://ncu.dl.sourceforge.net/project/win32svn/1.6.16/svn-win32-1.6.16.zip

2, 解压, 将 svn-win32-1.6.16 目录复制到 D:\Program Files\svn-win32-1.6.16

3, 复制文件

//复制下面两个文件
D:\Program Files\svn-win32-1.6.16\bin\mod_authz_svn.so
D:\Program Files\svn-win32-1.6.16\bin\mod_dav_svn.so

//粘贴到 Apache 扩展目录中去
D:\Program Files\EasyPHP-5.3.2i\apache\modules

4, 将 D:\Program Files\svn-win32-1.6.16\bin 添加到系统环境变量 Path 中去

5, 编辑 Apache 配置文件 httpd.conf

//查找下面两行,去掉前面的#号
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so

//再在后面添加两行
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

6, 重启电脑

7, 建立 SVN-Server 目录 E:\svn_server

8, 建立 SVN 库, 开始->运行->cmd

svnadmin create E:\svn_server\profile

9, 再次修改 Apache 配置文件 httpd.conf

<Location /svn>
DAV svn
SVNParentPath E:\svn_server
</Location>

10, 重启 Apache , 用浏览器打开 http://localhost/svn/profile 看是否能正常打开.

11, 用 svn 客户端进行 checkout , 完成!

Posted in Apache | Tagged , | Leave a comment

PHP错误信息显示不完全

昨天在调试程序的时候发现 PHP 错误信息显示有点怪怪的, 但又说不出是哪个地方怪. 于是写了两行错误的代码测试一下:

<?php
phpinfo() //这行末故意少写了个括号
exit;     //知道为什么要加上这一句话吗? 请看P.S.
?>

一运行, 报错:

Parse error: s in E:\www\test\004.php on line 3

正确的报错应该是:

Parse error: syntax error, unexpected T_EXIT in E:\www\test\004.php on line 3

怎么错误信息显示不全呢? 奇怪了. 上网搜索也未果. 于是打开 php.ini 一项一项的修改测试终于发现了元凶:

; Set maximum length of log_errors. In error_log information about the source is
; added. The default is 1024 and 0 allows to not apply any maximum length at all.
; http://php.net/log-errors-max-len
log_errors_max_len = 1024

我一不小心把这个参数设成了 1, 可能是什么时候修改 php.ini 的时候不小心动到了这个参数. 下次不会再犯同样的错误了.

P.S.
知道为什么下面的代码是可以正常运行的吗?

<?php
phpinfo()
?>

因为在 ?> 标签里隐含有语句结束的意思. 可以把 ?> 理解成为一个 ; 分号
所以在纯 php 代码文件里面最后的 ?> 是可以省去的. 但省去后最后一条语句一定要带分号, 否则是会报错滴.

Posted in PHP | Tagged | Leave a comment

超链接中的 javascript:void(0);

写在前面: 因为有了 IE6 所以有了下面的文字. 如果你对 IE6 不 Care , 你可以开始浏览其它文章去了. 下文中部分内容参考自这里
如果我们想要在超链接中执行一段 javascript 程序, 我们通常会在脑子中闪现出下面的代码

<a href="javascript:void(0);" onclick="myFunction();">链接</a>

上面的代码在绝大多数浏览器上都可以正常发挥它的作用. 可是在 IE6 上在某些特定的情况下会出现一些奇怪的问题.

1, 在 IE6 下当 myFunction() 的作用是用来做页面刷新操作时, 它会没有效果.
   (页面刷新操作是指类似如 window.location="***" , 提交表单 等等操作.)
2, 在 IE6 下当页面上包含有动态 gif 图片时, 上面的代码会导致动态图片停止播放.

看看在线示例

如果你有在超链接中执行 js 并且要执行的 js 中有涉及到页面跳转或者是页面上有动态图片时, 要尽量避免使用上面的代码形式, 可以用下面的几种方法来解决这个问题:

<script type="text/javascript">
function goUrl(x){
    window.location = x;
}
</script>

<a href="javascript:;" onclick="javascript:goUrl('http://www.baidu.com');">跳转1</a>
<a href="javascript:void(0);" onclick="javascript:goUrl('http://www.baidu.com');">跳转2</a>
<a href="javascript:void(0);" onclick="javascript:goUrl('http://www.baidu.com'); return false;">跳转3</a>
<a href="#" onclick="javascript:goUrl('http://www.baidu.com');">跳转4</a>
<a href="###" onclick="javascript:goUrl('http://www.baidu.com');">跳转5</a>

跳转1和2在IE6环境下无效
跳转3, 跳转4, 跳转5 在常用浏览器上都能通过.
跳转4 与 跳转5 的区别在于, 使用 # 号时点击链接会跳到整个页面的最顶端. 而使用 ### 时则可以避免这个问题的发生.

Posted in JavaScritp, html | Tagged , , | 2 Comments

jQuery中setTimeout的几种使用方法

jQuery 中 setTimeout/setInterval 不能像在原生态 javascript 中那样使用, 否则会报错.
我们通过例子来说明一下jQuery中setTimeout的几种使用方法, 首先准备好测试用的DIV和公共函数:

<div id="div_debug"></div>
<script src="http://www.studyday.net/demo/jquery.js"></script>
<script language="JavaScript">
function log(s){
    $('#div_debug').append(s+'<br>');
}

//下文中测试用的代码可以放在这一行注释的下面,替换掉 //...
//...

</script>

原生态 javascript 中的 setTimeout 基本用法是像这样子的.

//原生态 javascript 中的 setTimeout 基本用法
function funA(){
    log('funA...');
    setTimeout('funA()', 1000);
}
funA();

下面是jQuery中setTimeout的几种使用方法. 在线实例

//jQuery 中的用法
function funA(){
    log('funA...');
    setTimeout('funA()', 1000);
}

jQuery(document).ready(function($){
    //用法1 : 把要调用的函数写在ready外面,使它成为全局函数
    funA();

    //用法2 : 直接写函数名,不能带括号也不能带引号,适合没有参数的函数
    function funB(){
        log('funB...');
        setTimeout(funB, 1000);
    }
    funB();

    //用法3 : 通过调用匿名函数来执行,适合有带参数的函数
    function funC(v){
        log('funC...'+v);
        setTimeout(function(){funC(v+1)}, 1000);
    }
    funC(1);

    //用法4 : 通过在jQuery命名空间上增加函数,适用面更广
    $.extend({
        funD:function(v){
            log('funD...'+v);
            setTimeout("$.funD("+(v+1)+")",1000);
        }
    });
    $.funD(100);
});

用法2和用法3的区别很明显, 但用法3和用法4的区别在哪里呢?为什么说用法4比用法3适用面更广呢?通过下面这个例子可以很直观的明白二者的区别:

jQuery(document).ready(function($){
    //用法3 : 通过调用匿名函数来执行,适合有带参数的函数
    function funC(v){
        log('funC...'+v);
        setTimeout(function(){funC(v+1)}, 1000);
    }

    //用法4 : 通过在jQuery命名空间上增加函数,调用起来更方便
    $.extend({
        funD:function(v){
            log('funD...'+v);
            setTimeout("$.funD("+(v+1)+")",1000);
        }
    });
});

jQuery(document).ready(function($){
    //funC(1);   //去掉注释后执行这一句时会报错
    $.funD(100); //这一句是正常的, 明白两者之间的区别了吧
});

另外 setInterval 也同样适合上面所说的4种方法.

Posted in JavaScritp, html, jquery | Tagged , , | 2 Comments

快速恢复桌面图标位置

一个用习惯的桌面图标布局对于提高工作效率是非常有帮助的, 我们可以快速的将鼠标定位到我们脑子里想的那个图标上左键点击打开它. 但是由于一些误操作(比如一不小心改变了屏幕分辨率 -- 这对于使用 THINKPAD 的新手来说一定是深有感触, 左下角的 Fn 功能键+空格简直就是一个噩梦.)或者是系统的本身的一些原因(比如有时Win+L锁定屏幕然后再登录进系统后)会导致桌面图片恢复成从上至下再从左至右的默认排列. 每次恢复成默认的排列方式之后又得重新手动排列成自己习惯的布局, 这真是个非常无聊的过程.

无聊的事情应该交给软件去做:
DesktopOK 这个小软件可以完全帮助我们搞定这一切. DesktopOK 不仅小巧而且还是绿色版, 解压出来只有一个文件, 别看 DesktopOK 个头不大, 它可是内置有多种语言哦, 简体中文相信对很多国内用户有很大的吸引力.

DesktopOK 官方主页         http://www.softwareok.com/?seite=Freeware/DesktopOK
DesktopOK 最新版官方下载地址 http://www.softwareok.com/Download/DesktopOK.zip

DesktopOK 2.33 下载

我正在使用的是 DesktopOK 2.33 使用过程中还会遇到点小问题: 还原桌面图标布局后如果一刷新桌面图标又立马会变成系统默认排列, 解决这个问题也很简单, 就是在还原桌面图标布局后随便将一个图标拖动到一个新的位置然后再把它拖回来, 这样就OK啦, 再刷新桌面图标的位置也不会再变成默认的啦.

再也不用为桌面图标被打乱而烦恼啦~

Posted in Tool | Tagged , | Leave a comment

腾讯截取字符串面试题

传说中的腾讯面试题, 写着好玩, 更多解法看这里

<?php
/*
题目是:
假设有"123<em>abc</em>456<em>def</em>789"这么一个字符串,写一个函数,可以传入一个字符串,和一个要截取的长度。返回截取后的结果。

要求:
1 <em>和</em>标记不得计算在长度之内。
2 截取后的字符串,要保留原有<em>标签,不过如果最后有一个标签没有闭合,则去掉其开始标签。

示例:
题中的字符串,要截取长度5,则返回的字符串应该为:123ab,要截取长度8,应返回123<em>abc</em>45。
*/

function tencent_substr($str, $len) {
    $splitArr = preg_split("~(<[/]*em>)~is", $str, -1, PREG_SPLIT_DELIM_CAPTURE);
    $resultLen = 0;
    for($i=0, $n=count($splitArr); $i<$n; $i++) {
        if($resultLen >= $len) {
            unset($splitArr[$i]);
            continue;
        }
        $str = $splitArr[$i];
        if($str!="<em>" && $str!="</em>") {
            $resultLen += strlen($str);
            if($resultLen <= $len) {
                continue;
            }
            $splitArr[$i] = substr($str, 0, -($resultLen-$len));
        }
    }
    $lastTagIdx = count($splitArr)-2;
    if($splitArr[$lastTagIdx]=="<em>") {
        unset($splitArr[$lastTagIdx]);
    }
    return implode("", $splitArr);
}

$dataStr = "123<em>abc</em>456<em>def</em>789";
$resultStr = tencent_substr($dataStr, 5);
echo htmlspecialchars($resultStr);
echo "<br>";

$resultStr = tencent_substr($dataStr, 8);
echo htmlspecialchars($resultStr);
echo "<br>";

exit;
?>
Posted in PHP | Tagged | Leave a comment

PHP的Session存储优化与存取过程

Session 在 Server 端默认是以文本文件形式保存的保存位置是:

# Linux
/tmp/sess_*
# Windows
C:\Windows\temp\sess_*
# 或
C:\Documents and Settings\kuco\Local Settings\Temp\sess_*

对于高并发同时在线用户大的网站来说会在同一目录下产生大量的 Session 文件(sess_*), 在同一个目录下文件数过多会导致IO性能下降, 影响 Server 性能. 这时我们可以通过配置 php.ini 中的 session.save_path 项来将 Session 文件分目录保存.

# http://php.net/session.save-path
# 其中
#   N 是指将 Session 文件要存放的目录深度(N级目录)
#     例如: 设置 '5;/tmp' Session 文件保存的目录将会看起来像
#           /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If
#     注意: 如果存放目录不存在 php 不会自动生成,
#           所以要提前手动建好目录:
#           下载 php 包 php-5.3.3.tar.bz2 解压
#             linux : ext/session/mod_files.sh
#           windows : ext/session/mod_files.bat
#
#   MODE 是指目录的权限默认为600
#
#   path 是指 Session 文件存放目录
session.save_path = "N;MODE;/path"

Session 存储/读取数据

<?php
// 检测浏览器是否有带给 server 一个名为 PHPSESSID 的 Cookie
// 如果没有:
//   生成一个唯一的 session_id
//   同时向浏览器发送一个
//   header('Set-Cookie: PHPSESSID=c16ao1i02pjtg4dj04qv8667g3; path=/');
//   这样将 server 端生成的 session_id 保存在浏览器的 Cookie 中
session_start();

// 看看生成的 session_id 是啥
echo session_id();

// 保存一个名为 kuco_session 的 session
// 值为当前时间
$_SESSION['kuco_session'] = date("Y-m-d H:i:s");
?>

上面的代码会在浏览器上生成一个名为 PHPSESSID 的 cookie , 它的值就是服务器端 Session 的 id , 每个人每个浏览器都会有一个唯一的 session_id .服务器端会在 Session 保存目录里面生成一个文件名为以 "sess_" 开头以 session_id 结尾的 session 文件, session 文件的内容将会类似下面这样子

kuco_session|s:19:"2010-10-01 22:33:36";

session 文件内容格式是

Session名|value类型:value长度:"value值";Session名|value类型:value长度:"value值";...

同一域下的 php 程序通过浏览器请求时带来的 PHPSESSID 来在 server 端寻找 session 文件, 这样就可以实现不同页面间的数据共享. 与 POST/GET/Cookie 相比优势在于操作灵活, 数据操作更加安全(因为 session_id 很难伪造)
Session 的使用不一定必须要浏览器支持 Cookie , 因为我们也可以通过网页 URL 将 PHPSESSID 传递到 Sever 端, 当然这也将会大大增加我们编码的工作量.

Posted in PHP | Tagged , | 1 Comment

常用Apache设置

● Listen
服务器监听IP地址和端口。

Listen参数是指Apache服务器在指定的IP地址和端口上进行监听;默认情况下Apache会在所有IP地址上监听。Listen是一个必须设置的指令。如果在配置文件中找不到这个指令,服务器将无法启动。

Listen参数还可以指定服务器在哪个端口或地址和端口的组合上进行监听请求。如果只指定一个端口,服务器将在所有地址上监听该端口。如果指定了地址和端口的组合,服务器将按照指定地址和指定的端口进行监听。

使用多个Listen参数可以指定多个不同的监听端口和/或地址端口组合。
例如,想要服务器接受80和8080端口上的请求,可以这样设置:

Listen 80
Listen 8080

为了让服务器在两个确定的地址端口组合上接受请求,可以这样设置:

Listen 192.64.182.1:80
Listen 192.64.182.5:8080

注意:多个Listen指令指定了同一个地址和端口的组合后,会导致"Address already in use"错误。

● ServerRoot
服务器的安装基础目录。

该参数设置了服务器所在的目录。一般来说它将包含conf/和logs/子目录。其它配置文件的相对路径都基于此目录 (比如Include或LoadModule)。

例如:
ServerRoot /etc/httpd

● DocumentRoot
组成网络上可见的主文档树的根目录。

此参数设置了httpd服务的目录。在没有配置类似Alias这种参数的情况下,服务器会将请求中的URL附加到DocumentRoot后面以构成指向文档的路径。

比如说:
DocumentRoot /etc/httpd/www/web

于是对http://www.ccb.com.cn/index.html的访问就会指向/etc/httpd/www/web/index.html。如果参数中不是绝对路径,则被假定为是相对于ServerRoot的路径。
注意:指定DocumentRoot时不应包括最后的"/"。

● Directory
可以封装一组参数,使之仅对文件空间中的某个目录及其子目录生效

<Directory directory-path> ... </Directory>
<Directory>和</Directory>用于封装一组参数,使其对某个目录及其子目录生效。directory-path可以是一个目录的完整路径,或是包含了Unix shell匹配语法的通配符字符串,但是通配符都不能匹配"/"字符,例如:<Directory /*/public_html>是无法匹配/home/user/public_html 的,而<Directory /home/*/public_html>却能够正确匹配。

directory-path参数必须与被访问文件所在文件系统的路径保持一致。如果有多个非正则表达式,<Directory>配置段符合并包含某文档的目录(或其父目录),那么会以短目录优先的规则进行应用。<Directory />的默认访问权限为"Allow from All",这意味着Apache没有进行访问控制,通过设置Order,Deny,Allow,AllowOverride这个几个参数可以对访问进行控制。

下面简单介绍一下这4个参数的用法。
Allow
该参数是控制哪些主机才可以访问目标。

示例:
Allow from 192.64.182.53
Allow from 192.64.182.1 192.64.182.3
表示IP地址为192.64.182.1或192.64.182.3或192.64.182.53才可以访问目标。

Deny
该参数是控制哪些主机被禁止访问目标。

示例:
Deny from 192.64.182.53
Deny from 192.64.182.1 192.64.182.3
表示IP地址为192.64.182.1或192.64.182.3或192.64.182.53则不能访问目标。

Order
Order参数是控制Allow和Deny参数生效顺序的,常用的取值是:Deny,Allow 和Allow,Deny。

示例:
Order Deny,Allow
Deny from 192.64.182.53
Allow from 192.64.182.1 192.64.182.3
表示先考虑Deny条件再考虑Allow条件,该配置的意思是拒绝IP地址为192.64.182.53的访问,只允许192.64.182.1 和192.64.182.3的访问。
再看一个例子:
Order Allow,Deny
Allow from all
Deny from 192.64.182.53
表示只拒绝IP地址为192.64.182.53的访问。

AllowOverride
当服务器发现一个.htaccess文件(由AccessFileName指定)时,它需要知道在这个文件中声明的哪些指令能覆盖在此之前指定的配置参数。一般情况下NONE即可。

最后给出一个完整封装目录的配置段:
<Directory "/home/hrdc/images">
Options Indexes FollowSymLinks       //对URL映射到的系统目录产生文件列表
AllowOverride None
Order Deny,Allow
Allow from all
</Directory>

上面的配置对系统中的"/home/hrdc/images"目录进行了封装,而且对访问不加任何限制。这段配置后面在讲如何将静态文件放置到Apache上还会用到。

● ServerAdmin
服务器返回给客户端的错误信息中所包含的管理员邮件地址。

该参数是在所有返回给客户端的错误信息中给出管理员的邮件地址。但也可以是一个URL地址,如果httpd不能将该参数的值识别为URL,它就会假定它是一个email-address ,并在超连接中用在mailto后面。这里推荐配置一个Email地址,如果配置的是URL一定要保证指向一个受控制的服务器,否则用户将无法确保和管理员取得联系。

示例:
ServerAdmin hradmin.zh@ccb.cn

● ErrorLog
存放错误日志的位置

该参数指定了当服务器遇到错误时记录日志的文件名。如果该值不是一个以斜杠(/)开头的绝对路径,那么将被认为是一个相对于ServerRoot的相对路径。

示例
ErrorLog /etc/var/log/httpd/error_log

如果配置了一个以管道符号(|)开头的值,那么会为它指定一个命令来处理错误日志。

示例
ErrorLog "|/usr/local/bin/httpd_errors"

注意:当在非Unix平台上输入文件路径的时候,路径分隔符必须统一使用正斜线(/)。

● Alias
将URL映射到文件系统的特定区域。

语法:Alias URL-path file-path|directory-path
Alias参数使文件可以被存储在DocumentRoot以外的本地文件系统中。以(%已解码的)url-path路径开头的URL可以被映射到以directory-path开头的本地文件中。

示例:
Alias /image /etc/var/www/images
对"http://www.ccb.com/image/foo.gif"的请求,服务器将返回"/etc/var/www/images/foo.gif"文件。由于该参数是匹配完整路径,所以请求是"http:// www.ccb.com/image/foo.gif"

注意:如果url-path中有后缀"/",则服务器要求有后缀"/"以扩展此别名。也就是说"Alias /icons/ /usr/local/apache/icons/"并不能对"/icons"实现别名.

注意,可能需要额外指定一个<Directory>段来覆盖别名的最终对象。由于只有出现在<Directory>段之前的别名才会被检测,所以它只对最终对象生效。如果对在DocumentRoot之外的某个目录建立了一个Alias ,则可能需要明确的对目标目录设定访问权限。

示例:
Alias /image /ftp/pub/image
<Directory /ftp/pub/image>
Order allow,deny
Allow from all
</Directory>

● VirtualHost
虚拟主机。

在这个参数内可以模仿一个Web服务配置众多参数,即在<VirtualHost>和</VirtualHost>中配置一组仅作用于特定虚拟主机的参数。

示例
<VirtualHost 192.64.182.53:8020>
ServerAdmin   hrdc.zh@ccb.cn
DocumentRoot  /home/hrdc
ServerName    hrdc.ccb.cn
ErrorLog logs/host.foo.com-error_log
TransferLog logs/host.foo.com-access_log
</VirtualHost>

注意:每个虚拟主机必须对应不同的IP地址、端口或是不同的主机名。
<VirtualHost>中定义的监听地址只代表虚拟主机并不是指定Apache服务的监听地址。指定Apache监听地址的参数则是Listen。

Posted in Apache | Tagged , | Leave a comment

JS 文件压缩与反压缩

压缩 js 代码不但可以大大减小 js 文件大小, 还能给用户设置一定的技术门槛使其不能直观的阅读 js 源代码. 下面推荐一个在线压缩 js 工具 Dean Edward's packer:
http://dean.edwards.name/packer/

它还同时提供了利用 php 来压缩 js 的程序:
http://joliclic.free.fr/php/javascript-packer/en/
配合前面介绍的《巧用用户工具强化你的 Editplus》利用 php 命令很容易的给 Editplus 加上 javascript 压缩功能.

当然世界上有盾必有矛, 有压缩当然也会有反压缩, 下面就是一款专门针对 Dean Edward's packer 的反压缩工具:
http://jsbeautifier.org/

Posted in JavaScritp, PHP, Tool | Tagged , | Leave a comment