php rsa加密解密完整实例

<?php
/**
 * RSA加密
 * env:(PHP 4 >= 4.0.4, PHP 5, PHP 7)
 * 密钥对生成
 * 工具:OpenSSL
 * 生成私钥:genrsa -out rsa_private_key.pem 1024
 * 生成公钥:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
 * Author:luchanglong
 * Date:2017-12-14
 * **********************************************
 * * 私钥丢失将导致数据永久无法解密
 * *********************************************
 */

header("Content-type: text/html; charset=utf-8");

class RsaTools
{
    //私钥文件路径
    private $rsaPrivateKeyFilePath;

    //私钥值
    private $rsaPrivateKey;

    //公钥文件路径
    private $rsaPublicKeyFilePath;

    //公钥值
    private $rsaPublicKey;

    function __construct()
    {
        $this->rsaPrivateKeyFilePath=dirname(__FILE__).DIRECTORY_SEPARATOR.'key'.DIRECTORY_SEPARATOR.'rsa_private_key.pem';
        $this->rsaPublicKeyFilePath=dirname(__FILE__).DIRECTORY_SEPARATOR.'key'.DIRECTORY_SEPARATOR.'rsa_public_key.pem';
    }

    /**
     *  rsa公钥加密
     **/
    public function rsaEncrypt($data) {
        if($this->checkEmpty($this->rsaPublicKeyFilePath)){
            //读取字符串
            $pubKey= $this->rsaPublicKey;
            $res = "-----BEGIN PUBLIC KEY-----\n" .
                wordwrap($pubKey, 64, "\n", true) .
                "\n-----END PUBLIC KEY-----";
        }else {
            //读取公钥文件
            $pubKey = file_get_contents($this->rsaPublicKeyFilePath);
            //转换为openssl格式密钥
            $res = openssl_get_publickey($pubKey);
        }

        ($res) or die('RSA公钥错误。请检查公钥文件格式是否正确');
        $data=trim($data);
        openssl_public_encrypt($data,$encrypted,$pubKey);//公钥加密
        $encrypted = base64_encode($encrypted);
        return $encrypted;
    }
    /**
     * rsa私钥解密
     **/
    public function rsaDecrypt($data) {

        if($this->checkEmpty($this->rsaPrivateKeyFilePath)){
            //读字符串
            $priKey=$this->rsaPrivateKey;
            $res = "-----BEGIN RSA PRIVATE KEY-----\n" .
                wordwrap($priKey, 64, "\n", true) .
                "\n-----END RSA PRIVATE KEY-----";
        }else {
            $priKey = file_get_contents($this->rsaPrivateKeyFilePath);
            $res = openssl_get_privatekey($priKey);
        }
        ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置');
        $data=base64_decode($data);
        openssl_private_decrypt($data, $dcyCont, $res);
        return $dcyCont;
    }

    /**
     * 校验$value是否非空
     *  if not set ,return true;
     *    if is null , return true;
     **/
    protected function checkEmpty($value) {
        if (!isset($value))
            return true;
        if ($value === null)
            return true;
        if (trim($value) === "")
            return true;

        return false;
    }

}


$r=new RsaTools();
$str="0123456789?><~!@#$%^&*()_+qwertyuiopasdfghjklzxcvbnm";
echo '待加密:'.$str."<br>";
$en=$r->rsaEncrypt($str);
echo '加密后:'.$en.'<br>';
$de=$r->rsaDecrypt($en);
echo '解密后:'.$de;

 

一个字节(byte)到底有多大?一个字节能表示多大的整数?

因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295

PHP 分类无限级,二维数组转树形,二维数组转树形html输出,二维数组获取顶级分类

/**
     * 缓存所有商品分类
     * @return mixed
     */
    static function findAllCache()
    {
        //开发期间不缓存,直接返回所有分类
        return $goodsCate = self::select('*')->orderBy('pid', 'ASC')->orderBy('sort', 'ASC')->get()->toArray();

        /* if(Cache::has('goods_cate')){
             $goodsCate = Cache::get('goods_cate');
         }else{
             $goodsCate = self::select('*')->orderBy('pid', 'ASC')->orderBy('sort', 'ASC')->get()->toArray();
             Cache::put('goods_cate',$goodsCate,1*24);
         }
         return $goodsCate;*/
    }

    /**
     * 所有分类=>树形数组
     * 将查询到的所有分类转换成树形返回
     * @param array  $cate 所有分类,可以使用findAllCache() 查询
     * @param int $pid 初始父级
     * @return mixed
     */
    static function getTree(array $cate,$pid=0){
        $result = array();
        foreach($cate as $v){
            if($v['pid'] == $pid){
                $v['children'] =self::getTree($cate,$v['id']);
                $result[] = $v;
            }
        }
        return $result;
    }
    /**
     * 一维数组=>树形带option数组
     * 返回options递归信息
     * @param array $data 全部分类
     * @param int $pid
     * @param int $level
     * @return string
     */
    static function getTreeOption($data,$pid = 0,$level=0){
        $result = '';
        $j=0;
        foreach($data as $v){
            if($v['pid'] == $pid){
                $delimit='';
                if($level){
                    for($i=1;$i<=$level;$i++){
                        $delimit .= '&nbsp;&nbsp;';
                    }
                } else {
                    $delimit = '';
                }
                $result .= '<option value="'.$v['id'].'">'.$delimit.$v['title'].'</option>';
                $result .= self::getTreeOption($data,$v['id'],$level+1);
            }
        }
        return $result;
    }
    /**
     * 所有分类=>顶级分类
     * 将查询到的所有分类转换成顶级一维html option返回
     * @param array  $data 所有分类
     * @param int $pid 初始父级
     * @return mixed
     */
    static function getParentHtml($data,$pid = 0,$level=0,$delimit = ''){
        $result = array();
        foreach($data as $v){
            if($v['pid'] == $pid){
                if($level){
                    for($i=1;$i<=$level;$i++){
                        $delimit .= '&nbsp;&nbsp;';
                    }
                } else {
                    $delimit = '';
                }
                $result[] = '<option value="'.$v['id'].'">'.$delimit.$v['title'].'</option>';
                $res = self::getTreeOption($data,$v['id'],$level+1);
                if(is_array($res)){
                    foreach($res as $v2){
                        $result[] = $v2;
                    }
                }
            }
        }
        return $result;
    }

 

