Docker 安装及应用

云主机可以选择操作系统镜像快速创建主机,这比虚拟机更便捷了,我们本地也可以这么做了,因为有了 Docker 这个东西。它依赖于 LXC(Linux Container),能从网络上获得配置好的 Linux 镜像,非常容易在隔离的系统中运行自己的应用。也因为它的底层核心是个 LXC,所以在 Mac OS X 下需要在 VirtualBox 中跑一个精小的 LXC(这里是一个 Tiny Core Linux,完全在内存中运行,个头只约 24MB,启动时间小于 5 秒的 boot2docker) 虚拟机,构建在 VirtualBox 中。以后的通信过程就是 docker --> boot2docker --> container,端口或磁盘映射也是遵照这一关系。

理解了上面的关系,开始说说 Docker 安装过程

1. 安装 VirtualBox, 不多讲, 因要在它当中创建一个 boot2docker-vm 虚拟机
2. 安装 boot2docker

brew install boot2docker
你也可以手工安装
curl https://raw.github.com/steeve/boot2docker/master/boot2docker > boot2docker; chmod +x boot2docker; sudo mv boot2docker /usr/local/bin

3. 安装 Docker

brew install docker
也可手工安装
curl -o docker http://get.docker.io/builds/Darwin/x86_64/docker-latest; chmod +x docker; sudo cp docker /usr/local/bin

4. 配置 Docker 客户端

export DOCKER_HOST=tcp://127.0.0.1:4243
把它写到 ~/.bash_profile 中,如果你是用的 bash 的话。我工作在 fish 下,所以在 ~/.config/fish/config.fish 中加了 set -x DOCKER_HOST tcp://127.0.0.1:4243

5. boot2docker 初始化与启动

boot2docker init
完成后就能在 VirtualBox 中看到一个叫做 boot2docker-vm的虚拟机,以后只需用 boot2docker 命令来控制这个虚拟机的行为,启动,停止等。
boot2docker up
启动,boot2docker-vm虚拟机,我们能在 VirtualBox 中看到该虚拟机变成 Running 状态
直接执行 boot2docker 可以看到可用的参数
Usage /usr/local/bin/boot2docker  {init|start|up|save|pause|stop|restart|status|info|delete|ssh|download}

6. 启动 Docker 守护进程

sudo docker -d
这时可执行
boot2docker ssh,输入密码  tcuser 进到该虚拟机的控制台下,如果要用户名的话请输入docker

test.jpg

上面看到 Mac 启动了 4243 端口,在 boot2docker 虚拟机中也有 4243 端口,并在 /var/run/docker.sock 上监听。借此回顾下 docker 的通信过程,dock 命令是与 Docker daemon 在 Mac 上开启的 4243 端口通信,该端口映射到 boot2docker 的 4243 端口上,进而通过 /var/run/docker.sock 与其中的容器进行通信。
所以在执行 docker version 时如果没有启动 Docker daemon 会提示
2014/05/16 06:52:48 Cannot connect to the Docker daemon. Is 'docker -d' running on this host?
如果没有启动 boot2docker 会得到提示
Get http:///var/run/docker.sock/v1.11/version: dial unix /var/run/docker.sock: no such file or directory
Mac OS X -- boot2docker -- container 三者之间的关系,这张图很好的说明了
docker-install-800x417.png

上面 boot2docker, docker 都准备就绪了, 现在开始进入 dock 的操作了,有关于 docker 的命令可以参看这里 http://blog.tankywoo.com/docker/2014/05/08/docker-4-summary.html。


1. 下载镜像,并加载启动容器

docker images    #现在没有一个镜像
docker pull ubuntu     #我们把这个拉下来试验,可用 docker search ubuntu 找到所有与 ubuntu 有关的镜像
docker run -i -t  ubuntu  #加载镜像 learn/tutorial 并进到 shell 下,这样就直接连接到该容器中,退出后容器也退了
docker ps     #在另一个终端中用这个命令,可以看到运行实例,即容器
现在我们在容器的控制台上 oot@95903c1a2bf7:/#,可以安装一个 apche2, curl 并启动 apache2,来测试下
root@d0889476e21e:/# apt-get update
root@d0889476e21e:/# apt-get install apache2 curl
root@d0889476e21e:/# apachectl start
root@d0889476e21e:/# curl http://localhost
<html><body><h1>It works!</h1>

