龚哥哥 爱生活、做自己!
PHP标准工厂模式
发表于 2015-9-24 | 浏览(970) | PHP
<?php
 
//定义接口
interface database
{
    public function connect($param);  //定义接口方法
    public function query($sql);  //定义接口方法
    public function fetch($query);  //定义接口方法
}
 
//接口继承
class mysql implements database
{
    //集成上面 connect 的接口
    public function connect($param)
    {
        echo 'mysql::connect('.$param.')';
    }
     
    //集成上面 query 的接口
    public function query($sql)
    {
        echo 'mysql::query('.$sql.')';
    }
     
    //集成上面 fetch 的接口
    public function fetch($query)
    {
        echo 'mysql::fetch('.$query.')';
    }
}
 
//接口继承
class sqlserver implements database
{
    public function connect($param)
    {
        echo 'sqlserver::connect('.$param.')';
    }
     
    public function query($sql)
    {
        echo 'sqlserver::query('.$sql.')';
    }
     
    public function fetch($query)
    {
        echo 'sqlserver::fetch('.$query.')';
    }
}
 
//接口继承
class oracle implements database
{
    public function connect($param)
    {
        echo 'oracle::connect('.$param.')';
    }
     
    public function query($sql)
    {
        echo 'oracle::query('.$sql.')';
    }
     
    public function fetch($query)
    {
        echo 'oracle::fetch('.$query.')';
    }
}
 
class dbfactory
{
    private $objects = array();
    private $classes = array();
 
    public function __construct()
    {
        $this->classes = array(
                'mysql',
                'sqlserver',
                'oracle'
            );
        
        for($i=0; $i<count($this->classes); $i++)
       {
            if(in_array('database', class_implements($this->classes[$i], false)))
           {
                $this->objects[$this->classes[$i]] = new $this->classes[$i];
            } else {
                unset($this->classes[$i]);
            }
        }
    }
 
    public function query($sql, $type = 'mysql')
    {
        // empty 检测变量对象 $this->objects 是否为空
        if(empty($this->objects))
        {
            exit('No class');
        }
        //检测 $this->classes 成员属性数组对象中是否存在 $type 传递过来的值,这里 ! 号 取反,有则 执行 if 外面
        if(!in_array($type, $this->classes))
        {
            exit('NO '.$type.' 没有继承接口');  //没有这个值的时候结束当前函数操作并退出
        }
 
        //下面这句话同等: $object = new mysql();   $object->query($sql);
        $this->objects[$type]->query($sql);  //实例化 类 及调用类里面的方法
    }
}
 
$factory = new dbfactory();
$factory->query('SELECT * FROM member', 'mysql');
echo '<hr/>';
$factory->query('SELECT * FROM member', 'sqlserver');
echo '<hr/>';
$factory->query('SELECT * FROM member', 'oracle');

?>

阅读全文

Git使用教程
发表于 2015-9-17 | 浏览(1081) | 服务器

分支管理架构图

Image

基本操作

拉取分支数据
    默认master分支
        git pull

    指定分支
        git pull origin master

提交数据
    添加到暂停区
        提交当前目录下的所有文件
            git add .

        提交当前仓库所有文件
            git add *

        指定目录或文件
            git add dirname test.php hello.txt

    添加到当前分支
        git commit -m '注释'

    提交到远程仓库
        git push

撤销修改
    git checkout .   # 放弃所有修改
    git checkout test.php   # 放弃test.php文件修改
    git clean -fd   # 放弃新创建的目录或文件

    如果已经添加到暂停区了怎么撤销?两步完成(git add test.php)
        git reset HEAD test.php
        git checkout test.php

