johnxu/tool

常用工具包

v3.0.1 2019-07-18 09:34 UTC

README

截取字符串

<?php
use johnxu\tool\Str;
$res = Str::getInstance()->cut('http://www.johnxu.net', 0, 3);
var_dump($res); // htt

转换编码

<?php
use johnxu\tool\Str;
$res = Str::getInstance()->encoding('我们是好朋友', 'GBK');
var_dump($res); // �����Ǻ�����

var_dump(Str::getInstance()->encoding('�����Ǻ�����', 'UTF-8')); // 我们是好朋友

内置方法

  • cut(string, start , length) 截取字符串
  • lower(string) // 转换小写
  • upper(string) // 转换大小
  • has(string, neddle) // 查找是否存在该字符串
  • remove(string, neddle) // 去除字符串
  • reverse(string) // 翻转字符串
  • arrayToString(array) // 将数组转换成字符串
  • stringToArray(string) // 将字符串转换成数组
  • ucwords(string) // 将字符串每个单子首字母大写
  • ucfirst(string) // 将字符首字母大写
  • generateTradeNo(length) // 创建订单号\
  • generateUid(); // 创建用户ID
  • getMachineCode(block, blockSize, split); // 创建机器激活码:8E8363C1-094E0EDC-7D67C393
  • formatBytes(size, delimiter); // 格式化文件大小:10KB, 10MB

RSA生成签名串

<?php
use johnxu\tool\Rsa;
$data = '这是要签名的数据,字符串类型';
$private_key = ''; // 有两种方式,第一种是文件,写入文件路径即可;第二种是字符串,填写密钥字符串
$sign = Rsa::signature($data, $private_key); // 返回的签名后的base64字符串

RSA校验签名

<?php
use johnxu\tool\Rsa;
$sign = ''; // 签名串
$public_key = ''; // 同private_key
$data = '这是要签名的数据,字符串类型';
$result = Rsa::verify($data, $sign, $public_key); // 返回验签的结果

公私钥加密

<?php
use johnxu\tool\Rsa;
// 第三个参数有为,表示用公钥加密,私钥解密;反之
Rsa::encrypt('1234', 'private or public key', true);

公私钥解密

<?php
use johnxu\tool\Rsa;
// 第三个参数有为,表示用私钥解密;反之
Rsa::decrypt('加密数据', 'private or public key', true);

Config配置是用

<?php
$config = array(
	'wx' => array(
		'appid' => 1234,
		'key' => 5678
	),
	'site_url' => 'http://www.johnxu.net'
);
// 批量设置
johnxu\tool\Config::batch($config);

// 单独设置
johnxu\tool\Config::set('wx', $config['wx']);

// 取值
johnxu\tool\Config::get('wx');
johnxu\tool\Config::get('wx.appid');

http请求的使用

<?php 
use johnxu\tool\Http;

// get请求
$response = Http::getInstance()->request('http://www.baidu.com');

if ($response->getCode() == 200) {
	var_dump($response->get('data'));// 原始数据
	var_dump($response->getContent(false)); // 同上
	var_dump($response->getContent()); // json解析后的数据(数组)
}

RESTFul风格的接口(只支持tp5)

<?php
namespace app\api\controller;
use johnxu\tool\Restful;
class Users extends Restful
{
    // 模拟用户组
	private $users
		= array(
			array(
				'uid'           => 1,
				'authorization' => false,
				'nickname'      => 'tom',
				'age'           => 25,
				'sex'           => 'male',
				'email'         => 'tom@163.com'
			),
			array(
				'uid'           => 2,
				'authorization' => false,
				'nickname'      => 'Alice',
				'age'           => 25,
				'sex'           => 'female',
				'email'         => 'Alice@163.com'
			),
			array(
				'uid'           => 3,
				'authorization' => true,
				'nickname'      => 'peter',
				'age'           => 30,
				'sex'           => 'male',
				'email'         => 'peter@163.com'
			),
		);