Apache2 正常启动了,在容器内可访问。但现在还无法从 Mac OS X 上对该 apache 服务进行访问,这需要端口映射,有两种方式。不过在端口映射之前还需保存下镜像的修改。

2. 保存镜像

如果前面用 docker run -i -t learn/tutorial 运行的镜像
在运行该镜像的容器中安装了软件,需要把新的内容保存到该镜像中去,否则下次启动该镜像又恢复成原样
uqiu@localhost ~> docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
d0889476e21e        ubuntu        "/bin/bash"         About an hour ago   Up About an hour    0.0.0.0:8082->80/tcp   high_meitner
看到容器的 ID,然后执行
docker commit d0889476e21e ubuntu  #把当前容器的修改提交到镜像 ubuntu  中去
以后再次运行该镜像就有了最新安装的内容了。

3. 端口映射
比如我们现在要做的映射关系是 Mac OS X(9082) --> boot2docker(8082) --> container(80)

可以有两种办法

boot2docker ssh -L 9082:localhost:8082 #这条命令可以在 boot2docker-vm 运行时执行,建立多个不同的映射就是执行多次
docker run -i -t -p 8082:80 ubuntu
root@d0889476e21e:/# apachectl start
然后在 Mac 的浏览器中打开 http://localhost:9082

VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port_9082:80,tcp,,9082,,8082"
docker run -i -t -p 8082:80 ubuntu
root@c79b5070a972:/# apachectl start
这是直接修改了 boot2docker-vm 的配置,可以在 VirtualBox 中看到这条配置,配置 nat 命令见 http://www.virtualbox.org/manual/ch06.html#natforward. 也能建立许多的端口映射
boot2docker-vm-port-800x215.png

4. Docker 容器镜像删除

1.停止所有的container,这样才能够删除其中的images:
docker stop $(docker ps -a -q)

如果想要删除所有container的话再加一个指令:
docker rm $(docker ps -a -q)

2.查看当前有些什么images
docker images

3.删除images,通过image的id来指定删除谁
docker rmi <image id>

想要删除untagged images,也就是那些id为<None>的image的话可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

要删除全部image的话
docker rmi $(docker images -q)

Docker 的世界很精彩,其他内容基本就是怎么用好 Docker 命令,如管理镜像,容器,创建自己的镜像; Docker 有三种运行命令的方式,短暂方式,交互方式,daemon方式; 使用 ssh 来管理容器等等。
在 Mac 下使用 Docker 除了可用 boot2docker 作为 LXC,还有个替代品 VAGRANT 。
参考:
1. 利用Docker构建开发环境
2. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境
3. Installing Docker on Mac OS X
4. https://github.com/boot2docker/boot2docker
5. Docker 快速入门

php 多线程扩展 pthreads 安装 及 使用

1、扩展的编译安装php(Linux),编辑参数 --enable-maintainer-zts 是必选项:
2、下载 php7:
http://tw2.php.net/get/php-7.1.2.tar.gz/from/a/mirrorduoxc

3、解压并编译php
tar -zxf php-7.1.2.tar.gz
cd php-7.1.2
./configure --prefix=/usr/local/php712 --with-config-file-path=/usr/local/php712/etc --with-config-file-scan-dir=/usr/local/php712/etc/php.d --with-mcrypt=/usr/include --enable-mysqlnd --with-mysqli --with-pdo-mysql --enable-fpm --with-gd --with-iconv --with-zlib --enable-xml --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex --enable-mbstring --enable-ftp --enable-gd-native-ttf --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --enable-session --with-curl --with-jpeg-dir --enable-sqlite-utf8 --enable-sysvmsg --enable-sysvshm --enable-wddx --with-xsl --enable-opcache --enable-maintainer-zts

sudo make -j8 && sudo make install

4、php编译完之后开始编译安装 pthreads扩展
5、下载pthreads扩展
https://github.com/krakjoe/pthreads
6、解压并安装
tar -zxf pthreads-3.1.6.tgz
cd pthreads-3.1.6
./configure --with-php-config=/usr/local/php712/bin/php-config
sudo make -j8 && sudo make install

