首页 > 编程学习

memcached内存分配机制

内存碎片化问题

memcached slab allocator

基本原理:预先把内存划分成数个slab仓库,各仓库,切分成不同尺寸的小块,需要存内容时,判断内容的大小,为其选取合理的块。

警告:如果有100byte的内容要存,但122大小的仓库中的chunk满了怎么办? 阅读全文

CSS初始化是针对不同浏览器对相同标签和样式在渲染时表现出不同的显示效果而推出的一种解决措施,根据查询CSS重置(重设)、CSS RESET表示的是同一个意思。

在HTML标签在浏览器里有默认的样式,例如 p 标签有上下边距,strong标签有字体加粗样式,em标签有字体倾斜样式。不同浏览器的默认样式之间也会有差别,例如ul默认带有缩进的样式,在IE下,它的缩进是通过margin实现的,而Firefox下,它的缩进是由padding实现的。在切换页面的时候,浏览器的默认样式往往会给我们带来麻烦,影响开发效率。所以解决的方法就是一开始就将浏览器的默认样式全部去掉,更准确说就是通过重新定义标签样式。“覆盖”浏览器的CSS默认属性。最最简单的说法就是把浏览器提供的默认样式覆盖掉!这就是CSS reset。

——摘自百度百科 reset.css词条

阅读全文

function timediff($begin_time,$end_time)
{
     if($begin_time < $end_time){
        $starttime = $begin_time;
        $endtime = $end_time;
     }
     else{
        $starttime = $end_time;
        $endtime = $begin_time;
     }
     $timediff = $endtime-$starttime;
     $days = intval($timediff/86400);
     $remain = $timediff%86400;
     $hours = intval($remain/3600);
     $remain = $remain%3600;
     $mins = intval($remain/60);
     $secs = $remain%60;
     $res = array(“day” => $days,”hour” => $hours,”min” => $mins,”sec” => $secs);
     return $res;
}

在做微信开发的时候,由于微信内置浏览器的封闭性,经常会出现代码已经修改但是在微信中打开还是缓存了旧的页面。对开发者来说这是一件非常让人恼火的事情。下面说一下解决办法吧,虽然说不上完美但不用清数据,也不用卸载并重装微信,凑合着用还是可以的。

方法一:

通过给js、css和image资源改名或增加版本号的方式来解决,页面样式不变化大多是外部文件被缓存,改名的效果很好,但是不方便。版本号的方法还可以。下面详细说一下,例如以下代码为外部引用的文件:

  1. <link rel=“stylesheet” href=“main.css?ver=1.0″ /> 
  2. <script src=“js/rendered.js?ver=1.0″></script> 

每次对文件进行修改后,把ver后的1.0改为1.1,下次改为1.2等等,这样每次页面打开的连接都不一样,就会重新请求外部文件了

方法二:

通过改写meta防止页面缓存,代码如下,直接放在header部分就可以了

  1. <meta http-equiv=“Cache-Control” content=“no-cache, no-store, must-revalidate” />  
  2. <meta http-equiv=“Pragma” content=“no-cache” />  
  3. <meta http-equiv=“Expires” content=“0” />  

相信大家都见过在微信朋友圈或者和好友聊天时看到别人分享的内容,有自定义标题、自定义图标、自定义描述和自定义的跳转地址。

以前都是通过微信内置API——WeixinJSBridge中部分未完全被腾讯官方屏蔽的接口来实现的,本站前面也有过介绍http://www.waiting8.com/app-sharing-to-friends-to-send-to-a-friend-code.html

   2015年元旦发现前几天做的项目设置好的微信分享代码没效果,分享时默认拉取了网页中的第一张图片,描述信息的地方显示是当前网页的地址,仔细检查了一下发现代码没有报错。然后找了其他几个微信网页测试出现了同样的问题,初步怀疑是接口禁用了(当然这个是除了腾讯自家和他家的战略合作伙伴之外的)。

   今天去公司和同事找了好几台手机测试,效果一样,除了部门老大分享正常,后来发现跟微信版本号有关,没有测试IOS,安卓手机微信6.0.2版本存在这个问题,以下分享正常。
    去网上搜了下,这个情况应该是从2014年12月30或者31号就开始了,可能与12月30日微信公众平台发布的系统公告微信公众平台关于整顿诱导分享及诱导关注行为的公告有关,目前没有太完美的解决办法,影响面也比较大。