版本回退
    回退到上一个版本
        git reset --hard HEAD^

    指定版本号(如果电脑有重启,使用 git reflog)
        git log
            commit 4aa614980a3db998f3f6299f7c22e82f4e248e27
            Author: 龚福祥 <gongfuxiang@gongfuxiangdeMacBook.local>
            Date:   Thu Aug 27 21:47:26 2015 +0800

                gitignore

            commit d496317fc6e0de1697bcebd1dcd0120eaac5b578
            Author: 龚福祥 <gongfuxiang@gongfuxiangdeMacBook.local>
            Date:   Thu Aug 27 21:45:32 2015 +0800

                del temp

            commit 2663f5a91403065f83091087286d9bd7c2368afb
            Author: 龚福祥 <gongfuxiang@gongfuxiangdeMacBook.local>
            Date:   Thu Aug 27 21:31:48 2015 +0800

                dev update

        比如我们回退到 d496317fc6e0de1697bcebd1dcd0120eaac5b578 版本号不用写全,git会自动取找,前几位就行
            git reset --hard d496317fc
                HEAD is now at d496317fc dev update

回退成功后提交到远程仓库
        git push origin master

文件夹/文件管理

文件删除
    git rm test.php

删除文件夹以及文件夹下面的文件
    git rm -r dirname

文件命名
    git mv test.php new_file_name.php

提交到本地仓库
    git commit -m '文件命名'

提交到远程仓库
    git push

分支管理

创建分支
    git branch develop

切换分支
    git checkout develop
        当前分支前面标记一个*号
        * develop
              master

创建分支并且切换到新创建的分支
    git checkout -b develop

fetch只会拉取远程分支最新版本,不做merge操作
  git fetch origin test
  git checkout test

查看本地分支
    git branch

查看远程分支
    git branch -a

重命名本地分支名称
    git branch -m develop new_name

推送本地分支到远程
    git push origin develop

删除本地分支
    git branch -d develop

删除远程分支
    git push origin --delete develop
    git push origin :develop   [git v1.7.0之前]

合并某分支到当前分支
    git merge develop

标签管理

创建标签
    git tag v_0.0.1

创建历史版本标签
    查看历史提交的commit id
        git log --pretty=oneline --abbrev-commit
            97ccfa5 test
            4aa6149 gitignore
            d496317 del temp
            2663f5a dev update

    比如要对2663f5a打标签
        git tag v_0.0.1 2663f5a

查看所有标签
    git tag

提交一个标签到远程
    git push origin v_0.0.1

提交所有未提交到远程的标签
    git push origin --tags

删除本地标签
    git tag -d v_0.0.1

删除远程标签
    git push origin --delete tag v_0.0.1
    git push origin :refs/tags/v_0.0.1   [git v1.7.0之前]

获取远程标签
    git fetch origin tag v_0.0.1

暂时提交到缓存

提交修改的数据到缓存
    git stash

查看缓存数据列表
    git stash list

恢复数据并删除缓存数据
    git stash pop

恢复数据不删除缓存数据
    git stash apply

多次stash后可以使用序号恢复
    git stash apply stash@{0}

删除缓存数据
    git stash drop

git使用规范

1;开发不同功能需创建不同分支,如果涉及到多人开发,需提交到远程仓库一起在新的分支中开发。

2;合并分支前打tag标签,版本号明确。

3;提交代码注释写详细

阅读全文

CURL错误77 使用了SSL证书
发表于 2015-9-10 | 浏览(1245) | PHP

解决PHP curl https时error 77(Problem with reading the SSL CA cert (path? access rights?))

服务器环境为CentOS,php-fpm,使用curl一个https站时失败,打开curl_error,捕获错误:Problem with reading the SSL CA cert (path? access rights?)

解决方案:

1. sudo yum install ca-certificates (无论有没有,安装确认一下)

2. 重启php-fpm,这步比较重要,更改底层的东西时一定要重启一下

3. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);  //关闭curl使用证书

阅读全文

SchoolCMS学校管理系统项目
发表于 2015-9-6 | 浏览(2601) | 开源项目

SchoolCMS 简单而强大的学校内容管理系统、建站更快速!
依托新版SchoolCMS的功能优势和命名空间的特性,官方七年磨一剑,用心打造。更高,更快,更强,建站更简单!

提供的稳健的安全策略,包括备份恢复,容错,防止恶意攻击登陆,网页防篡改等多项安全管理功能,保证系统安全,可靠,稳定的运行。

代码遵循Apache2开源协议,并且免费使用,对商业用户友好。SchoolCMS将成为学校管理系统,另一面国产开源旗舰产品。