7、配置php.ini
sudo vim /usr/local/php712/etc/php.ini
在 php.ini 最后添加:
[pthreads]
extension=pthreads.so

8、测试pthreads扩展
Thread.php :

<?php
Class Thread {

    public $hooks = array();
    public $args = array();

    public function thread() {

    }

    public function addthread($func) {
        $args = array_slice(func_get_args(), 1);
        $this->hooks[] = $func;
        $this->args[] = $args;
        return true;
    }

    public function runthread() {
        if(isset($_GET['flag'])) {
            $flag = intval($_GET['flag']);
        }

        if($flag || $flag === 0) {
            call_user_func_array($this->hooks[$flag], $this->args[$flag]);
        } else {
            for($i = 0, $size = count($this->hooks); $i < $size; $i++) {
                $fp=fsockopen($_SERVER['HTTP_HOST'],$_SERVER['SERVER_PORT']);

                if($fp) {
                    $out = "GET {$_SERVER['PHP_SELF']}?flag=$i HTTP/1.1rn";
                    $out .= "Host: {$_SERVER['HTTP_HOST']}rn";
                    $out .= "Connection: Closernrn";
                    fputs($fp,$out);
                    fclose($fp);
                }
            }
        }
    }
}

test.php :

include('Thread.php');
Class AsyncOperation extends Thread {

    public function __construct($arg){
        $this->arg = $arg;
    }

    public function run(){
        if($this->arg){
            printf("Hello %s\n", $this->arg);
        }
    }
}
$thread = new AsyncOperation("World");
if($thread->start()){
    $thread->join();
}

PHP 加密 和 解密 算法

<?php
/**
 * $string: 明文 或 密文
 * $operation:DECODE表示解密,其它表示加密
 * $key: 密匙
 * $expiry:密文有效期
 */
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
    // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
    $ckey_length = 4;

    // 密匙
    $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);

    // 密匙a会参与加解密
    $keya = md5(substr($key, 0, 16));
    // 密匙b会用来做数据完整性验证
    $keyb = md5(substr($key, 16, 16));
    // 密匙c用于变化生成的密文
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
    // 参与运算的密匙
    $cryptkey = $keya.md5($keya.$keyc);
    $key_length = strlen($cryptkey);
    // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性
    // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
    $string_length = strlen($string);
    $result = '';
    $box = range(0, 255);
    $rndkey = array();
    // 产生密匙簿
    for($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($cryptkey[$i % $key_length]);
    }
    // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上并不会增加密文的强度
    for($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
    // 核心加解密部分
    for($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        // 从密匙簿得出密匙进行异或,再转成字符
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }
    if($operation == 'DECODE') {
        // substr($result, 0, 10) == 0 验证数据有效性
        // substr($result, 0, 10) - time() > 0 验证数据有效性
        // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性
        // 验证数据有效性,请看未加密明文的格式
        if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
            return substr($result, 26);
        } else {
            return '';
        }
    } else {
        // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
        // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
        return $keyc.str_replace('=', '', base64_encode($result));
    }
}
?>

调用实例:
<?php
$key = "e10adc3949ba59abbe56e057f20f883e";
$res = authcode("php是最好的语言","ENCODE",$key);
var_dump($res);
echo "
";
var_dump(authcode($res,"DECODE",$key));
string(67) "759880MngibY1yKLjCEtZDVd7ObzYJ39fTCcZkJGWoDovOaGlZeDaYRa5lx5jIXUt7k"
string(21) "php是最好的语言"

安装编译nginx1.9.7+php7.0.0服务器环境

nginx的编译安装
1、安装依赖扩展

$ yum -y install gcc gcc-c++ autoconf automake libtool make cmake
$ yum -y install zlib zlib-devel openssl openssl-devel pcre-devel

zlib: 为nginx提供gzip模块,需要zlib库支持
openssl: 为nginx提供ssl功能
pcre: 为支持地址重写rewrite功能

2、创建用来运行nginx的用户及组

$ groupadd nginx
$ useradd -g nginx -M nginx

-g参数为nginx用户指定了一个组。-M参数保证其不自动生成home目录。

但通过上面的用户创建之后,nginx用户可以通过设置一个密码登陆到服务器,这个不是我们想要的,我们禁用它的ssh登陆权限.禁止用户 登陆也很方便,只需要修改配置文件中有关用户和用户组的信息即可。

