分类 PHP 下的文章

curl函数post、get数据速度非常慢的处理办法

实际项目中使用curl进行数据请求,访问速度异常的慢,基本上要5s以上的时间,最终通过以下设置得以解决。

//curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); //强制协议为1.0
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Expect:']); //头部要送出'Expect: '
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); //强制使用IPV4协议解析域名

登录页AES加密提交帐号密码信息

前端参考代码如下,后台PHP代码参考上篇文章。

其中,key为后台动态生成的16位随机字符串并写入cache中,登录验证verify方法中需先判断此key的缓存是否存在。

引入相关js:

<script src="{__PLUG_PATH}crypto-js/core.js"></script>
<script src="{__PLUG_PATH}crypto-js/cipher-core.js"></script>
<script src="{__PLUG_PATH}crypto-js/aes.js"></script>
<script src="{__PLUG_PATH}crypto-js/mode-ecb.js"></script>
<script src="{__PLUG_PATH}crypto-js/enc-base64.js"></script>

登录操作:

form.on('submit(login)', function(obj){
    let data = obj.field;
    let key = CryptoJS.enc.Utf8.parse(data.key);
    let password = CryptoJS.enc.Utf8.parse(data.password);
    let encrypted = CryptoJS.AES.encrypt(password, key, {iv:key, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7});
    var hexStr = encrypted.ciphertext.toString();
    var oldHexStr = CryptoJS.enc.Hex.parse(hexStr);
    let base64 = CryptoJS.enc.Base64.stringify(oldHexStr);
    data.password = base64;

    $.ajax({
        url: "{:url('verify')}"
        ,data: data
        ,method: "POST"
        ,dataType: "json"
        ,success: function(res){
            if(res.code == 200){
                layer.msg('登录成功', {time: 1000}, function(){
                    location.href = "{:url('index/index')}";
                });
            }else{
                //重置验证码
                $('#vercode').trigger('click');
                $('#code').val('');
                layer.msg(res.msg, {time: 2000});
            }
        }
    });
});

AES加密、解密类

<?php
/**
 * Desc: AES加密解密
 * User: SenSen Wechat:1050575278
 * Date: 2021/4/27
 * Time: 14:14
 */

namespace sensen\services;

class AesService
{
    protected static $method = "AES-128-CBC";
    const KEY = 'fei1zui2you3jie!';
    const IV = 'hello202105world';

    /**
     * 加密
     * @param string|array $data 待加密
     * @param string $key 秘钥
     * @param string $iv 偏移量
     * @return string|string[]|array
     */
    public static function encrypt($data, $key=self::KEY, $iv=self::IV)
    {
        if(is_array($data)){
            $res = [];
            foreach ($data as $v){
                $text = openssl_encrypt($v, static::$method, $key, OPENSSL_RAW_DATA, $iv);
                $res[] = self::safetyBase64Encode($iv . $text);
            }
        }else{
            $text = openssl_encrypt($data, static::$method, $key, OPENSSL_RAW_DATA, $iv);
            $res = self::safetyBase64Encode($iv . $text);
        }
        return $res;
    }

    /**
     * 解密
     * @param string|array $text 待解密
     * @param string $key 秘钥
     * @param string $iv 偏移量
     * @param false $login 是否为登录
     * @return false|string|array
     */
    public static function decrypt($text, $key=self::KEY, $iv=self::IV, $login=false) {
        if(is_array($text)){
            $data = [];
            foreach ($text as $v){
                $cipherText = self::safetyBase64Decode($v);
                $cipherText = substr($cipherText, strlen($iv));
                $data[] = openssl_decrypt($cipherText, static::$method, $key, OPENSSL_RAW_DATA, $iv);
            }
        }else{
            $cipherText = self::safetyBase64Decode($text);
            if($login){
                //仅方便登录使用,登录时iv与key相同
                $data = openssl_decrypt(base64_decode($text), static::$method, $key, OPENSSL_RAW_DATA, $iv);
            }else{
                $cipherText = substr($cipherText, strlen($iv));
                $data = openssl_decrypt($cipherText, static::$method, $key, OPENSSL_RAW_DATA, $iv);
            }
        }

        return $data;
    }

    /**
     * base64安全编码
     * @param string $text
     * @return string|string[]
     */
    public static function safetyBase64Encode($text)
    {
        $text = base64_encode($text);
        $text = str_replace(['+','/'],['-','_'],$text);
        return $text;
    }

    /**
     * base64安全解码
     * @param string $text
     * @return false|string
     */
    public static function safetyBase64Decode($text)
    {
        $text = str_replace(['-','_'],['+','/'],$text);
        $text = base64_decode($text);
        return $text;
    }

}

trim汉字导致乱码解决

汉字trim时可能导致乱码,如:
trim("张三、李言、", "、");
解决:

/**
 * 中文trim 解决中文trim乱码
 * @param $string
 * @param string $trim_chars
 * @return string|string[]|null
 */
function mb_trim($string, $trim_chars = '\s'){
    return preg_replace('/^['.$trim_chars.']*(?U)(.*)['.$trim_chars.']*$/u', '\\1',$string);
}

根据用户ID生成唯一邀请码

通过用户ID生成唯一邀请码,可以省去入库查询等操作。

加密:

function createCode($user_id) {

    static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';

    $num = $user_id;

    $code = '';

    while ( $num > 0) {

        $mod = $num % 35;

        $num = ($num - $mod) / 35;

        $code = $source_string[$mod].$code;

    }

    if(empty($code[3]))

        $code = str_pad($code,4,'0',STR_PAD_LEFT);

    return $code;

}

解密:

function decode($code) {

    static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';

    if (strrpos($code, '0') !== false)

        $code = substr($code, strrpos($code, '0')+1);

    $len = strlen($code);

    $code = strrev($code);

    $num = 0;

    for ($i=0; $i < $len; $i++) {

        $num += strpos($source_string, $code[$i]) * pow(35, $i);

    }

    return $num;

}

windows PHP安装APCu扩展

APCu 前身是 APC,一个免费开源且应用很广的字节码和对象缓存软件。APC分为系统缓存和用户缓存:
1、系统缓存是指PHP执行时增加缓存,减少PHP文件的反复检查和编译,从而达到系统加速的目的。
2、用户缓存是指,PHP代码中将数据写入缓存,是用户写入的数据,通过key和value的键值方式插入和读取。这种数据叫用户缓存。

PHP5.5以后,opcache代替APC做为PHP加速的位置,也就是代替其系统缓存的位置。并将用户缓存功能独立出来,开启新的组件,叫APCu。

其他可选缓存方案:redis/memcache:如果要做分布式存储可以使用,否则不推荐使用,因为redis/memcache需要tcp通信,即使本地也需要unix domain socket通信,其效率远不如共享内存的apcu。

- 阅读剩余部分 -

phpword添加批注注释信息

$phpWord = \PhpOffice\PhpWord\IOFactory::load("/test/test1.docx");

//创建注释
$comment= new \PhpOffice\PhpWord\Element\Comment('森森', new \DateTime(), 'my_initials');
$comment->addText('这是批注的信息内容', array('bold' => false, 'color'=>'ff0000'));

//添加到注释
$phpWord->addComment($comment);

$section = $phpWord->getSection(0);

//创建文本并添加注释
$textrun = $section->addTextRun();
$textrun->addText('这里需要进行');
$text = $textrun->addText('注释');
//将注释链接到刚创建的文本上
$text->setCommentRangeStart($comment);
//也可以为注释设置起始位置
//$comment->setStartElement($text);

//原始文本添加注释

//导出注释版
$phpWord->save("/test/test2.docx");

1111.png