	// 获取所有的用户
	public function index()
	{
		$this->ok( Restful::HTTP_RESPONSE_OK, $this->users );
	}

	// 获取指定用户的信息
	public function get( $uid )
	{
		foreach ( $this->users as $user )
		{
			if ( $user['uid'] == $uid )
			{
				if ( $user['authorization'] == false )
				{
				    // {"uid":2,"authorization":false,"nickname":"Alice","age":25,"sex":"female","email":"Alice@163.com"}
					$this->ok( Restful::HTTP_RESPONSE_OK, $user );
				}
				else
				{
				    // {"err_code":2001,"message":"UnAuthorization"}
					$this->fail( Restful::HTTP_RESPONSE_UN_AUTHORIZATION, 2001, 'UnAuthorization' );
				}
			}
		}

		// {"err_code":1001,"message":"Not Found"}
		$this->fail( Restful::HTTP_RESPONSE_NOT_FOUND, 1001, 'Not Found' );
	}
}
<?php
// 定义路由 route.php
Route::group( 'v1', function () {
    Route::group( 'users', function () {
        Route::get( '/', 'api/users/index' );

        Route::get( '/:uid', 'api/users/get' );
    } );
} );

// 访问:
// 获取所有用户:GET http://localhost/v1/useres
// 获取指定用户:GET http://localhost/v1/users/1

RSA签名和验签

<?php
use johnxu\tool\Rsa;
use johnxu\tool\exception\InvalidSignatureException;
use johnxu\tool\exception\InvalidParamException;
use johnxu\tool\exception\InvalidVerifyException;

$publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/ykZnOUb0ro7WaraW+aPyNCgZgJyvr2CIQhTLRvOeOW4Ba8FaudwWACL0QFfIjW+V3rqMG0SPHGIitHUXIH0tzQZoKp8FfZVQOZxNyBaIjwzgSvuZuBGYZ/rrH53158t7gt58IIHGxcfJehhex/0bk8rUAO2U5kKGKwvEbDMOXwIDAQAB';
$privateKey = 'MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAL/KRmc5RvSujtZqtpb5o/I0KBmAnK+vYIhCFMtG8545bgFrwVq53BYAIvRAV8iNb5XeuowbRI8cYiK0dRcgfS3NBmgqnwV9lVA5nE3IFoiPDOBK+5m4EZhn+usfnfXny3uC3nwggcbFx8l6GF7H/RuTytQA7ZTmQoYrC8RsMw5fAgMBAAECgYA1T5ucS86OawsnTMhuVPweciMHW7myGBTEK2IuUw2a2KncWUCI4IrtzqHotQ3xoGb5CM1f7qBzC1e3/+NgR1aj7laAXtg/S1mfJISMIoXkUi/9q+4GwbbaU/vkYyhqnoAa5tL7/X4wuRlWtc7tC9TyqS+EXOa990SZOpuHjqpCiQJBAOLV1+ISWa30MMFWeTD5L6SP6BAE2mrgt6ZaRL2hGUp9QxWX2o89/cne4FEa0RrI1gLfOYHEoHhw5lqSMHHpGJMCQQDYcvBp7idMecg9+NcI1F+P1EDtNsMgpiXmAdV8sNpv/TbhzarLHh7bTnHrg7e2QRhUBuoZmU8Rx3FsUu41Qc6FAkBQyZKKvLhd4QNgSFj/XTBfrrUax2+28vPVdn7W/sJQKk6zKRM5Qv3ZYNyJZkClBnRaL4B+vDXez27rQPeqCjerAkAv9+kH0NusuyCBe3BMaKR0/5kT+RrtVWT4wFdLtvXx87ACAs5jDV3RRGVCyIIiRfLaTF39Jli7m/OrCgX4j4jxAkEAspLOMeD7ZH97cR+Mi3iHnweCQ86tZ6UNCc2+pC7murjpZs+fBP/zDeLTjYmX22QZb1KvPTeAnKkQ2OuyUdTN/w==';