官方应用仓库拥有大量的第三方的插件和应用模块、模板主题,众多来自开源社区的贡献,让你的网站完美无缺!


下载地址:http://schoolcms.org/

阅读全文

CentOS设置自动连接网络
发表于 2015-9-1 | 浏览(598) | 服务器

vi /etc/sysconfig/network-scripts/目录下 ifcfg-eth0文件

ONBOOT=					yes 		//自动连接网络
DEVICE=					eth0   		//由eth0来启动
BOOTPROTO=				dhcp   		//获取IP的方式是自动获取,static是固定IP,none是手动
TYPE=					Ethernet 	//网络类型

重启网络

service network restart

阅读全文

MySQL双主_单主_热备份_实时备份
发表于 2015-9-1 | 浏览(809) | 数据库

6630381670443118394.jpg

两台服务器

主库ip:192.168.1.1
从库ip:192.168.1.2

主库配置、编辑 my.cnf  [mysqld]下添加

server-id=1
log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=relay-bin-index
replicate-do-db=devil #需要备份的数据库
slave_skip_errors = 1062 #忽略错误

#解决互相数据插入自增冲突
auto_increment_offset=1
auto_increment_increment=2

保存重启mysql

从库配置、编辑 my.cnf  [mysqld]下添加

server-id=2
log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=relay-bin-index
replicate-do-db=devil #需要备份的数据库
slave_skip_errors = 1062 #忽略错误

#解决自增冲突
auto_increment_offset=2
auto_increment_increment=2

保存重启mysql

主库配置、进入mysql控制台执行

mysql -uroot -proot

stop slave;

change master to master_host='192.168.1.2',master_user='root',master_password='root';

开启配置
start slave;

查看警告
Show warnings;

查看配置状态
show slave status\G

	以下两项yes表示状态配置成功,如果error有错误根据提示解决:
	Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

从库配置、进入mysql控制台执行

change master to master_host='192.168.1.1',master_user='root',master_password='root';

stop slave;

start slave;

Show warnings;

show slave status\G

以下两项yes表示状态配置成功,如果error有错误根据提示解决:
	Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

如果以上顺利通过,则可以进行测试了。以下是可能遇到的问题。

日志冲突解决

查看所有二进制日志
SHOW MASTER LOGS;

清空所有二进制日志
RESET MASTER;

网络连接失败

Last_IO_Errno: 1130
1;一般是防火墙开启,拒绝3306端口。或者是配置错误,如用户名或密码
2;还有可能是主库备份帐号的访问权限,进入主库mysql控制台
  use mysql;
  select * from user where user='root';
  update user set host = '%' where user ='root';
  flush privileges;

如果不使用root用户,可以创建一个备份用户

grant replication slave,replication client on *.* to '用户名'@'可执行操作的ip' identified by '密码';

阅读全文

jQuery的基本选择器使用
发表于 2015-9-1 | 浏览(601) | 前端

废话不多说,直接上代码,将所有 赋值到一个 html 文件中即可测试,// 表示注释

jquery-1.8.3.min.js 这个jQuery 下载地址,

下载地址:http://code.jquery.com/jquery-1.8.3.min.js

