当前位置:  编程技术>php
本页文章导读:
    ▪详解PHP5中static和const关键字的用法      1,static 在php中,static 关键字在类中有于描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类无法访问,只对类的实例共享。 .........
    ▪php防止恶意注册与暴力破解的实例代码      1,防止外站提交数据,验证数据提交页面的来源是否为本站。 (另外一种方法,可以随机input的name名称,也是可行的。)   代码示例: <?php  session_start();    if ($_POST["submit"] == "go"){  .........
    ▪mysql Proxy读写分离配置与php mysql读写分离类      说明: MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。 对于应用而言,MySQL .........

[1]详解PHP5中static和const关键字的用法
    来源: 互联网  发布时间: 2013-12-24

1,static
在php中,static 关键字在类中有于描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类无法访问,只对类的实例共享。
类的静态变量,非常类似全局变量,能够被所有类的实例共享,类的静态方法也是一样的,类似于全局函数。
类的静态方法能访问类的静态的属性。

说明:static的成员,必须使用self来访问,使用this会出错 。

this和self的区别,请参考文章: php中this,self,parent的区别

2,const
const是一个定义常量的关键字,类似于C中的#define,能够定义一个常量,在程序中不允许修改。

例子:
 

代码示例:
<?php 
class Counter 

    private static $count = 0; //定义一个静态属性 
    const TYPE_VERSION = 2; //定义一个常量 
    const TYPE_ACTIVED = 1; //定义一个常量 
 
    //构造函数 
    function __construct() 
    { 
        self::$count++; 
    } 
 
    //析构函数 
    function __destruct() 
    { 
        self::$count--; 
    } 
 
    //定义一个静态的方法 
    static function getCount() 
    { 
        return self::$count; 
    } 
 
    //翻译所有的const 
    public static function get_type_list() 
    {  //www.
        return array( 
            self::TYPE_VERSION => '版本', 
            self::TYPE_ACTIVED => '激活', 
        ); 
    } 
 
    public static function getTypes() 
    { 
        return self::getConstants('TYPE_', __CLASS__, self::get_type_list()); 
    } 
 
    public static function getConstants($token, $objectClass, $valOption = array(), $showOnlyOneLabel = false) 
    { 
        $tokenLen = strlen($token); 
 
        $reflection = new ReflectionClass($objectClass); //php built-in 
        $allConstants = $reflection->getConstants(); //constants as array 
 
        $tokenConstants = array(); 
        foreach ($allConstants as $name => $val) { 
            if (substr($name, 0, $tokenLen) != $token) continue; 
            if ($showOnlyOneLabel && 1 == count($valOption) && isset()($valOption[$val])) { 
                $tokenConstants = $valOption[$val]; 
                break; 
            } 
            $tokenConstants[$val] = isset($valOption[$val]) ? $valOption[$val] : $val; 
        } 
        return $tokenConstants; 
    } 

 
print_r(Counter::getTypes()); 
//创建一个实例 
$c = new Counter(); 
 
//执行打印 
print(Counter::getCount() . "<br>\n"); //使用直接输入类名来访问静态方法Counter::getCount 
 
//打印类的版本 
print("Version useed: " . Counter::TYPE_ACTIVED . "<br>\n"); 
?>

    
[2]php防止恶意注册与暴力破解的实例代码
    来源: 互联网  发布时间: 2013-12-24

1,防止外站提交数据,验证数据提交页面的来源是否为本站。
(另外一种方法,可以随机input的name名称,也是可行的。)
 

代码示例:
<?php 
session_start(); 
 
if ($_POST["submit"] == "go"){ 
    //check token 
    if ($_POST["token"] == $_SESSION["token"]){ 
        //continue processing…. 
    }else{ 
        //stop all processing! remote form posting attempt! 
    } 

$token = md5(uniqid(rand(), true)); 
$_SESSION["token"]= $token; 
?> 
<form action="/blog_article/</php echo $_SERVER[.html"PHP_SELF"];?>" method="post"> 
<p><label for="name">Name</label> 
<input type="text" name="name" id="name" size="20″ maxlength="40″/></p> 
<input type="hidden" name="token" value="<?php echo $token;?>"/> 
<p><input type="submit" name="submit" value="go"/></p> 
</form>

2,IP及IP段进行访问限制,防止恶意注册与暴力破解。
 

代码示例:

<?php 
$oblock_ip = new block_ip(); 
$boolean = $oblock_ip->checkip();

/**
* 对IP地址或IP段限制访问
* by www.
*/
class block_ip { 
    var $block_ip = array("192.168.1.1","210.10.2.1-20","222.34.4.*"); 
 
    function __construct(){ 
    } 
 
    function __destruct(){ 
    } 
 
    private function makepregip($str){ 
        if (strstr($str,"-")) { 
            $aip = explode()(".",$str); 
            foreach ($aip as $k=>$v) { 
                if (!strstr($v,"-")) { 
                    $preg_limit .= makepregip($v); 
                }       else{ 
                    $aipnum = explode("-",$v); 
                    for($i=$aipnum[0];$i<=$aipnum[1];$i++){ 
                        $preg .=$preg?"|".$i:"[".$i; 
                    } 
                    $preg_limit .=strrpos($preg_limit,".",1)==(strlen($preg_limit)-1)?$preg."]":".".$preg."]"; 
                } 
            } 
        }else{ 
            $preg_limit .= $str."."; 
        } 
        return $preg_limit; 
    } 
 
    private function getallblockip(){ 
        if ($this->block_ip) { 
            foreach ($this->block_ip as $k=>$v) { 
                $ipaddres = $this->makepregip($v->start_ip); 
                $ip = str_ireplace(".","\.",$ipaddres); 
                $ip  = str_replace()("*","[0-9]{1,3}",$ip); 
                $ipaddres  = "/".$ip."/"; 
                $ip_list[] = $ipaddres; 
            } 
        } 
        return $ip_list; 
    } 
 
    public function checkip() { 
        $iptable = $this->getallblockip(); 
        $isjoined = true; 
        //取得用户ip 
        $ip = $this->get_client_ip(); 
        $ip = trim($ip); 
        //剔除黑名单中的ip区段 
        if ($iptable) { 
            foreach($iptable as $value) { 
                if (preg_match("{$value}",$ip)) { 
                    $isjoined = false; 
                    break; 
                } 
            } 
        } 
        //如果在ip黑名单中,则执行如下操作 
        if( !$isjoined ){ 
            echo "ip error"; 
            exit; 
        } 
    } 
 
    private function get_client_ip(){ 
        if (getenv("http_client_ip") && strcasecmp(getenv("http_client_ip"), "unknown")) 
            $ip = getenv("http_client_ip"); 
        else if (getenv("http_x_forwarded_for") && strcasecmp(getenv("http_x_forwarded_for"), "unknown")) 
            $ip = getenv("http_x_forwarded_for"); 
        else if (getenv("remote_addr") && strcasecmp(getenv("remote_addr"), "unknown")) 
            $ip = getenv("remote_addr"); 
        else if (isset()($_server['remote_addr']) && $_server['remote_addr'] && strcasecmp($_server['remote_addr'], "unknown")) 
            $ip = $_server['remote_addr']; 
        else 
            $ip = "unknown"; 
        return($ip); 
    } 

?>


    
[3]mysql Proxy读写分离配置与php mysql读写分离类
    来源: 互联网  发布时间: 2013-12-24

说明:
MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。
对于应用而言,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。
当然,这样proxy机器可能成为单点失效,可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多个proxy的连接参数,就可以实现。

典型配置案例:
1、最简单的,代理单个数据库服务器,通过4040端口访问mysql数据库。
mysql-proxy –proxy-backend-addresses=192.168.18.110:3306

2、连接多个数据库服务器,假如A and B. 第一个客户端连接到 A,第二个连接到 B。
如果有一台停止服务时,代理会自动检测到,有新连接时会自动连接到一台正常的数据库。
 

代码示例:
mysql-proxy \
–proxy-backend-addresses=narcissus:3306 \
–proxy-backend-addresses=nostromo:3306

3、数据库读写分离,192.168.18.110负责写入,192.168.18.107负责读取数据,当然也可以再增加读取数据的服务器。
 

代码示例:
mysql-proxy \
–proxy-backend-addresses=192.168.18.110:3306 \
–proxy-read-only-backend-addresses=192.168.18.107:3306
 

这种方式并不是读写分离。
mysql-proxy不能区分哪些是发往从服务器的,还需要自己用脚本控制,见第四种方式。

4、 Lua 脚本能很好的控制连接和分布, 以及查询及返回的结果集.
使用Lua脚本时,必须使用 –proxy-lua-script 指定脚本的名称。
直到产生连接时才会读取脚本,也就是修改脚本后不用重新启动服务。
mysql-proxy –proxy-lua-script=rw-splitting.lua –proxy-backend-addresses=192.168.18.110:3306 –proxy-read-only-backend-addresses=192.168.18.107:3306

注意问题:
1、proxy的读写分离机制是先把最初的几条查询发到master上建立连接,
当发送到master上的查询数超过连接池的最小值时开始把查询

2、LAST_INSERT_ID不能发送到主服务器上, 226 行修改为下面的就可以了
elseif not is_insert_id and token.token_name == “TK_FUNCTION” then

3、使用默认的rw-splitting.lua时,会提示找不到proxy-command,我把mysql-proxy的路径设置为系统路径,然后在 share目录下运行就一切Ok了,在运行中输入cmd,然
后cd C:\tools\mysql-proxy\share。

4、字符乱码
通过proxy连上数据库之后,查到的字符串始终是乱码,即便手工执行了set names ‘utf8′也没有效果。
解决办法,mysql server必须设置
 

1.[mysqld]
2.skip-character-set-client-handshake
3. init-connect=’SET NAMES utf8′
4. default-character-set=utf8
public function isReadOperation($sql) { 
    return preg_match('/^\s*(SELECT|SHOW|DESC|PRAGMA)\s+/i',$sql); 

附,php读写分离类
 

代码示例:
<?php 
class mysql_rw_php { 
    //查询个数 
    var $querynum = 0; 
    //当前操作的数据库连接 
    var $link = null; 
    //字符集 
    var $charset; 
    //当前数据库 
    var $cur_db = ''; 
 
    //是否存在有效的只读数据库连接 
    var $ro_exist = false; 
    //只读数据库连接 
    var $link_ro = null; 
    //读写数据库连接 
    var $link_rw = null; 
 
    function mysql_rw_php(){ 
    } 
 
    function connect($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0, $halt = TRUE) { 
        if($pconnect) { 
            if(!$this->link = @mysql_pconnect()($dbhost, $dbuser, $dbpw)) { 
                $halt && $this->halt('Can not connect to MySQL server'); 
            } 
        } else { 
            if(!$this->link = @mysql_connect()($dbhost, $dbuser, $dbpw)) { 
                $halt && $this->halt('Can not connect to MySQL server'); 
            } 
        } 
         
        //只读连接失败 
        if(!$this->link && !$halt) return false; 
         
        //未初始化rw时,第一个连接作为rw 
        if($this->link_rw == null) 
            $this->link_rw = $this->link; 
 
        if($this->version() > '4.1') { 
            if($this->charset) { 
                @mysql_query()("SET character_set_connection=$this->charset, character_set_results=$this->charset, character_set_client=binary", $this->link); 
            } 
            if($this->version() > '5.0.1') { 
                @mysql_query("SET sql_mode=''", $this->link); 
            } 
        } 
        if($dbname) { 
            $this->select_db($dbname); 
        } 
    } 
 
    //连接一个只读的mysql数据库 
    function connect_ro($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0){ 
        if($this->link_rw == null) 
            $this->link_rw = $this->link; 
        $this->link = null; 
        //不产生halt错误 
        $this->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, false); 
        if($this->link){ 
            //连接成功 
            //echo "link ro sussess!<br>"; 
            $this->ro_exist = true; 
            $this->link_ro = $this->link; 
            if($this->cur_db){ 
                //如果已经选择过数据库则需要操作一次 
                @mysql_select_db($this->cur_db, $this->link_ro); 
            } 
        }else{ 
            //连接失败 
            //echo "link ro failed!<br>"; 
            $this->link = &$this->link_rw; 
        } 
    } 
 
    //设置一系列只读数据库并且连接其中一个 
    function set_ro_list($ro_list){ 
        if(is_array($ro_list)){ 
            //随机选择其中一个 
            $link_ro = $ro_list[array_rand($ro_list)]; 
            $this->connect_ro($link_ro['dbhost'], $link_ro['dbuser'], $link_ro['dbpw']); 
        } 
    } 
 
    function select_db($dbname) { 
        //同时操作两个数据库连接 
        $this->cur_db = $dbname; 
        if($this->ro_exist){ 
            @mysql_select_db($dbname, $this->link_ro); 
        } 
        return @mysql_select_db($dbname, $this->link_rw); 
    } 
 
    function fetch_array($query, $result_type = MYSQL_ASSOC) { 
        return mysql_fetch_array($query, $result_type); 
    } 
 
    function fetch_one_array($sql, $type = '') { 
        $qr = $this->query($sql, $type); 
        return $this->fetch_array($qr); 
    } 
 
    function query($sql, $type = '') { 
        $this->link = &$this->link_rw; 
        //判断是否select语句 
        if($this->ro_exist && preg_match ("/^(\s*)select/i", $sql)){ 
            $this->link = &$this->link_ro; 
        } 
        $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ? 
            'mysql_unbuffered_query' : 'mysql_query'; 
        if(!($query = $func($sql, $this->link)) && $type != 'SILENT') { 
            $this->halt('MySQL Query Error', $sql); 
        } 
        $this->querynum++; 
        return $query; 
    } 
 
    function affected_rows() { 
        return mysql_affected_rows($this->link); 
    } 
 
    function error() { 
        return (($this->link) ? mysql_error($this->link) : mysql_error()); 
    } 
 
    function errno() { 
        return intval(($this->link) ? mysql_errno($this->link) : mysql_errno()); 
    } 
 
    function result($query, $row) { 
        $query = @mysql_result($query, $row); 
        return $query; 
    } 
 
    function num_rows($query) { 
        $query = mysql_num_rows($query); 
        return $query; 
    } 
 
    function num_fields($query) { 
        return mysql_num_fields($query); 
    } 
 
    function free_result($query) { 
        return mysql_free_result($query); 
    } 
 
    function insert_id() { 
        return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0); 
    } 
 
    function fetch_row($query) { 
        $query = mysql_fetch_row($query); 
        return $query; 
    } 
 
    function fetch_fields($query) { 
        return mysql_fetch_field($query); 
    } 
 
    function version() { 
        return mysql_get_server_info($this->link); 
    } 
 
    function close() { 
        return mysql_close($this->link); 
    } 
 
    function halt($message = '', $sql = '') { 
        $dberror = $this->error(); 
        $dberrno = $this->errno(); 
        echo "<div position:absolute;font-size:11px;font-family:verdana,arial;background:#EBEBEB;padding:0.5em;\"> 
                <b>MySQL Error</b><br> 
                <b>Message</b>: $message<br> 
                <b>SQL</b>: $sql<br> 
                <b>Error</b>: $dberror<br> 
                <b>Errno.</b>: $dberrno<br> 
                </div>"; 
        exit(); 
    } 
}
?>

调用示例:
 

代码示例:
<?php 
/****************************************
*** mysql-rw-php version 0.1
*** http://www.
*** http://code.google.com/p/mysql-rw-php/
*** code modify from class_mysql.php (uchome)
****************************************/ 
 
require_once('mysql_rw_php.class.php'); 
 
//rw info 
$db_rw = array( 
    'dbhost'=>'www.', 
    'dbuser'=>'xxx', 
    'dbpw'=>'www.', 
    'dbname'=>'test' 
); 
 
$db_ro = array( 
    array( 
        'dbhost'=>'www.:4306', 
        'dbuser'=>'xxx', 
        'dbpw'=>'www.' 
    ) 
); 
 
$DB = new mysql_rw_php; 
 
//connect Master 
$DB->connect($db_rw[dbhost], $db_rw[dbuser], $db_rw[dbpw], $db_rw[dbname]); 
 
//Method 1: connect one server 
$DB->connect_ro($db_ro[0][dbhost], $db_ro[0][dbuser], $db_ro[0][dbpw]); 
 
//Method 2: connect one server from a list by rand 
$DB->set_ro_list($db_ro); 
 
//send to rw 
$sql = "insert into a set a='test'"; 
$DB->query($sql); 
 
//send to ro 
$sql = "select * from a"; 
$qr = $DB->query($sql); 
while($row = $DB->fetch_array($qr)){ 
    echo $row[a]; 

?>

    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3