// 私钥签名
try {
    $signature = Rsa::signature('123', $privateKey, 'RSA2');
    var_dump($signature);
} catch (InvalidSignatureException $e) {
    var_dump($e->getMessage());
} catch (InvalidParamException $e) {
    var_dump($e->getMessage());
}

// 公钥验签
try {
    $flag = Rsa::verify($signature, $publicKey, 'RSA2');
    var_dump($flag);
} catch (InvalidParamException $e) {
    var_dump($e->getMessage());
} catch (InvalidVerifyException $e) {
    var_dump($e->getMessage());
}

RSA加密与解密

<?php
use johnxu\tool\Rsa;
use johnxu\tool\exception\InvalidParamException;

$publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/ykZnOUb0ro7WaraW+aPyNCgZgJyvr2CIQhTLRvOeOW4Ba8FaudwWACL0QFfIjW+V3rqMG0SPHGIitHUXIH0tzQZoKp8FfZVQOZxNyBaIjwzgSvuZuBGYZ/rrH53158t7gt58IIHGxcfJehhex/0bk8rUAO2U5kKGKwvEbDMOXwIDAQAB';
$privateKey = 'MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAL/KRmc5RvSujtZqtpb5o/I0KBmAnK+vYIhCFMtG8545bgFrwVq53BYAIvRAV8iNb5XeuowbRI8cYiK0dRcgfS3NBmgqnwV9lVA5nE3IFoiPDOBK+5m4EZhn+usfnfXny3uC3nwggcbFx8l6GF7H/RuTytQA7ZTmQoYrC8RsMw5fAgMBAAECgYA1T5ucS86OawsnTMhuVPweciMHW7myGBTEK2IuUw2a2KncWUCI4IrtzqHotQ3xoGb5CM1f7qBzC1e3/+NgR1aj7laAXtg/S1mfJISMIoXkUi/9q+4GwbbaU/vkYyhqnoAa5tL7/X4wuRlWtc7tC9TyqS+EXOa990SZOpuHjqpCiQJBAOLV1+ISWa30MMFWeTD5L6SP6BAE2mrgt6ZaRL2hGUp9QxWX2o89/cne4FEa0RrI1gLfOYHEoHhw5lqSMHHpGJMCQQDYcvBp7idMecg9+NcI1F+P1EDtNsMgpiXmAdV8sNpv/TbhzarLHh7bTnHrg7e2QRhUBuoZmU8Rx3FsUu41Qc6FAkBQyZKKvLhd4QNgSFj/XTBfrrUax2+28vPVdn7W/sJQKk6zKRM5Qv3ZYNyJZkClBnRaL4B+vDXez27rQPeqCjerAkAv9+kH0NusuyCBe3BMaKR0/5kT+RrtVWT4wFdLtvXx87ACAs5jDV3RRGVCyIIiRfLaTF39Jli7m/OrCgX4j4jxAkEAspLOMeD7ZH97cR+Mi3iHnweCQ86tZ6UNCc2+pC7murjpZs+fBP/zDeLTjYmX22QZb1KvPTeAnKkQ2OuyUdTN/w==';

// 公钥加密 === 私钥解密
// 公钥加密
try {
    $crypted = Rsa::encrypt('123', $publicKey);
    var_dump($crypted);
} catch(InvalidParamException $e) {
    var_dump($e->getMessage());
}

// 私钥解密
try {
    $decrypted = Rsa::decrypt($crypted, $privateKey);
    var_dump($decrypted);
} catch(InvalidParamException $e) {
    var_dump($e->getMessage());
}

// 私钥加密 === 公钥解密
// 私钥加密
try {
    $crypted = Rsa::encrypt('123', $privateKey, false);
    var_dump($crypted);
} catch (InvalidParamException $e) {
    var_dump($e->getMessage());
}

// 公钥解密
try {
    $decrypted = Rsa::decrypt($crypted, $publicKey, false);
    var_dump($decrypted);
} catch (InvalidParamException $e) {
    var_dump($e->getMessage());
}

用户授权管理

<?php
use johnxu\tool\Api;

