Switch language
zh
Switch theme
Light
  • php-json_encode-报错-Malformed-UTF-8-characters

    当使用了 substr() 进行字符串切割后, 再进行 json_encode() 时, 报错 改使用 mb_substr() 即可 原因: substr 按字节数进行截取产生了特殊字符, 而 mb_substr 按字符数截取, 则没有问题
  • php-substr-截取中文出乱码

    使用 mb_substr 解决即可, mb_substr 按字符来截取 而 substr 按字节来截取
  • php文件上传临时目录

    问题: 在上传表单中, 用户没有继续进行保存下去, 那么图片(或文件)会一直保存下去 ? 在 php.ini 中, php官方文档 (语言参考->特点->文件上传处理->post方法上传): 文件被上传后,默认地会被储存到服务端的默认临时目录中,除非 php.ini 中的 upload_tmp_dir 设置为其它的路径。服务端的默认临时目录可以通过更改 PHP 运行环境的环境变量 TMPDIR 来重新设置,但是在 PHP 脚本内部通过运行 putenv() 函数来设置是不起作用的。该环境变量也可以用来确认其它的操作也是在上传的文件上进行的。 了解Redis过期策略及实现原理. 我们在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期。 当我们设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的。 redis设置过期时间: expire key time(以秒为单位)–这是最常用的方式 setex(String key, int seconds, String value)–字符串独有的方式 除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间 如果没有设置时间,那缓存就是永不过期 如果设置了过期时间,之后又想让缓存永不过期,使用persist key 三种过期策略 定时删除 含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除 优点:保证内存被尽快释放 缺点:若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key. 定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重 懒汉式式删除 含义:key过期的时候不删除,每次通过key获取值的时候去检查是否过期,若过期,则删除,返回null。 优点:删除操作只发生在通过key取值的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了) 缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存) 定期删除 含义:每隔一段时间执行一次删除过期key操作 优点:通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用–处理”定时删除”的缺点 缺点:在内存友好方面,不如”定时删除”(会造成一定的内存占用,但是没有懒汉式那么占用内存) 在CPU时间友好方面,不如”懒汉式删除”(会定期的去进行比较和删除操作,cpu方面不如懒汉式,但是比定时好) 难点:合理设置删除操作的执行时长(每次删除执行多长时间)和执行频率(每隔多长时间做一次删除)(这个要根据服务器运行情况来定了),每次执行时间太长,或者执行频率太高对cpu都是一种压力。每次进行定期删除操作执行之后,需要记录遍历循环到了哪个标志位,以便下一次定期时间来时,从上次位置开始进行循环遍历 说明:memcached只是用了惰性删除,而redis同时使用了惰性删除与定期删除,这也是二者的一个不同点(可以看做是redis优于memcached的一点);对于懒汉式删除而言,并不是只有获取key的时候才会检查key是否过期,在某些设置key的方法上也会检查(eg.setnx key2 value2:该方法类似于memcached的add方法,如果设置的key2已经存在,那么该方法返回false,什么都不做;如果设置的key2不存在,那么该方法设置缓存key2-value2。假设调用此方法的时候,发现redis中已经存在了key2,但是该key2已经过期了,如果此时不执行删除操作的话,setnx方法将会直接返回false,也就是说此时并没有重新设置key2-value2成功,所以对于一定要在setnx执行之前,对key2进行过期检查)。 Redis采用的过期策略 懒汉式删除+定期删除 懒汉式删除流程: 在进行get或setnx等操作时,先检查key是否过期; 若过期,删除key,然后执行相应操作; 若没过期,直接执行相应操作; 定期删除流程(简单而言,对指定个数个库的每一个库随机删除小于等于指定个数个过期key) 遍历每个数据库(就是redis.conf中配置的”database”数量,默认为16) 检查当前库中的指定个数个key(默认是每个库检查20个key,注意相当于该循环执行20次,循环体是下边的描述) 如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历 随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key 判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。 对于定期删除,在程序中有一个全局变量current_db来记录下一个将要遍历的库,假设有16个库,我们这一次定期删除遍历了10个,那此时的current_db就是11,下一次定期删除就从第11个库开始遍历,假设current_db等于15了,那么之后遍历就再从0号库开始(此时current_db==0)
  • lnmp-环境中-使用-system-函数被报安全因素无法启用

    原因: 要在 php 中使用 mysqldump 进行数据库备份 在本地 wamp 环境中使用没有问题 在线上 lnmp 环境下报错 system 函数无法使用 解决办法: 查看线上 php.ini 文件是否开启 safe_mode (安全模式); 2.1.1 如果开启了 安全模式, 则查看 disable_function 是否禁用了 system 函数 2.1.2 如果 disable_function 是禁用了 system 函数, 那么取消禁用, 并在 safe_mode_exec_dir 中添加一个包含要执行命令的目录 2.2.1 如果未开户安全模式, 直接查看 disable_function 是否禁用了 system 函数, 取消掉即可
  • php-json_decode-函数

    json_decode 把 json 字符串转成 object 或 array $str = '{"id":1, "name":"hello"}'; $obj = json_decode($str); // 转成对象 $arr = json_decode($str, true);// 转成数组 // 要求 // json 字符串中的键值必须用 双引号("") 包裹起来, 单引号或者不用引号都不能正确解析, 结果会是 null
  • php-trait-的优先级

    <?php trait Demo1{ public function test(){ return __METHOD__; } } trait Demo2{ public function test(){ return __METHOD__; } } class Demo0{ public function test(){ return __METHOD__; } } class Demo extends Demo0{ use Demo1,Demo2{ Demo1::test insteadof Demo2; // tait1中的test方法优先于trait2中的test方法(如果不这么设置,同名的方法会导致报错) Demo2::test as demo2test; // trait2 的test方法别名为 trait2test } } $obj = new demo(); $obj->test();// Demo1::test $obj->demo2test();// Demo2::test trait ,当前类,父类优先级: 当前类方法 > trait 的方法 > 父类的方法 如果当前类引用了两个 trait, 并且这两个 trait 中有同名方法,则会报错, 可以使用 insteadof 指定使用哪个trait的方法, 此外还可以用 as 来设置别名, 从而供当前类使用
  • 正则表达式-cheat-sheet-from-github

    转载自: https://github.com/niklongstone/regular-expression-cheat-sheet.git Regular Expression Cheat Sheet - PCRE Anchor Description Example Valid match Invalid ^ start of string or line ^foam foam bath foam \A start of string in any match mode \Afoam foam bath foam $ end of string or line finish$ finish finnish \Z end of string, or char before last new line in any match mode finish\Z finish finnish \z end of string, in any match mode.
  • openssl-加密函数

    后台使用密码保存时, 使用 md5, 不可解密; 如今想给一个登录 token 加密, 原始做法是用 md5+一定数量的字符串, 并且在缓存(或数据库)中保存这个键值对; 如果不想在后台保存 token 信息, 可以把 token信息(包括过期时间,用户账号等) 使用 open_ssl 加密, 然后要在后台要验证的时候, 再解密出来 例如 <?php $key = 'key123456789';//加密字符串的密码, 类似于md5加盐 $method = 'AES-128-CBC';// 加密方法 $arr = ['user_id'=>1, 'expire_time'=>60*60]; // 用户id为1, 有效期为1h $str = json_encode($arr); $secret_str = openssl_encrypt($str,$method,$key);// 加密字符串 $secret_str = urlencode($secret_str);// 加密字符串 var_dump($secret_str);// jRX%2BtqOyhHVOzHX7cFI0usMUs7qKH4uEaOqKkdBQ2A08C1FmRRGXWFBfCleJPu3i $origin_str = urldecode($secret_str); $origin_str = openssl_decrypt($origin_str,$method,$key);// 解密字符串 var_dump($origin_str);// {"user_id":1,"expire_time":3600} var_dump(json_decode($origin_str));// ["user_id"=>1,"expire_time"=>3600] // 加密 openssl_encrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string &$tag = NULL [, string $aad = "" [, int $tag_length = 16 ]]]]] ) : string // 解密 openssl_decrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string $tag = "" [, string $aad = "" ]]]] ) : string // data // The encrypted message to be decrypted.
  • nginx-反向代理

    正向代理是 客户端向指定的服务器发起请求, 客户是隐藏的; 反向代理, 则是隐藏了多个服务器, 由代理服务器决定向(集群服务器组)哪个服务器发起请求 参考自: https://blog.csdn.net/tsummerb/article/details/79248015
  • phpqrcode-生成的图片转为-base64-格式输出

    原文见: https://www.pusonglin.cn/work/1619.html 项目中需要用到phpqrcode生成二维码,但是通过QRcode::png()生成的是显示输出当前的照片流,这样就不适用于列表显示多个二维码的需求了。网上也有相关的一些解决方案:通过把照片流缓存,然后进行base64编码。 找到生成图片用到了QRimage类的png方法,去除里面的:Header(“Content-type: image/png”);即可。 class QRimage { //---------------------------------------------------------------------- public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) { $image = self::image($frame, $pixelPerPoint, $outerFrame); if ($filename === false) { // Header("Content-type: image/png"); ImagePng($image); } else { if($saveandprint===TRUE){ ImagePng($image, $filename); header("Content-type: image/png"); ImagePng($image); }else{ ImagePng($image, $filename); } } ImageDestroy($image); } 如此,不再让输出端整个页面变为图片类型,解决方案并不完美,但是能达到我的目的即可。 附调用端代码: <?php global $_W,$_GPC; function getqrcode($url){ require_once MODULE_ROOT.'/lib/phpqrcode_web.php'; $value = $url; //二维码内容 $errorCorrectionLevel = 'L'; //容错级别 $matrixPointSize = 5; //生成图片大小 //生成二维码图片 ob_start(); QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2); $imgstr = base64_encode(ob_get_contents()); ob_end_clean(); return $imgstr; } //调用查看结果 include $this->template('web/test'); ?
🍀