$ vi /etc/passwd

找到nginx,将后面的 /bin/bash 改为 /sbin/nologin 即可。
OK,用户处理完毕。
3、开始编译安装Nginx
configure配置如下:

$ ./configure --prefix=/usr/local/nginx \
--pid-path=/usr/local/nginx/run/nginx.pid \
--user=nginx \
--group=nginx \
--with-pcre \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module

3.1、安装

$ make
$ make install

安装到这里就结束了,但是,安装完可没完事儿,nginx还没有运行起来,你可以先去看看安装的结果,并且运行nginx服务器:

$ cd /usr/local/nginx
$ sbin/nginx

这样就运行起来了,访问你的服务器ip,看看能否看到ngin的欢迎页面吧。(不要让其他软件占用80端口哦)默认情况下网页文件放在/usr/local/nginx/html下,不符合我们的使用习惯,这个需要修改nginx的配置文件来修改,不过即使不修改,我们也是可以正常使用的,我们就不详细解释nginx的配置了。

不过为了使用我们熟悉的service操作,这里提供一个 程序 ,放到/etc/ini.d/目录下,并执行:

$ chmod +x /etc/init.d/nginx 
$ chkconfig --add nginx
$ chkconfig nginx on
$ /usr/local/nginx/sbin/nginx -s reload #重新加载nginx服务
$ /usr/local/nginx/sbin/nginx -s quit  #退出nginx服务

PHP7的编译安装
1、先从官方网站下载php7,并且解压,由于上面这篇文章已经有了相关步骤,就不做过多详解:

$ wget http://am1.php.net/get/php-7.0.0.tar.gz/from/this/mirror
$ tar zvxf php-7.0.0.tar.gz
$ cd php-7.0.0

2、编译前的配置:

$ ./configure --prefix=/usr/local/php7 \
--with-config-file-path=/usr/local/php7/etc \
--with-config-file-scan-dir=/usr/local/php7/etc/php.d \
--with-mcrypt=/usr/include \
--enable-mysqlnd \
--with-mysqli \
--with-pdo-mysql \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--with-gd \
--with-iconv \
--with-zlib \
--enable-xml \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \
--enable-gd-native-ttf \
--with-openssl \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--without-pear \
--with-gettext \
--enable-session \
--with-curl \
--with-jpeg-dir \
--with-freetype-dir \
--enable-opcache

3、配置无误后执行:

$ make
$ make install

4、调整php配置

默认安装好之后,你会发现/usr/local/php7/etc下面没有php.ini文件,这个去哪里要呢?在php7的源码安装包都有。可以看到有两个php.ini-xxx文件,我们可以分别vi打开来看下,一个是产品模式,一个是开发模式。

$ cd /usr/src/php-7.0.0/
$ ls
$ cp php.ini-production /usr/local/php7/etc/php.ini
$ vi /usr/local/php7/etc/php.ini

5、启用php-fpm服务

$ cd /usr/local/php7/etc
$ mv php-fpm.conf.default php-fpm.conf
$ mv php-fpm.d/www.conf.defualt php-fpm.d/www.conf

6、搞定php-fpm的服务载入:
就像上面的nginx一样,我们希望使用service php-fpm start|stop|restart这些操作来实现服务的重启,但没有像nginx那么复杂,php编译好之后,给我们提供了一个php-fpm的程序,不需要我再编写分享了。这个文件放在php编译源码目录中:

 $ cd /usr/src/php-7.0.0/sapi/fpm
 $ ls
 $ cp init.d.php-fpm /etc/init.d/php-fpm
 $ chmod +x /etc/init.d/php-fpm
 $ chkconfig --add php-fpm
 $ chkconfig php-fpm on

通过上面这个操作,我们就可以使用 sevice php-fpm start 来启用php-fpm了。用 ps -ef | grep php-fpm 看看进程

7、nginx代理php实现访问:
通过上面的操作,nginx和php-fpm服务都被我们跑起来了,但是php-fpm走的是127.0.0.1:9000,外网是无法访问的,而且我们也不可能直接通过php-fpm给外网提供服务,我们用nginx去代理9000端口执行php。实际上这个过程只需要对nginx进行配置即可,fpm已经在后台运行了,我们需要在nginx的配置文件中增加代理的规则,即可让用户在访问80端口,请求php的时候,交由后端的fpm去执行,并返回结果。