class Users extends Api
{	
	/**
	 * @login true 
     */
	public function needLogin()
	{
	    return '需要验证登录的';
	}
	/**
	 * @login false
     */
	public function noNeedLogin()
	{
	    return '不需要登录的';
	}
}
// curl -i -u fsyzxz@163.com localhost:8000/api/users/authorization // 登录
// POST http://localhost:8000/api/users/register {username: "xfjpeter@163.com", password: 123456} // 注册
// POST|GET http://localhost:8000/api/users/logout // 退出登录

Hash加密和验证

<?php
// Hash加密
$hashStr = \johnxu\tool\Hash::make('123');
var_dump($hashStr);

// 验证hash加密是否正确
$result = \johnxu\tool\Hash::check('123', $hashStr);
var_dump($result);

时间操作

<?php
use johnxu\tool\Time;
// 获取今天的时间戳(开始,结束)
$today = Time::today();
print_r( $today );
/**
 * Array
 * (
 * [0] => 1551139200
 * [1] => 1551225599
 * )
 */

// 获取昨天的时间戳(开始,结束)
$yesterday = Time::yesterday();

// 获取本周开始和结束的时间戳
$week = Time::week();

// 上周开始和结束的时间戳
$lastWeek = Time::lastWeek();

// 本月开始和结束的时间戳
Time::month();

// 上月开始和结束的时间戳
Time::lastMonth();

// 今年开始和结束的时间戳
Time::year();

// 去年开始和结束的时间戳
Time::lastYear();

// 获取7天前零点到现在的时间戳
Time::dayToNow(7);

// 获取7天前零点到昨日结束的时间戳
Time::dayToNow(7, true);

// 获取7天前的时间戳
Time::daysAgo(7);

//  获取7天后的时间戳
Time::daysAfter(7);

// 天数转换成秒数
Time::daysToSecond(5);

// 周数转换成秒数
Time::weekToSecond(5);

JWT验证(已废弃)

<?php
use johnxu\tool\Jwt;

$jwt     = Jwt::getInstance([
    'key' => '123456',
]);
$payload = [
    'iss' => 'johnxu', // 该jwt的签发者
    'iat' => time(), // 签发时间
    'exp' => time() + 7200, // 过期时间
    'nbf' => time() + 60, // 该时间之前不接收处理该Token
    'sub' => 'www.johnxu.net', // 面向的用户
    'jti' => md5(uniqid('jwt').time()) // 该token的唯一值
];

// 获取token
$token = $jwt->getToken($payload);
// echo $token;
// eyJhbGciOiJIUzI1NiIsInR5cCI6Imp3dCJ9.eyJpc3MiOiJqb2hueHUiLCJpYXQiOjE1NTUzOTA5MzEsImV4cCI6MTU1NTM5ODEzMSwibmJmIjoxNTU1MzkwOTkxLCJzdWIiOiJ3d3cuam9obnh1Lm5ldCIsImp0aSI6ImE0NGQ1M2QzNmUzZjA0ODQ4NWUyNmM4NWRkMjhhODNmIn0.qPJkuuC41UI4usTdelZaGYF3ahGT3WmByjEhg50FrjY

// 校验
$result = $jwt->verify('eyJhbGciOiJIUzI1NiIsInR5cCI6Imp3dCJ9.eyJpc3MiOiJqb2hueHUiLCJpYXQiOjE1NTUzOTA5MzEsImV4cCI6MTU1NTM5ODEzMSwibmJmIjoxNTU1MzkwOTkxLCJzdWIiOiJ3d3cuam9obnh1Lm5ldCIsImp0aSI6ImE0NGQ1M2QzNmUzZjA0ODQ4NWUyNmM4NWRkMjhhODNmIn0.qPJkuuC41UI4usTdelZaGYF3ahGT3WmByjEhg50FrjY');
var_dump($result);

JWT(Json Web Tokens)

<?php
use johnxu\tool\Jwt;
use johnxu\tool\Str;
use johnxu\tool\exception\InvalidParamException;
use johnxu\tool\exception\InvalidVerifyException;
use johnxu\tool\exception\InvalidSignatureException;

