MemCache内存缓存笔记

2013年9月10日 1 条评论

一、Memcache简介

Memcache(内存,缓存) :是一个高性能的分布式的内存对象缓存系统。通过在内存里维护一个巨大的HashTable。由Memcached来管理这个巨大的HashTable。

二、Memcache 与 Memcached的区别
Memcache是软件名称,Memcached是启动后的进程名称。

三、Memcache工作原理
memcached是以守护程序方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。
在没有安装memcache的时候网站工作的原理是:浏览器访问服务器脚本,然后服务器脚本访问数据库,处理后输出给浏览器。
而如果你[......]

Read more

分类: PHP 标签: ,

抽离CodeIgniter的图像处理类

2013年8月22日 没有评论

本文适用环境:没有使用CodeIgniter框架,但是想引入一个功能还算完善的图像处理类

CodeIgniter 的图像处理类可以使你完成以下的操作

  • 调整图像大小
  • 创建缩略图
  • 图像裁剪
  • 图像旋转
  • 添加图像水印
  • 首先定义一个常量,和两个函数,用于兼容CodeIgniter库Image_lib文件
    引入CI的Image_lib文件后,就可以操作了,详细可参考 http://codeigniter.org.cn/user_guide/libraries/image_lib.html

    <?php
    define("BASEPATH", dirname(__FILE__).'/');
     
    function &get_instance(&$class_object)
    {
    	return $class_object;
    }
     
    function log_message(){}
     
    // 图像处理类位置 CodeIgniter: ./system/libraries/Image_lib.php
    include("Image_lib.php");
     
    $config['image_library'] = 'gd2';
    $config['source_image'] = "/home/qiufeng/work/test/bdlogo.gif";
    $config['create_thumb'] = TRUE;
    $config['dynamic_output'] = TRUE;
    $config['maintain_ratio'] = TRUE;
    $config['width'] = 500;
    $config['height'] = 500;
     
    $image = new CI_Image_lib($config);
    $image->resize();
     
    /* End of file test.php */
    分类: PHP 标签: , ,

    基于jQuery+JSON的省市联动效果

    2013年8月15日 没有评论

    省市区联动下拉效果在WEB中应用非常广泛,尤其在一些会员信息系统、电商网站最为常见。开发者一般使用Ajax实现无刷新下拉联动。本文将讲述,利用jQuery插件,通过读取JSON数据,实现无刷新动态下拉省市二(三)级联动效果。

    HTML

  • 首先在head中载入jquery库和cityselect插件。
  • 接下来,我们在#city中,放置三个select,并且三个select分别设置class属性为:prov、city、dist,分别表示省、市、区(县)三个下拉框。注意如果只想实现省市二级联动,则去掉第三个dist的select即可。
  • 7386c3b3f87e2b64bad37fd[......]

    Read more

    分类: JavaScript 标签: , ,

    豆瓣工作招聘JS彩带

    2013年8月14日 1 条评论

    进入豆瓣网,打开开发者工具,如firefox下的firebug,在Console就能看到信息:

    喜欢看豆瓣的代码,还是发现了什么bug?不如和我们一起为豆瓣添砖加瓦吧!

    http://jobs.douban.com/#position-zsqd

    js源码

    window.console&&window.console.info("喜欢看豆瓣的代码,还是发现了什么bug?不如和我们一起为豆瓣添砖加瓦吧!\nhttp://jobs.douban.com/#position-zsqd");
    分类: JavaScript 标签:

    使用PHP opcodes看$php与”$php”的区别

    2013年7月23日 没有评论

    使用PHP opcodes看$php与”$php”的区别

    # 首先下载最新版vld扩展:
    wget http://pecl.php.net/get/vld-0.11.2.tgz
    tar zxvf vld-0.11.2.tgz
    cd vld-0.11.2/
    phpize5
    ./configure
    make
    sudo make install
    # Installing shared extensions:     /usr/lib/php5/20100525+lfs/

    修改cli的配置文件激活vld扩展
    /etc/php5/cli/php.ini
    添加一行
    extension=vld.so

    测试开始

    qiufeng@ubuntu:~$ php -dvld.active=1 -r 'echo @$php;'
    Finding entry points
    Branch analysis from position: 0
    Return found
    filename:       Command line c[......]

    Read more

    分类: PHP 标签: ,

    像注释HTML一样注释PHP代码

    2013年7月10日 没有评论

    我们的目标, 是要实现如下的语法(以php-5.4.17为基础)

    <?php
    echo "1.这里正常执行\n";
    <!--
    echo "像注释HTML一样注释PHP代码\n";
    echo "这行相当于在'/* */'体内\n";
    echo "不会被输出\n";
    -->                                                                                                                                              
    echo "2.这里正常执行\n";

    编辑Zend/zend_language_scanner.l

    // 这是PHP的多行注释源码
    <ST_IN_SCRIPTING>"/*"|"/**"{WHITESPACE} {
        int doc_com;
     
        if (yyleng > 2) {
            doc_com = 1;
            RESET_DOC_COMMENT();
        } else {
            doc_com = 0;
        }
     
        while (YYCURSOR < YYLIMIT) {
            if (*YYCURSOR++ == '*' && *YYCURSOR == '/') {
                break;
            }
        }
     
        if (YYCURSOR < YYLIMIT) {
            YYCURSOR++;
        } else {
            zend_error(E_COMPILE_WARNING, "Unterminated comment starting line %d", CG(zend_lineno));
        }
     
        yyleng = YYCURSOR - SCNG(yy_text);
        HANDLE_NEWLINES(yytext, yyleng);
     
        if (doc_com) {
            CG(doc_comment) = estrndup(yytext, yyleng);
            CG(doc_comment_len) = yyleng;
            return T_DOC_COMMENT;
        }
     
        return T_COMMENT;
    }

    在这基础上做个简单的hack,添加一个像HTML一样的注释

    <ST_IN_SCRIPTING>"<!-"|"<!--"{WHITESPACE} {
        int doc_com;
     
        if (yyleng >2 ) {
            doc_com = 1;
            RESET_DOC_COMMENT();
        } else {
            doc_com = 0;
        }
     
        while (YYCURSOR < YYLIMIT) {
             if (*YYCURSOR++ == '-' && *YYCURSOR == '>') {
                break;
            }
        }
     
        if (YYCURSOR < YYLIMIT) {
            YYCURSOR++;
        } else {
            zend_error(E_COMPILE_WARNING, "Unterminated comment starting line %d", CG(zend_lineno));
        }
     
        yyleng = YYCURSOR - SCNG(yy_text);
        HANDLE_NEWLINES(yytext, yyleng);
     
        if (doc_com) {
            CG(doc_comment) = estrndup(yytext, yyleng);
            CG(doc_comment_len) = yyleng;
            return T_DOC_COMMENT;
        }
     
        return T_COMMENT;
    }

    大功告成, 现在只需要重新编译PHP就可以了!

    分类: PHP源码 标签: ,

    快速设置PHP的开发目录

    2013年7月9日 1 条评论

    PHP的源码放在了git上边,任何人都可以重建他的工作环境。
    在项目开发时,我想能够在同一时间使用不同的PHP版本分支,如PHP5.3, PHP5.4,PHP5.5和PHP的稳定版本,我想快速地测试不同的PHP环境和配置运行的结果是怎么样的。如建立使用线程安全或调试模式打开或关闭。
    一个简单的方法是使用源码编译,关闭掉所有模块:

    git clone ....php-src.git
    cd php-src && ./buildconf
    mkdir build-master-minimal
    cd build-master-minimal
    ../configure --disable-all
    make

    首先下载源码包,然后把PHP编译到指定的目录中,这样就可以和其他版本的PHP分离开。

    分类: PHP 标签:

    php使用过滤器filter_var轻松验证邮箱url和ip地址等

    2013年6月13日 没有评论

    以前使用php的时候还不知道有过滤器filter这玩意,那时候判断邮箱、url和ip地址格式是否符合都是用正则表达式。后来随着使用的逐渐深入,才知道在php中也可以使用内置的函数库过滤器filter来完成这些功能。
    对于filter_var这个函数,如果验证通过则会返回验证对象,否则返回false。
    php验证邮箱

    <?php
    $email = 'fengdingbo@gmail.com';                                                
    $result = filter_var($email, FILTER_VALIDATE_EMAIL);
    var_dump($result); // string(20) "fengdingbo@gmail.com"

    php验证url地址

    <?php
    $url = "http://www.fengdingbo.com";
    $result = filter_var($url, FILTER_VALIDATE_URL);
    var_dump($result); // string(25) "http://www.fengdingbo.com"

    php验证ip地址

    <?php
    $url = "192.168.1.110";                                                         
    $result = filter_var($url, FILTER_VALIDATE_IP);
    var_dump($result); // string(13) "192.168.1.110"
    // 该方法也可以用来验证ipv6。
    $url = "2001:DB8:2de::e13";                                                     
    $result = filter_var($url, FILTER_VALIDATE_IP);
    var_dump($result); // string(17) "2001:DB8:2de::e13"

    [......]

    Read more

    分类: PHP 标签: ,

    PHP游戏中的抽奖算法初探

    2013年5月23日 1 条评论

    本示例代码是一段经典的概率算法,$probability是一个预先设置的数组,假设数组为:array(10,20,30,40),
    开始是从1,100这个概率范围内筛选第一个数是否在他的出现概率范围之内,
    如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,
    也就是说第二个数是在1,900这个范围内筛选的。这样筛选到最终,总会有一个数满足要求。
    就相当于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个一定是。
    这个算法简单,而且效率非常高,关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。
    PHP[......]

    Read more

    分类: JavaScript, PHP 标签: ,

    Apache mod_headers模块实现文件缓存

    2013年5月10日 没有评论

    遇到有的主机商不支持mod_expires模块,那就就试试mod_headers模块吧。

    # 开启Apache headers模块
    sudo a2enmod headers
    # 关闭Apache headers模块
    sudo a2dismod headers

    编辑Web目录的.htaccess文件

    <IfModule mod_headers.c>
        # htm,html,txt类型的文件缓存一个小时
        <FilesMatch "\.(htm|html|txt)$">
            header set Cache-Control "max-age=3600"
        </FilesMatch>
        # css,js,swf类型的文件缓存一个月
        <FilesMatch "\.(css|js|swf)$">
            header set Cache-Control "max-age=2678400"
        </FilesMatch>
        # ico,gif,jpg,jpeg,png,flv,pdf类型的文件缓存一年
        <FilesMatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">
            header set Cache-Control "max-age=31536000"
        </FilesMatch>
    </IfModule>

    参考来源
    http://httpd.apache.org/docs/2.2/mod/mod_headers.html

    分类: WebServer 标签: ,