PHP mysqlnd插件mysqlnd_ms教程及详细介绍

一、首先,mysqlnd是啥个玩意? 为什么要使用mysqlnd?

原因一: license问题
libmysql是MYSQL AB公司开发的,现在已经是Oracle集团所属的了,它使用MYSQL license发布。
This ultimately led to MySQL support being disabled by default in PHP
mysqlnd 是php的一部分,使用PHP license发布。
从此 licensing 的问题就算是解决了。

原因二:编译问题
使用libmysql的时候,如果要正常编译php,必须首先安装好mysql。
如果是单纯的一台WEB服务器,装个mysql似乎有点浪费了。
mysqlnd的话,就不必安装mysql,直接可用。

原因三:性能问题
由于mysqlnd是一个php扩展,使用了php memory management system,在内存使用方面效率相当高。
举个例子:
使用libmysql的时候,mysql结果集中的每一行都在内存中储存了二次 !
使用mysqlnd,结果集只会储存一次。
而且它还服从于php.ini中memory_limit的设置。
Using MySQL Native Driver leads to comparable or better performance than using MySQL Client Library。

mysqlnd的新特性
1 改进的persistent connection。
2 特殊函数 mysqli_fetch_all()
http://cn2.php.net/manual/en/mysqli-result.fetch-all.php
只有安装了mysqlnd, mysqli中的这个函数才可用。
3 Performance statistics calls: mysqli_get_cache_stats(), mysqli_get_client_stats(), mysqli_get_connection_stats()
在分析性能瓶颈的时候,这些函数还是蛮好用的。
详细文档可以看这里: http://cn2.php.net/manual/en/mysqlnd.stats.php
4 使用mysqlnd之后,mysqli也支持persistent connection了。
这样看起来,mysqli受益最多。
5 PHP 5.3.3 之后,mysqlnd支持SSL。
6 PHP 5.3.2 之后,mysqlnd支持Compressed Protocol
7 PHP 5.3.4 之后,windows系统中的mysqlnd支持Named Pipes。

Continue reading...

APC安装指南

APC简介

Alternative PHP Cache (APC) 中文全称是“可选PHP缓存”,是一种对PHP有效的开放源高速缓冲储存器工具,可用于缓存和优化Web服务器上的PHP代码,改善服务器性能。
APC优势

APC 和 eAccelerator 都是不错的PHP加速缓存,但是为什么在这里要推荐使用 APC 呢?
1、稳定性

根据我们对几个大站点的测试,虽然在低负载的情况下,APC性能略逊于eAccelerator,但是在大流量长期运行的情况下,APC 比 eAccelerator 更为稳定。如果站点出现 PHP 突然假死、无故出现 502 报错的现象,我们建议使用 APC 。
2、技术支持

APC 的发展迅速,自从 FACEBOOK 加入对 APC 的更新后,得到了很大发展,而 eAccelerator 新版本稳定性不佳,功能和代码都被删除了不少。
3、兼容性

Continue reading...

[泡]自动回帖机器人v1

[泡]自动回帖机器人Discuz插件发布

演示:http://www.xda.cn
官网:http://discuz.pao11.com

[泡]自动回帖机器人,主要实现功能

1、能随机论坛会员进行回贴操作,增加论坛人气。
2、后台自定义功能强大
3、独立自定义机器人开关
4、自定义回贴内容
5、自定义机器人活跃时间
6、自定义参与回帖的用户组
7、自定义机器活跃的论坛版块
8、自定义某时期、及主题相关属性的主题进行回帖
9、自定义设置回复数限制
10、独有的活跃频率能更好的模拟真实用户回帖,更好的体现论坛人气

插件地址:http://addon.discuz.com/?@pao_reply_robot.plugin

Continue reading...

AJAX POST 跨域解决方案 – CORS

跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),因为我们在日常的项目开发时会不可避免的需要进行跨域操作,所以跨域能力也算是前端工程师的基本功之一。
  和大多数跨域的解决方案一样,JSONP也是我的选择,可是某天PM的需求变了,某功能需要改成支持POST,因为传输的数据量比较大,GET形式搞不定。所以折腾了下闻名已久的CORS(跨域资源共享,Cross-Origin Resource Sharing),这边文章也就是折腾期间的小记与总结。

概述

  • CORS能做什么:
    正常使用AJAX会需要正常考虑跨域问题,所以伟大的程序员们又折腾出了一系列跨域问题的解决方案,如JSONP、flash、ifame、xhr2等等。
    本文介绍的CORS就是一套AJAX跨域问题的解决方案。

  • CORS的原理:
    CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。

  • CORS浏览器支持情况如下图:
    06082033-9233ced009a644f9af909baca57a72b7.png

06082103-f46e697e71884240b7200f8713697fbc.png

喜闻乐见、普大喜奔的支持情况,尤其是在移动终端上,除了opera Mini;
PC上的现代浏览器都能友好的支持,除了IE9-,不过前端工程师对这种情况早应该习惯了…

Continue reading...

泡PHP验证码PAOPHP.Captcha v1