<!DOCTYPE html
<html>
    <head>
        <meta charset="UTF-8" />
        <title>jQuery 属性选择器</title>
        <script type="text/javascript" src="./jquery-1.8.3.min.js"></script>
        <script type="text/javascript">
            //$(document).ready(function() { 会选中全部
            $(document).ready(function() {
                //点击 button 按钮就会调用
                $('button').click(function() {
                    //$('#dd').css('color', '#F00');
                    //$('.cc').css('font-size', '38px');  //单个

                    //同时选作多个设置颜色
                    //$('#dd, .cc').css('color', '#0ff');

                    //会选择 ul 下的所有子元素,多级
                    //$('.ul span').css('color', '#F00');

                    //只会选择 ul 下的子元素,孙元素不会被选中
                    //$('.ul > span').css('color', '#F00');

                    //选作 class iia 紧的挨着的下一个元素
                    //$('.iia + li').css('color', '#F00').css('font-size', '38px');

                    //下面有两个iib 这样子的话,就会选中两个,最后一个和跟最后一个键紧挨着的一个
                    //$('.iib + li').css('color', '#F00');
                    //当选择下一个紧挨着的一个元素不存在时,则不会生效
                    //$('#iic + li').css('color', '#F00');

                    //意思class iia 下面的所有子 li 元素。逗号,则不一样的元素
                    //$('.iia ~ li,p').css('color', '#F00');

                    // 选中html标签中 属性为 id 的所有元素
                    //$('[id]').css('color', '#F00');

                    // 选中html标签中 属性为 for 的所有元素
                    //$('[for]').css('color', '#F00');

                    // 选中html标签中 属性为 asdf 的所有元素,可以应用于自定义属性
                    //$('[asdf]').css('color', '#F00');

                    //选中属性 for 等于 aaa 的所有元素
                    //$('[for="aaa"]').css('color', '#F00');

                    //选中 class 属性值为 php 的所有元素
                    //$('[class="php"]').css('color', '#F00');

                    //选中 class 不为 php 的元素。
                    //$('[class != "php"]').css('color', '#F00');

                    //选中 class 为 i 字母开头的元素
                    //$('[class ^= "i"]').css('color', '#F00');

                    //选中 class 以 b 字母结束的元素
                    //$('[class $= "b"]').css('color', '#F00');

                    //选中 class 包含 f 字母的所有元素
                    //$('[class *= "f"]').css('color', '#F00');

                    //选中 标签中必须包含 class 和 id 属性等于 iic 的元素
                    //$('[class][id = "iic"]').css('color', '#F00');

                    //选中标签中同时包含 class 属性值为 gege 和 id 属性值为 gg 的元素
                    //$('[class = "gege"][id = "gg"]').css('color', '#F00');

                    //选中 class ul,中间的空格表示下一及,后代选择器,下 class 的值为 iid 和 id 值为 bod 的元素
                    $('.ul [class = "iid"][id = "bod"]').css('color', '#F00');
                });
            });

        </script>
    </head>
    <body>
        <button>按钮 1</button>
        <button>按钮 2</button>
        <div id="dd">div dd</div>
        <div class="cc">div cc</div>
        <div class="cc">div cc2</div>

        <ul class="ul">
        <span>你是我的uuuullll</span>
            <li class="iia" id="good">苹果手机aagood 2</li>
            <li class="iib">安卓手机12bbb</li>
            <li class="iibf">软件开发2bbb</li>
            <li id="iic" class="php" asdf="fff">程序员2ccc</li>
            <p>p看看 ppp</p>
            <span>
                <li class="iid" id="bod" for="ccc">嘻嘻嘻嘻</li>
                <li id="good">哈哈哈哈哈good 2</li>
            </span>
        <li class="df">l滴滴滴滴
            <span>spspsp</span>
        </li>
        </ul>
        <label for="aaa" class="gege" id="gg">l乐乐乐乐</label>
        <li class="iid" id="bod" for="ccc">嘻嘻嘻嘻2222222</li>
    </body>
</html>

阅读全文

CentOS安装memcached服务
发表于 2015-9-1 | 浏览(521) | 服务器

1;yum安装

yum -y install memcached

2;验证是否安装成功,如果输出一些帮助信息表示安装成功

memcached -h

3;将memcache加入启动列表

chkconfig --level 2345 memcached on

4;配置Memcache

vi /etc/sysconfig/memcached
文件中内容如下
PORT=”11211″ 端口
USER=”root” 使用的用户名
MAXCONN=”1024″ 同时最大连接数
CACHESIZE=”64″ 使用的内存大小
OPTIONS=”" 附加参数

5;启动memcached

启动:service memcached start
关闭:service memcached stop
重启:service memcached restart

加入系统启动项
  echo "service memcached start" >> /etc/rc.local 

6;分配空间(11211 端口号可以自定义设置)

memcached -p 11211 -m 512 -d -u root start

7;连接memcached

telnet 121.199.44.203 11211

阅读全文