目前网传的这几个情况貌似比较可信:
1、有网友给出咨询腾讯在线客服客服给出的解释:

相关情况是由于我司升级系统导致,现在工作人员正在抢修。请耐心等待。还说是刚刚技术那边过来通知才知道这个情况。

2、QQ群内官方人员给出的解释:
关于自定义分享功能失效的申明
旧版的获取分享状态及设置分享内容的JS接口一直用于内部业务,并未对外开放,在微信公开的开放文档里面并没有此接口。某些第三方借助微信客户端漏洞在未获得权限的情况下使用接口,微信6.0.2版本对此漏洞做了修复以确保用户分享内容的准确性,避免诱导分享。另外,此接口不久将会公布开放规则向公众号开放。
3、网友猜测:

微信未应对微信公众平台关于整顿诱导分享及诱导关注的行为,建立了一个白名单,只有白名单内的域名可以正常调用该接口。后期或许会公开相关接口和接入规则,但目前先把接口给封了。(这做法有点操蛋)

可以确定的是是腾讯官方禁用了微信分享API接口

目前的影响范围:

1、微信分享设置的描述信息失效

2、微信分享设置的描述信息失效

3、分享缩略图设置会失效

4、无法自定义分享后点击的连接

5、微信分享成功后的触发器失效

6、微信客户端6.0.2以上版本受影响

临时的解决办法:
1、博主Alien通过反编译微信安卓客户端获取asserts/jsapi/wxjs.js分析研究后给出了新的hack方法,可以直接去WeixinApi项目主页获取最新源码

传送门

2、可间接设置分享的标题和缩略图,描述信息无解

在body开始时,隐藏一个 300X300的图片,微信会首选这个图片作为分享缩略图

例如:

<div style=”display:none ”>

<img src=””>

</div>

分享标题直接修改头部title标签中的标题

软件简介

SQLyog是业界著名的Webyog公司出品的一款简洁高效、功能强大的图形化MySQL数据库管理工具。使用SQLyog可以快速直观地让您从世界的任何角落通过网络来维护远端的MySQL数据库。
SQLyog相比其它类似的MySQL数据库管理工具其有如下特点:
1、基于C++和MySQLAPI编程;
2、方便快捷的数据库同步与数据库结构同步工具;
3、易用的数据库、数据表备份与还原功能;
4、支持导入与导出XML、HTML、CSV等多种格式的数据;
5、直接运行批量SQL脚本文件,速度极快;
6、新版本更是增加了强大的数据迁移
ps:
据说该软件在批量执行插入语句时,相对navcat更快速
包含X64和X86版本
内置多国语言

基本功能

  1. 快速备份和恢复数据。
  2. 以GRID/TEXT格式显示结果。
  3. 支持客户端挑选、过滤数据。
  4. 批量执行很大的SQL脚本文件。
  5. 快速执行多重查询并能够返回每页超过1000条的记录集,而这种操作是直接生成在内存中的。
  6. 程序本身非常短小精悍!压缩后只有348 KB。
  7. 完全使用MySQL C APIs程序接口。
  8. 以直观的表格界面建立或编辑数据表。
  9. 以直观的表格界面编辑数据。
  10. 进行索引管理。
  11. 创建或删除数据库。
  12. 操纵数据库的各种权限:库、表、字段。
  13. 编辑BLOB类型的字段,支持Bitmap/GIF/JPEG格式。
  14. 输出数据表结构/数据为SQL脚本。
  15. 支持输入/输出数据为CSV文件。
  16. 可以输出数据库清单为HTML文件。
  17. 为所有操作建立日志。
  18. 个人收藏管理操作语句。
  19. 支持语法加亮显示。
  20. 可以保存记录集为CSV、HTML、XML格式的文件。
  21. 99%的操作都可以通过快捷键完成。
  22. 支持对数据表的各种高级属性的修改。
  23. 查看数据服务器的各种状态、参数等。
  24. 支持更改数据表类型为ISAM、MYISAM、MERGE、HEAP、InnoDB、BDB。
  25. 刷新数据服务器、日志、权限、表格等。
  26. 诊断数据表–检查、压缩、修补、分析。

链接: http://pan.baidu.com/s/1qWpzFKo 密码: szww

支付宝即时到帐接口在商户服务器与支付宝服务器进行数据交互的时候需要进行数据前面,主要目的是为了防止数据在传输过程中被恶意窜改。