$ vi /usr/local/nginx/conf/nginx.conf
找到以下代码并去掉注释
#location ~ \.php$ {
  #   root           html;
  #  fastcgi_pass   127.0.0.1:9000;
  #  fastcgi_index  index.php;
  #  fastcgi_param  SCRIPT_FILENAME  /script$fastcgi_script_name;
  #  include        fastcgi_params;
#}
修改后的代码
location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /$document_root$fastcgi_script_name;
    include        fastcgi_params;
}
重启nginx
service nginx reload

PHP通用检测函数集合

这些函数都要测试才能使用,不保证个个都能使用,很多好的代码函数都可以在phpcms,dedecms,帝国cms中查找。

// ※CheckMoney($C_Money) 检查数据是否是99999.99格式
// ※CheckEmailAddr($C_mailaddr) 判断是否为有效邮件地址
// ※CheckWebAddr($C_weburl) 判断是否为有效网址
// ※CheckEmpty($C_char) 判断字符串是否为空
// ※CheckLengthBetween($C_char, $I_len1, $I_len2=100) 判断是否为指定长度内字符串
// ※CheckUser($C_user) 判断是否为合法用户名
// ※CheckPassword($C_passwd) 判断是否为合法用户密码
// ※CheckTelephone($C_telephone) 判断是否为合法电话号码
// ※CheckValueBetween($N_var, $N_val1, $N_val2) 判断是否是某一范围内的合法值
// ※CheckPost($C_post) 判断是否为合法邮编(固定长度)
// ※CheckExtendName($C_filename,$A_extend) 判断上传文件的扩展名
// ※CheckImageSize($ImageFileName,$LimitSize) 检验上传图片的大小
// ※AlertExit($C_alert,$I_goback=0) 非法操作警告并退出
// ※Alert($C_alert,$I_goback=0) 非法操作警告
// ※ReplaceSpacialChar($C_char) 特殊字符替换函数
// ※ExchangeMoney($N_money) 资金转换函数
// ※WindowLocation($C_url,$C_get=”",$C_getOther=”") PHP中的window.location函数

<?php 
// 函数名:CheckMoney($C_Money) 
// 作 用:检查数据是否是99999.99格式 
// 参 数:$C_Money(待检测的数字) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckMoney($C_Money) { 
    if (!ereg("^[0-9][.][0-9]$", $C_Money)) return false; 
    return true; 
} 

//----------------------------------------------------------------------------------- 
// 函数名:CheckEmailAddr($C_mailaddr) 
// 作 用:判断是否为有效邮件地址 
// 参 数:$C_mailaddr(待检测的邮件地址) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckEmailAddr($C_mailaddr) { 
    if (!eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$",  $C_mailaddr)) $c_mailaddr))  { 
        return false; 
    } 
    return true; 
} 

//----------------------------------------------------------------------------------- 
// 函数名:CheckWebAddr($C_weburl) 
// 作 用:判断是否为有效网址 
// 参 数:$C_weburl(待检测的网址) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckWebAddr($C_weburl) { 
    if (!ereg("^http://[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*$", $C_weburl)) { 
        return false; 
    } 
    return true; 
} 
//----------------------------------------------------------------------------------- 
// 函数名:CheckEmpty($C_char) 
// 作 用:判断字符串是否为空 
// 参 数:$C_char(待检测的字符串) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckEmptyString($C_char) { 
    if (!is_string($C_char)) return false; //是否是字符串类型 
    if (empty($C_char)) return false; //是否已设定 
    if ($C_char=='') return false; //是否为空 
    return true; 
} 

//----------------------------------------------------------------------------------- 
// 函数名:CheckLengthBetween($C_char, $I_len1, $I_len2=100) 
// 作 用:判断是否为指定长度内字符串 
// 参 数:$C_char(待检测的字符串) 
// $I_len1 (目标字符串长度的下限) 
// $I_len2 (目标字符串长度的上限) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckLengthBetween($C_cahr, $I_len1, $I_len2=100) { 
    $C_cahr = trim($C_cahr); 
    if (strlen($C_cahr) < $I_len1) return false; 
    if (strlen($C_cahr) > $I_len2) return false; 
    return true; 
} 
//----------------------------------------------------------------------------------- 
// 函数名:CheckUser($C_user) 
// 作 用:判断是否为合法用户名 
// 参 数:$C_user(待检测的用户名) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckUser($C_user)  { 
    if (!CheckLengthBetween($C_user, 4, 20)) return false; //宽度检验 
    if (!ereg("^[_a-zA-Z0-9]*$", $C_user)) return false; //特殊字符检验 
    return true; 
} 