php安装memcache和memcached扩展
发表于 2015-9-1 | 浏览(827) | 服务器

安装php memcache

wget http://pecl.php.net/get/memcache-3.0.6.tgz
tar -zxvf memcache-3.0.6.tgz
cd memcache-3.0.6
/data/soft/php/bin/phpize (如果不知道phpize在什么位置,可以用find / -name phpize查找)
./configure –enable-memcache –with-php-config=/data/soft/php/bin/php-config –with-zlib-dir
make
make install

记录下安装成功后的提示,类似于:
Installing shared extensions: /data/soft/php/modules/
把这个地址记录下来

在php.ini文件里面添加扩展

vim /data/soft/php/bin/php.ini
添加 extension=memcache.so

最后验证一下是否安装完成

php -m|grep memcache
应该会显示memcache

到这里php memcach安装完成

安装php memcached扩展

1、先安装 memcached 依赖库 libmemcached

wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar -zxvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local/libmemcached --with-memcached
make
make install

现在安装php memcached扩展

wget http://pecl.php.net/get/memcached-2.2.0.tgz
tar -zxvf memcached-2.2.0.tgz
cd memcached-2.2.0
/data/soft/php/bin/phpize
./configure --enable-memcached --with-php-config=/data/soft/php/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl

在php.ini文件里面添加扩展

vim /data/soft/php/bin/php.ini
  添加 extension=memcached.so

最后验证一下是否安装完成

php -m|grep memcached
应该会显示memcached

到这里php memcachd安装完成

阅读全文

CentOS和Linux使用crontab运行定时任务(做一些你想做的)
发表于 2015-9-1 | 浏览(827) | 服务器

安装crontab:

yum install crontabs

说明:

/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置

查看crontab服务状态:service crond status
手动启动crontab服务:service crond start
查看crontab服务是否已设置为开机启动,执行命令:ntsysv

加入开机自动启动

chkconfig –level 35 crond on

1、crontab 命令

功能说明:设置计时器。
语  法:crontab [-u <用户名称>][配置文件] 或crontab [-u <用户名称>][-elr]
补充说明:cron是一个常驻服务,它提供计时器的功能,让用户在特定的时间得以执行预设的指令或程序。只要用户会编辑计时器的配置文件,就可以使 用计时器的功能。其配置文件格式如下:
Minute Hour Day Month DayOFWeek Command

参  数:
-e  编辑该用户的计时器设置。
-l  列出该用户的计时器设置。
-r  删除该用户的计时器设置。
-u<用户名称>  指定要设定计时器的用户名称。

2、crontab 格式

基本格式:
* * * * *  command
分 时 日 月 周  命令
第1列表示分钟1~59 每分钟用*或者*/1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列 表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

# Use the hash sign to prefix a comment
# +—————- minute (0 – 59)
# | +————- hour (0 – 23)
# | | +———- day of month (1 – 31)
# | | | +——- month (1 – 12)
# | | | | +—- day of week (0 – 7) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed

crontab文件的一些例子:


30 21 * * * /etc/init.d/nginx restart
每晚的21:30重启nginx。

45 4 1,10,22 * * /etc/init.d/nginx restart
每月1、10、22日的4 : 45重启nginx。

10 1 * * 6,0 /etc/init.d/nginx restart
每周六、周日的1 : 10重启nginx。

0,30 18-23 * * * /etc/init.d/nginx restart
每天18 : 00至23 : 00之间每隔30分钟重启nginx。

0 23 * * 6 /etc/init.d/nginx restart
每星期六的11 : 00 pm重启nginx。

* */1 * * * /etc/init.d/nginx restart
每一小时重启nginx

* 23-7/1 * * * /etc/init.d/nginx restart
晚上11点到早上7点之间,每 隔一小时重启nginx

0 11 4 * mon-wed /etc/init.d/nginx restart
每月的4号与每周一到周三 的11点重启nginx

0 4 1 jan * /etc/init.d/nginx restart
一月一号的4点重启nginx 

*/30 * * * * /usr/sbin/ntpdate 210.72.145.20
每半小时同步一下时间

阅读全文

TOP