所谓签名即根据即时到帐交易接口文档中的请求参数列表中,除去 sign、sign_type 两个参数外,其他需要使用到的参数按照从 a 到 z 的顺序排序(若遇到相同首字母,则看第二个字母,
以此类推),然后将拼接成的字符串与支付宝密钥拼接,再进行MD5运算(以md5类型的签名举例说明)。得到的32位字符就是签名结果字符串。

在即时到帐交易中一共需要进行两次签名:

第一次是支付前构造支付数据,需要将支付参数和签名结果字符串用POST方式提交到支付宝网关https://mapi.alipay.com/gateway.do

第二次是支付成功后支付宝服务器通过return_url和notify_url进行同步通知和异步通知时会向商户服务器分别用get方式和post方式发送支付结果处理数据,商户服务器需要根据接受到的数据和签名信息判断该消息是否为支付宝服务器发送的,并根据结果和状态对商户本地程序操作相关的业务逻辑

不幸的是在项目中两次需要验证签名的地方都出了问题,下面讲一下我遇到的状况和解决方法

支付前构造支付数据的签名错误

我是直接使用支付宝官方提供的demo进行开发的,首先在本地跑了一下没有问题,放在服务器环境后进行支付直接跳转到支付宝的错误页面。

错误代码:ILLEGAL_SIGN 错误信息:调试错误,请回到请求来源地,重新发起请求

支付宝商家帮助中心也简明扼要的给出了解决和排查办法:https://cshall.alipay.com/support/help_detail.htm?help_id=397063

我这里是使用utf-8格式的php编写程序,经过排查是在POST提交这一步中文的商品名乱码导致的签名错误

解决方式一:

打开alipay_submit.class.php,找到以下代码(99行左右)

Code   ViewCopyPrint
  1. $sHtml = “<form id=’alipaysubmit’ name=’alipaysubmit’ action='”.$this->alipay_gateway_new.”_input_charset=”.trim(strtolower($this->alipay_config[‘input_charset’])).”‘ method=’“.$method.”>“;

替换为

Code   ViewCopyPrint
  1. $sHtml = “<meta http-equiv=’content-type’ content=’text/html; charset=utf-8′><form id=’alipaysubmit’ name=’alipaysubmit’ action='”.$gateway.”_input_charset=”.trim(strtolower($aliapy_config[‘input_charset’])).”‘ method=’“.$method.”>“;

解决方式二:

在相应的PHP页面声明编码类型为utf-8即可

Code   ViewCopyPrint
  1. header(“content-type: text/html;charset=utf-8″);

支付成功后消息通知中的签名不一致
对于消息通知签名不正确支付宝商户帮助中心也给出了解决和排查办法:https://cshall.alipay.com/support/help_detail.htm?help_id=397351

经过查找资料,网友们给出了几种常见的错误类型:

第一种情况:由于编码导致中文传回是乱码的情况导致sign和mysign不等。可参考这篇文章的案例

http://www.imlqw.com/322.html(目前连接已经失效)

第二种情况:由于post和get提交的问题导致sign和mysign不等,可参考以下文章:

http://my.oschina.net/u/214582/blog/52140

第三种情况:由于官方提供的paraFilter方法bug问题导致sign和mysign不等,可参考一下文章:

http://club.alipay.com/read-htm-tid-10244623-page-e.html

第四种情况:由于参数问题导致的sign和mysign不等的情况。

在PHP的默认配置情况下,当上传的文件大小超出一定的限制时(通常默认为8M),我们将得到如下的错误提示信息:

Warning: POST Content-Length of 625523488 bytes exceeds the limit of 8388608 bytes in Unknown on line 0

上述错误信息的大致意思是,我们使用POST请求提交的数据大小超过了服务器的最大限制数(8388608字节=8MB)。

出现上述错误的原因是,在PHP的配置文件php.ini中,默认存在如下配置信息(在php.ini中,行首的分号”;”表示当前行是注释,不会生效):

//脚本解析输入数据(类似 POST 和 GET)允许的最大时间,单位是秒。 它从接收所有数据到开始执行脚本进行测量的。
max_input_time = 60
//允许客户端单个POST请求发送的最大数据
post_max_size = 8M
//是否开启文件上传功能
file_uploads = On
//文件上传的临时存放目录(如果不指定,使用系统默认的临时目录)
//upload_tmp_dir =
//允许单个请求上传的最大文件大小
upload_max_filesize = 2M
//允许单个POST请求同时上传的最大文件数量
max_file_uploads = 20