php.ini文件位置

在类UNIX的系统中,PHP(除了CLI模式)默认在/usr/local/lib路径寻找php.ini文件。为了让它更加“shell式”,CLI模式默认寻找/etc/php-cli.ini,用做代替。这可以让你的web服务器和CLI/shell脚本保持单独的php.ini文件,而无需再你每次运行一个php的脚本时设置-c选项。

不同的Unix/linux系统发布版绑定PHP时,经常使用它们自己默认的php.ini位置;你可以通过你的PHP执行文件加上get_cfg_var(“cfg_file_path”)来找到该文件。

php压力测试和性能分析工具介绍

压力测试:

php的压力测试一般有两种方法法

1.ab工具 。ApacheBench的缩写。它是绑定到apache中的,也可以单独安装。

$ab -n 1000 -c 10  http://localhost/index.php

2.Siege。可以一个测试多个地址。

$ siege -i -t 10S -f urls.txt

 

性能分析:

1.ZendStudio 的Profiler来进行性能分析

2.使用APD(Advanced PHP Debugger)进行性能分析。一般来说用的就是这个。

3.使用Xdebug进行性能分析。这个比较偏向于代码调试。当然如果配置了Ccachegrind还是很好用的。

 

 

.使用APC(Advanced PHP Cache)。opcache 可以大大的加快你php的运行速度。

 

ubuntu使用ab测试

安装

sudo apt-get install apache2-utils

测试:

ab -c 20 -n 1000 http://www.example.com/

-c:并发数
-n:总请求数

ab运行完成后会有比较详细的结果

Server Software:        web服务器软件及版本
Server Hostname:        请求的地址
Server Port:            请求的端口

Document Path:          请求的页面路径
Document Length:        页面大小

Concurrency Level:      并发数
Time taken for tests:   测试总共花费的时间
Complete requests:      完成的请求数
Failed requests:        失败的请求数
Write errors:           写入错误
Total transferred:      总共传输字节数,包含http的头信息等
HTML transferred:       html字节数,实际的页面传递字节数
Requests per second:    每秒处理的请求数,服务器的吞吐量(重要)
Time per request:       平均数,用户平均请求等待时间
Time per request:       服务器平均处理时间
Transfer rate:          平均传输速率(每秒收到的速率)

参数说明:

-n即requests,用于指定压力测试总共的执行次数。

-c即concurrency,用于指定压力测试的并发数。

-t即timelimit,等待响应的最大时间(单位:秒)。

-b即windowsize,TCP发送/接收的缓冲大小(单位:字节)。

-p即postfile,发送POST请求时需要上传的文件,此外还必须设置-T参数。

-u即putfile,发送PUT请求时需要上传的文件,此外还必须设置-T参数。

-T即content-type,用于设置Content-Type请求头信息,例如:application/x-www-form-urlencoded,默认值为text/plain

-v即verbosity,指定打印帮助信息的冗余级别。

-w以HTML表格形式打印结果。-i使用HEAD请求代替GET请求。

-x插入字符串作为table标签的属性。-y插入字符串作为tr标签的属性。

-z插入字符串作为td标签的属性。

-C添加cookie信息,例如:”Apache=1234″(可以重复该参数选项以添加多个)。

-H添加任意的请求头,例如:”Accept-Encoding: gzip”,请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。

-A添加一个基本的网络认证信息,用户名和密码之间用英文冒号隔开。

-P添加一个基本的代理认证信息,用户名和密码之间用英文冒号隔开。

-X指定使用的代理服务器和端口号,例如:”126.10.10.3:88″。

-V打印版本号并退出。

-k使用HTTP的KeepAlive特性。

-d不显示百分比。

-S不显示预估和警告信息。

-g输出结果信息到gnuplot格式的文件中。

-e输出结果信息到CSV格式的文件中。

-r指定接收到错误信息时不退出程序。

-h显示用法信息,其实就是ab -help