扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
先创建一个php页面,例如叫doup.php,在其中穿件一个form:
成都创新互联是一家企业级云计算解决方案提供商,超15年IDC数据中心运营经验。主营GPU显卡服务器,站群服务器,成都服务器托管,海外高防服务器,服务器机柜,动态拨号VPS,海外云手机,海外云服务器,海外服务器租用托管等。
form enctype="multipart/form-data" action="doup.php" method="POST"
lable
input name="sdd" type="text" /
input name="sdd" type="submit" value="提交"/
/lable
/form
?php
$conn=mysql_connect("localhost","root","123")or die("连接错误".mysql_error());
mysql_select_db("数据库名",$conn);
$myvalue=$_post["sdd"];
$sql="insert into dfgghy(myvalue) value('$myvalue')";
$re=mysql_querry($sql);
?
如果拥有较高的服务器权限,可以开个定时器在服务器上执行,但是如果是租用虚拟主机空间的话,可以用PHP模拟定时器功能。
1、先给m添加一个上次更改的时间字段,比如change_at,数据类弄推荐int或者timespan,用int会比较好,因为可以用php的time()来取时间对比。
2、定义一个函数get_m(),每次要取m值的时候都通过这个函数取。在取值之前对m进行操作:
function get_m()
{
$now = time();
$change_at = get_change_at();//取得change_at的值,函数自己去写。
$m = read_m();//取得数据库内的真实数值
$time_span = $now - $change_at;
//没有达到更新条件,直接返回;
if ($time_span 180)
return $m;
$m += floor($time_span / 180);
$change_at += (floor($time_span/180) * 180);
//将新的m和change_at写入数据库
save_m($m,$change_at);
return $m;
}
其中的几个函数read_m(),get_change_at(),save_m()根据具体的数据库结构写功能,也可以不要用函数直接把数据库操作代码写在那边。
这样就能保证每次程序取到的值和数据库自动更改的情况下是一样的。
MYSQL 有事物功能,可以定时自动更新数据库。
但是经常,你根本就没有这个权限。
------------
一般的思路是这样,这件事,让php 去做,我们假设每天至少有一个用户访问你的网站,
那么就做一个判断,如果是 第一个用户,那么 就让 php 去更新一下,然后今天就不再更新。
这样的优点是很简单,方便,
缺点是第一个用户会稍微有一点点慢。
以前我用过querylist插件抓数据,服务器写和定时器,每天固定时间去运行脚本。朝这个方式试试
高并发下数据的更新,应该 update table xxx set num = num - 1 的方式,这种方式可以保证数据的正确性。
但是会出现 num 为负数的问题,如果库存为负数,显然是不合理的。
于是,需要将 num 字段设置为 无符号整型,这样就不会出现负数了,因为,如果减到负数,就会更新失败。
但是这种依然会造成很多无用的更新语句的执行,是不合理的。
于是,update table xxx set num = num - 1 where num 0,
这样当 num 等于0之后就不会去更新数据库了,减少了很多无用的开销。
这种方式被称作“乐观锁”
此外,对于抢红包这种非整数的操作,我们应该转换为整数的操作。
关于抢购超卖的控制
一般抢购功能是一个相对于正常售卖系统来说独立的子系统,这样既可以防止抢购时的高并发影响到正常系统,
也可以做到针对于抢购业务的特殊处理。
在后台设计一些功能,可以就昂正常的商品加入到抢购活动中并编辑成为抢购商品,写入到抢购商品表,当然
也可以把抢购商品表写入redis而不是数据表。并且在原商品表写入一个同样的商品(id相同,用于订单查看,
此商品不可购买)
如果是数据表,为了控制超卖,需要对表进行行锁,更新的时候带上 where goods_amount 0。
如果是redis,使用 hincrby 一个负数来减库存,并且 hincrby 会返回改变后的值,再来判断返回值是否大于0,
因为redis每个命令都是原子性的,这样不用锁表就可控制超卖。
ignore_user_abort();// 让浏览器断开也可以执行
set_time_limit(30);// 0 表示无限的执行下去,PHP 系统默认为 30s
echo 'Testing connection handling in PHP';
while(1)
{
// Did the connection fail?
// if(connection_status() != CONNECTION_NORMAL)
// {
// break;
// }
$filename = 'key.txt';
$somecontent = date("Y-m-d H:m:s") . "\n";
// 首先我们要确定文件存在并且可写。
if (is_writable($filename)) {
// 在这个例子里,我们将使用添加模式打开$filename,
// 因此,文件指针将会在文件的开头,
// 那就是当我们使用fwrite()的时候,$somecontent将要写入的地方。
if (!$handle = fopen($filename, 'a')) {
echo "不能打开文件 $filename";
exit;
}
// 将$somecontent写入到我们打开的文件中。
if (fwrite($handle, $somecontent) === FALSE) {
echo "不能写入到文件 $filename";
exit;
}
echo "成功地将 $somecontent 写入到文件$filename";
fclose($handle);
} else {
echo "文件 $filename 不可写";
}
// Sleep for 10 seconds,等 10s 再执行
sleep(5);
}
你可以参考一下,我以前的一段代码
jquery+ajax可以很容易实现啊,通过settimeout(function(),5)去触发函数就行,与通过点击发送请求没区别啊。
setInterval(function(){
jQuery.ajax({
type:"POST",
url:"111.php",
global:false,
dataType:"json",
data:"action=ajax",
success:function(data){
jQuery("p").html(data.shopid);
},
error:function()
{
alert("err:操作错误");
}
})
}, 2000);
php部分更简单
if($_POST['action']=='ajax'){
$result=$db-get_one("select * from shtq_shop order by rand() limit 1");
echo json_encode($result);exit;
}
原理很简单 setInterval() 定时执行一个ajax,后台部分执行数据库查询 获得json格式数组
通过回调函数将返回的内容插入到p/p中
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流