从上面的配置信息中我们可以看出,PHP的默认配置信息就是导致PHP文件上传时提示文件大小超出限制的“罪魁祸首”。上述配置信息中给出了各个指令选项对应的中文注释信息,大家可以根据自己的实际需求情况对php.ini配置文件进行相应的修改。

最近在一个项目中做登录模块,使用jQuery validate插件进行表单验证,验证通过后jQuery Form插件ajax提交表单数据,在火狐,谷歌浏览器使用正常,无报错信息,但在IE8下点击登陆按钮没有反应,后来看到IE控制台有报错信息说”对象不支持此属性或方法”.

我这里的报错信息如下:

对象不支持此属性或方法

错误详细信息

上网搜了一下有以下几种原因和解决办法,经过测试我的问题是通过方法3解决的,给遇到同样问题的朋友参考一下

1.表单控件中存在name为关键字的情况

由于表单中存在name为submit(或action等其他关键字)的组件,因此提交时没有提交submit而是提交了名字为submit的value。

如以下错误示例:

<form>
<input type=”text” name=”submit” />
<input type=”button” name=”submit” value=”提交”/>
<input type=”submit” name=”submit” value=”提交”/>
</form>

解决办法:

将name为submit等关键词改名,如Submit(注意貌似只要不是全部小写的就可以)

2.出现表单嵌套。(form中嵌套form)

在页面中本来有个fom,然后又include一个页面,在这个页面中也有一个form,出现了表单嵌套的情况。。

这样在提交时,被包含的form会提交不了。

解决办法:

去掉一个form表单

3.插件引入问题

检查js路径是否正确;

②注意jquery要放在from.js之前加载;

③尝试替换jquery的版本;

④引入js文件的type

把type=”application/javascript”改为type=”text/javascript”,或者不要type都可以无错运行

报错时是这样的

<script src=”http://file.waiting8.com/js/jquery-1.8.3.min.js” language=”javascript”></script>
<script src=”http://file.waiting8.com/js/jquery.form.js” type=”application/javascript” language=”javascript”></script>
<script src=”http://file.waiting8.com/js/jquery.validate.min.js” type=”application/javascript” language=”javascript”></script>

改成这样IE8就没问题了

<script src=”http://file.waiting8.com/js/jquery-1.8.3.min.js” language=”javascript”></script>
<script src=”http://file.waiting8.com/js/jquery.form.js” type=”text/javascript” language=”javascript”></script>
<script src=”http://file.waiting8.com/js/jquery.validate.min.js” type=”text/javascript” language=”javascript”></script>

附加知识:

1、表单应该包含name,aciton,method这三个必须的属性,enctype,id这两个属性可以根据需要加上,表单不要嵌套

2、document.form.action与document.form.submit()一定不要搞混,action是属性,submit是方法,方法不要忘记加上左右括号,这是一般新手经常遇到的问题。

<script>

var imgUrl = "图片地址";

var lineLink = "网址";

var descContent = '爱在五月,\n\n妈咪爱1+1亲子健康之旅开启全国行首站----重庆站妈咪爱活性益生菌';

var shareTitle = '标题';

var appid = '';

function shareFriend() {

WeixinJSBridge.invoke('sendAppMessage',{

"appid": appid,

"img_url": imgUrl,

"img_width": "200",

"img_height": "200",

"link": lineLink,

"desc": descContent,

"title": shareTitle

}, function(res) {

//_report('send_msg', res.err_msg);

})

}

function shareTimeline() {

WeixinJSBridge.invoke('shareTimeline',{

"img_url": imgUrl,

"img_width": "200",

"img_height": "200",

"link": lineLink,

"desc": descContent,

"title": shareTitle

}, function(res) {

//_report('timeline', res.err_msg);

});

}

function shareWeibo() {

WeixinJSBridge.invoke('shareWeibo',{

"content": descContent,

"url": lineLink,

}, function(res) {

//_report('weibo', res.err_msg);

});

}

// 当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件。

document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {

// 发送给好友

WeixinJSBridge.on('menu:share:appmessage', function(argv){

shareFriend();

});

// 分享到朋友圈

WeixinJSBridge.on('menu:share:timeline', function(argv){

shareTimeline();

});

// 分享到微博

WeixinJSBridge.on('menu:share:weibo', function(argv){

shareWeibo();

});

}, false);

</script>