// 函数名:CheckPassword($C_passwd) 
// 作 用:判断是否为合法用户密码 
// 参 数:$C_passwd(待检测的密码) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckPassword($C_passwd) { 
    if (!CheckLengthBetween($C_passwd, 4, 20)) return false; //宽度检测 
    if (!ereg("^[_a-zA-Z0-9]*$", $C_passwd)) return false; //特殊字符检测 
    return true; 
} 
//----------------------------------------------------------------------------------- 
// 函数名:CheckTelephone($C_telephone) 
// 作 用:判断是否为合法电话号码 
// 参 数:$C_telephone(待检测的电话号码) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckTelephone($C_telephone) { 
    if (!ereg("^[+]?[0-9]+([xX-][0-9]+)*$", $C_telephone)) return false; 
    return true; 
} 
//----------------------------------------------------------------------------------- 
// 函数名:CheckValueBetween($N_var, $N_val1, $N_val2) 
// 作 用:判断是否是某一范围内的合法值 
// 参 数:$N_var 待检测的值 
// $N_var1 待检测值的上限 
// $N_var2 待检测值的下限 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckValueBetween($N_var, $N_val1, $N_val2) { 
    if ($N_var < $N_var1 ││ $N_var > $N_var2) { 
        return false; 
    } 
    return true; 
} 

// 函数名:CheckPost($C_post) 
// 作 用:判断是否为合法邮编(固定长度) 
// 参 数:$C_post(待check的邮政编码) 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckPost($C_post) { 
    $C_post=trim($C_post); 
    if (strlen($C_post) == 6) { 
        if(!ereg("^[+]?[_0-9]*$",$C_post)) { 
            return true;; 
        }else { 
            return false; 
        } 
    }else { 
        return false;; 
    } 
}

//----------------------------------------------------------------------------------- 
// 函数名:CheckExtendName($C_filename,$A_extend) 
// 作 用:上传文件的扩展名判断 
// 参 数:$C_filename 上传的文件名 
// $A_extend 要求的扩展名 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckExtendName($C_filename,$A_extend) { 
    if(strlen(trim($C_filename)) < 5) { 
        return 0; //返回0表示没上传图片 
    } 
    $lastdot = strrpos($C_filename, "."); //取出.最后出现的位置 
    $extended = substr($C_filename, $lastdot+1); //取出扩展名 
    for($i=0;$i{ 
        //转换大小写并检测 
        if (trim(strtolower($extended)) == trim(strtolower($A_extend[$i]))) { 
            $flag=1; //加成功标志 
            $i=count($A_extend); //检测到了便停止检测 
        } 
    } 
    if($flag<>1) { 
        for($j=0;$j{ 
            $alarm .= $A_extend[$j]." "; 
        } 
        AlertExit('只能上传'.$alarm.'文件!而你上传的是'.$extended.'类型的文件'); 
        return -1; //返回-1表示上传图片的类型不符 
    } 
    return 1; //返回1表示图片的类型符合要求 
} 
//----------------------------------------------------------------------------------- 
// 函数名:CheckImageSize($ImageFileName,$LimitSize) 
// 作 用:检验上传图片的大小 
// 参 数:$ImageFileName 上传的图片名 
// $LimitSize 要求的尺寸 
// 返回值:布尔值 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function CheckImageSize($ImageFileName,$LimitSize) { 
    $size=GetImageSize($ImageFileName); 
    if ($size[0]>$LimitSize[0] ││ $size[1]>$LimitSize[1]) { 
        AlertExit('图片尺寸过大'); 
        return false; 
    } 
    return true; 
} 
//----------------------------------------------------------------------------------- 
// 函数名:Alert($C_alert,$I_goback=0) 
// 作 用:非法操作警告 
// 参 数:$C_alert(提示的错误信息) 
// $I_goback(返回到那一页) 
// 返回值:字符串 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function Alert($C_alert,$I_goback=0) { 
    if($I_goback<>0) { 
        echo " "; 
    } else { 
        echo " "; 
    } 
} 

