2024年07月30日
随着代码安全的普及,越来越多的开发人员知道了如何防御sqli、xss等与语言无关的漏洞,但是对于和开发语言本身相关的一些漏洞和缺陷却知之甚少,于是这些点也就是我们在Code audit的时候的重点关注点。本文旨在总结一些在PHP代码中经常造成问题的点,也是我们在审计的时候的关注重点。(PS:本文也只是简单的列出问题,至于造成问题的底层原因未做详细解释,有兴趣的看官可以自行GOOGLE或者看看底层C代码。知其然,且知其所以然)
2024年07月30日
数据网格(datagrid)的虚拟滚动特性可以用来显示大数量的记录而不需要分页。 当滚动垂直滚动条时,数据网格(datagrid)执行 ajax 请求来加载和刷新现有的记录。 整个刷新的行为过程是平稳的没有闪烁。 在本教程中,我们将创建一个数据网格(datagrid),并运用虚拟滚动特性从服务器加载数据。
2024年07月30日
今天研究了游戏中合成物品的概率问题,刚开始在网上搜了相关的资料,也看了好多别人的概率算法,但都不怎么明白,也不能满足我的要求。于是自己看了一些概率算法,也在qq群里请教了一些高人
自己写了以下的算法:
第一步是传入一个概率参数我这里给了一个80的
$rate = 80;//值越高,概率就越高
2024年07月30日
阿里云oss作为一个非常好用的一个存储服务, 一般作为一些静态资源的存储,如web开发中的css、js图片等或者是客户上传的附件、图片等。今天我们来实现一个非主流的用法:用他来记录日志.
这得益于阿里云oss的"追加上传文件"接口,这样我们不需要每次获取oss上的文件内容后再手动日志内容然后后上传文件。
2024年07月30日
需要您的鼓励!
【欢迎关注、分享、点赞或评论,您的一个举手之劳,就是最大的鼓励!】
前言:
上一节我们聊了php的数据类型,主要是整型、浮点型、布尔型,字符串型和NULL这五种类型,其他类型暂时不聊天。
2024年07月30日
/** * 添加锁 * @param unknown $key_name 键的名称 * @param unknown $uniqid 唯一值 * @param unknown $key_expire 键的过期时间 * @return int 0失败,1成功 */ static function lock($key_name, $uniqid, $key_expire) { $lua_script = <<<EOF local flag = redis.call("setnx", KEYS[1], ARGV[1]) if tonumber(flag) > 0 then redis.call('expire', KEYS[1], ARGV[2]) return redis.call('get', KEYS[1]) else return 0 end EOF; $redis = MyRedisService::getInstance(); return $redis->eval($lua_script, 1, $key_name, $uniqid, $key_expire); } /** * 释放锁 * @param unknown $key_name 键名称 * @param unknown $key_val 键值校验 * @return int 0失败,1成功 */ static function unlock($key_name, $key_val) { $lua_script = <<<EOF local lockKey = redis.call('get', KEYS[1]) local lk = ARGV[1] if lockKey == lk then return redis.call('del', KEYS[1]) else return 0 end EOF; $redis = MyRedisService::getInstance(); return $redis->eval($lua_script, 1, $key_name, $key_val); } public function index() { //键名 $key_name = 'index'; //key过期时间 $key_expire = 1; //键的唯一标识 $uniqid = uniqid(null, true).microtime(); //加锁 $key_val = self::lock($key_name, $uniqid, $key_expire); //加锁成功,开始执行以下代码 if($key_val > 0) { try { $redis = MyRedisService::getInstance(); //从数据库或者redis中得到库存 $store_nums = $redis->get("store_nums"); if($store_nums > 0) { $redis->decrby("store_nums", 1); echo "去库存成功,剩余:".$redis->get('store_nums')."<br>"; } else { echo "库存不足<br>"; } } catch (\Exception $e) { //如果代码抛出异常,则直接删除key $redis->del($key_name); } } //释放锁 $res = self::unlock($key_name, $key_val); //如果释放锁失败,则直接手动删除key if(intval($res) === 0) { $redis->del($key_name); } }