// 生成token签名
$jwt = new Jwt();
$jwt->setHeader([
    'typ' => 'jwt',
    'alg' => 'HS256',
]);
$jwt->setExp(time() + 60);
$jwt->setNbf(time() + 30);
$jwt->setJti(Str::getInstance()->generateTradeNo());
$jwt->setSub('权限验证');
$jwt->setIat(time());
$jwt->setIss('johnxu');
$jwt->setPayload([
    'token' => Str::getInstance()->getMachineCode(3, 8, ''),
]);
try {
    var_dump($jwt->getToken());
} catch (InvalidParamException $e) {
    var_dump($e->getMessage()); // 接管参数异常
}

// 验证token签名
$token = 'eyJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1NjM0MTg0NDIsImF1ZCI6bnVsbCwiZXhwIjoxNTYzNDE5NDQyLCJzdWIiOiLmnYPpmZDpqozor4EiLCJpc3MiOiJqb2hueHUiLCJuYmYiOjE1NjM0MTg1MDIsImp0aSI6IjIwMTkwNzE4MTA1NDAyNTI5NzU2NDg1NyIsInBheWxvYWQiOnsidG9rZW4iOiI3MTRGMkE5NzcwMkUxMTE1NTU1MzAwNkUifX0.LwINfASxIBSFuKd4U5MtjbUQhVDPTRcKsaGC9Ud7jVM';

$jwt = new Jwt();
try {
    var_dump($jwt->verify($token));
    /**
      array(8) {
        ["iat"] => int(1563419701)
        ["aud"] => NULL
        ["exp"] => int(1563419761)
        ["sub"] => string(12) "权限验证"
        ["iss"] => string(6) "johnxu"
        ["nbf"] => int(1563419731)
        ["jti"] => string(24) "201907181115015153519854"
        ["payload"] => array(1) {
          ["token"] => string(24) "8C873A9101AFD2F4B00A8D60"
        }
      }
     */
} catch (InvalidSignatureException $e) {
    var_dump($e->getMessage()); // 签名错误
} catch (InvalidVerifyException $e) {
    var_dump($e->getMessage()); // 过期或者还没到生效期
}

AES 加密与解密

CBC方式加密解密

<?php
use johnxu\tool\Aes;

$aes = Aes::getInstance();
try {
    echo $aes->encrypt('{"name":"johnxu","age":25,"email":"fsyzxz@163.com"}', $key, Aes::METHOD_AES_128_CBC, $iv);
    echo PHP_EOL;
    echo $aes->decrypt('bBBl028ESU3hjpxwIPzTf3ep+WT3k8FALPic8Hz9o99OMZVgAoJmBTjHxrQJIc1VffLjtBRxCldUvQLSAptQRA==', $key,
            Aes::METHOD_AES_128_CBC, $iv).PHP_EOL.PHP_EOL;
} catch (Exception $e) {
    var_dump($e->getMessage());
}

ECB方式加密解密

<?php
use johnxu\tool\Aes;

$aes = Aes::getInstance();
try {
    echo $aes->encrypt('{"name":"johnxu","age":25,"email":"fsyzxz@163.com"}', $key).PHP_EOL;
    echo $aes->decrypt('U8TELNRLE6l+JIM+nKO/4rg7ZaaJWOyLocU3MZPsDOnnkpbG/msHn63FOjvHCwjH8cmlCOi8wYmVKiLyq+Cdew==', $key).PHP_EOL;
} catch(Exception $e) {
    var_dump($e->getMessage());
}

压缩或解压文件

<?php

use johnxu\tool\Zip;

$zip = Zip::getInstance();

// 压缩
$filename = $zip->zzip('./');
if (!$filename) {
    var_dump($zip->getError());
} else {
    var_dump($filename);
}

// 解压
$list = $zip->unzip('./test.zip', './test/');
if (!$list) {
    var_dump($zip->getError());
} else {
    var_dump($list);
}