<?php
class Captcha{
var $image  = null;
var $fonts  = './Fonts/';
var $width  = 100;
var $height = 30;
var $length = 4;
var $phrase = null;
var $string = array('A','B','C','D','E','F','H','J','K','L','M','N','P','R','S','T','U','V','W','X','Y','Z');    


public function __construct()
{ 
    if (!extension_loaded("gd")) exit("Captcha Unable Load GD Library Copyright paophp.com");                
     
}


public function Phrase()
{
    if (strlen($this->phrase) != $this->length) {
        $phrase = null;
        $rand = array_rand($this->string, $this->length);
        foreach ($rand as $index)
            $phrase .= $this->string[$index];
        $this->phrase = $phrase;
    }
    return $this->phrase;
}     

public function Generate()
{
    $image = is_resource($this->image) ? $this->image : $this->GenerateImage();
        header("Content-type: image/png");
        imagepng($image);
        imagedestroy($image);        
}

private function CreateImage()
{
    if (!is_resource($this->image)) {

        $this->image = imagecreatetruecolor($this->width, $this->height);
        $color1 = imagecolorallocate($this->image, mt_rand(200, 255),mt_rand(200, 255), mt_rand(150, 255));
        $color2 = imagecolorallocate($this->image, mt_rand(200, 255),mt_rand(200, 255), mt_rand(150, 255));
        $color1 = imagecolorsforindex($this->image, $color1);
        $color2 = imagecolorsforindex($this->image, $color2);
        $steps = $this->width;

        $r1 = ($color1['red'] - $color2['red']) / $steps;
        $g1 = ($color1['green'] - $color2['green']) / $steps;
        $b1 = ($color1['blue'] - $color2['blue']) / $steps;

        $x1 = 0; $y1 =& $i; $x2 = $this->width; $y2 =& $i;

        for ($i = 0; $i <= $steps; $i++) {
            $r2 = $color1['red'] - floor($i * $r1);
            $g2 = $color1['green'] - floor($i * $g1);
            $b2 = $color1['blue'] - floor($i * $b1);
            $color = imagecolorallocate($this->image, $r2, $g2, $b2);
            imageline($this->image, $x1, $y1, $x2, $y2, $color);
        }

        for ($i = 0, $count = mt_rand(10, 20); $i < $count; $i++) {
            $color = imagecolorallocatealpha($this->image, mt_rand(20, 255), mt_rand(20, 255),
                                             mt_rand(100, 255), mt_rand(80, 120));
            imageline($this->image, mt_rand(0, $this->width), 0,
                      mt_rand(0, $this->width), $this->height, $color);
        }
    }
    return $this->image;
}

public function GenerateImage($phrase = null)
{
    $image = $this->CreateImage();
    $phrase == null && $phrase = $this->Phrase();                      
    $fontsize = min($this->width, $this->height * 2) / (strlen($phrase));
    $spacing = (integer) ($this->width * 0.9 / strlen($phrase));
    is_dir($this->fonts) && $this->fonts = glob($this->fonts.'*.{ttf,otf}', GLOB_BRACE);  
    for ($i = 0, $strlen = strlen($phrase); $i < $strlen; $i++) {
        $font = $this->fonts[array_rand($this->fonts)];
        $color = imagecolorallocate($image, mt_rand(0, 160), mt_rand(0, 160), mt_rand(0, 160));
        $angle = mt_rand(-30, 30);
        $size = $fontsize / 12 * mt_rand(12, 14);
        $box = imageftbbox($size, $angle, $font, $phrase[$i]);
        $x = $spacing / 4 + $i * $spacing + 2;
        $y = $this->height / 2 + ($box[2] - $box[5]) / 4;
        imagefttext($image, $size, $angle, $x, $y, $color, $font, $phrase[$i]);
    }
    $this->image = $image;
    $_SESSION['PAOPHP_CAPTCHA_KEY'] = $phrase;
    return $this->image;
}           

public static function Verify($str = null)
{
    $key = $_SESSION['PAOPHP_CAPTCHA_KEY'];
    if(!empty($_SESSION['PAOPHP_CAPTCHA_KEY']) && !empty($str) && strtolower($str) === strtolower($key)){
      $_SESSION['PAOPHP_CAPTCHA_KEY'] = null;
      unset($_SESSION['PAOPHP_CAPTCHA_KEY']);
      return true;
    }else{
      return false;
    }
  
}                        
}

使用方法:

session_start();
require_once('./Captcha.class.php');
$captcha = new Captcha();
$captcha->width = 90;
$captcha->height = 28;
$captcha->Generate();

参数说明:

$captcha->width; 宽度设定
$captcha->height; 高度设定
$captcha->fonts; 随机字体文件夹路径
$captcha->length; 验证码字符串长度
$captcha->string ; 验证码随机字符串生成数组 例:array('a','b','c');

主要功能:
泡PHP验证码可以随机字体。
并由用户字定义字符串大小、宽度、高度。
泡PHP验证码已集成验证方法。无须重写,简化操作
欢迎加入【珠三角PHP联盟群】:5579345 (汇集高端PHP大牛技术交流)
参数说明及使用方法请看:http://bbs.paophp.com/thread-41-1-1.html

说明:泡PHP验证码PAOPHP.Captcha v1并无突破性的技术进展,旨在学习验证码原理,相信通过各位网友的智慧可以一步一步进行改进。

Continue reading...



about me

  • 陶之11's Blog Name:陶之11 OICQ:14779023 Site:Pao11.com

分类

快捷入口