// 函数名:AlertExit($C_alert,$I_goback=0) 
// 作 用:非法操作警告 
// 参 数:$C_alert(提示的错误信息) 
// $I_goback(返回到那一页) 
// 返回值:字符串 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function AlertExit($C_alert,$I_goback=0) { 
    if($I_goback<>0) { 
        echo " "; 
        exit; 
    } else { 
        echo " "; 
        exit; 
    } 
} 
//----------------------------------------------------------------------------------- 
// 函数名:ReplaceSpacialChar($C_char) 
// 作 用:特殊字符替换函数 
// 参 数:$C_char(待替换的字符串) 
// 返回值:字符串 
// 备 注:这个函数有问题,需要测试才能使用 
//----------------------------------------------------------------------------------- 
function ReplaceSpecialChar($C_char) { 
    $C_char=HTMLSpecialChars($C_char); //将特殊字元转成 HTML 格式。 
    $C_char=nl2br($C_char); //将回车替换为 
    $C_char=str_replace(" "," ",$C_char); //替换空格为 
    return $C_char; 
} 
//----------------------------------------------------------------------------------- 
// 函数名:ExchangeMoney($N_money) 
// 作 用:资金转换函数 
// 参 数:$N_money(待转换的金额数字) 
// 返回值:字符串 
// 备 注:本函数示例:$char=ExchangeMoney(5645132.3155) ==> $char='¥5,645,132.31' 
//----------------------------------------------------------------------------------- 
function ExchangeMoney($N_money) { 
    $A_tmp=explode(".",$N_money ); //将数字按小数点分成两部分,并存入数组$A_tmp 
    $I_len=strlen($A_tmp[0]); //测出小数点前面位数的宽度 
    if($I_len%3==0) { 
        $I_step=$I_len/3; //如前面位数的宽度mod 3 = 0 ,可按,分成$I_step 部分 
    } else { 
        $step=($len-$len%3)/3+1; //如前面位数的宽度mod 3 != 0 ,可按,分成$I_step 部分+1 
    } 
    $C_cur=""; 
    //对小数点以前的金额数字进行转换 
    while($I_len<>0) { 
        $I_step--; 
        if($I_step==0) { 
            $C_cur .= substr($A_tmp[0],0,$I_len-($I_step)*3); 
        } else { 
            $C_cur .= substr($A_tmp[0],0,$I_len-($I_step)*3).","; 
        } 
        $A_tmp[0]=substr($A_tmp[0],$I_len-($I_step)*3); 
        $I_len=strlen($A_tmp[0]); 
    } 
    //对小数点后面的金额的进行转换 
    if($A_tmp[1]=="") { 
        $C_cur .= ".00"; 
    } else { 
        $I_len=strlen($A_tmp[1]); 
        if($I_len<2) { 
            $C_cur .= ".".$A_tmp[1]."0"; 
        } else { 
            $C_cur .= ".".substr($A_tmp[1],0,2); 
        } 
    } 
    //加上人民币符号并传出 
    $C_cur="¥".$C_cur; 
    return $C_cur; 
} 

//----------------------------------------------------------------------------------- 
// 函数名:WindowLocation($C_url,$C_get="",$C_getOther="") 
// 作 用:PHP中的window.location函数 
// 参 数:$C_url 转向窗口的URL 
// $C_get GET方法参数 
// $C_getOther GET方法的其他参数 
// 返回值: 字符串 
// 备 注:无 
//----------------------------------------------------------------------------------- 
function WindowLocation($C_url,$C_get="",$C_getOther="") { 
    if($C_get == "" && $C_getOther == "") 
    if($C_get == "" && $C_getOther <> "") {
        $C_target=""window.location='$C_url?$C_getOther='+this.value"";
    } 
    if($C_get <> "" && $C_getOther == "") {
        $C_target=""window.location='$C_url?$C_get'"";
    } 
    if($C_get <> "" && $C_getOther <> "") {
        $C_target=""window.location='$C_url?$C_get&$C_getOther='+this.value"";
    } 
    return $C_target; 
}