MySQL 触发器插入之前获取记录id

DELIMITER $
DROP TRIGGER if exists houseInsert$
create trigger houseInsert before insert on house for each row
BEGIN
	DECLARE cityPre varchar(10);
	DECLARE cityId bigint;
	DECLARE nextId int;
	set cityId=(select b.cityId from gisTown a join gisCounty b on a.countyId=b.id where a.id=new.townId);
	CASE cityId
	   WHEN 110100000000 THEN  set cityPre='BJ';
	   WHEN 310100000000 THEN set cityPre='SH';
	   ELSE SIGNAL sqlstate '45001' set message_text="cityId not supported";
	END CASE;
	SET nextId = (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='house');
	set new.sn=concat(cityPre,from_unixtime(new.createTime,'-%y-%m-'),nextId);
END$
DELIMITER ;

变量nextId就是新的记录的自增主键。

php7 安装xhprof

网上找了一下就两个版本

https://github.com/Yaoguais/phpng-xhprof 这个能用,但是很不稳定,基本没发玩。

https://github.com/RustJason/xhprof/tree/php7 这个直接编译就不通过。

最终找了个商业公司开发的,有增值服务,免费服务已经和xhprof一模一样了,完全够用

https://tideways.io/profiler/xhprof-for-php7-php5.6 (https://github.com/tideways/php-profiler-extension)

使用xhprof默认UI的时候需要注意一点

  1. 如果没有使用默认数据目录需要手动修改XHProfRuns_Default类构造方法中的dir,否则会找不到需要展示的数据。

session_start(): Unable to clear session lock record

php 5.6升级到php 7.0之后memcached session经常出现session_start(): Unable to clear session lock record错误,配套的新版memached配置已经更新,memcached.sess_lock_wait_min=1000,memcached.sess_lock_wait_max=30000,这个问题还是随机性出现,目前有3种解决办法

  1. php7.0.12之后memcached.sess_lock_expire设置一个明确的值,没有亲测,据github网友测试可用。
  2. session_write_close(),不管session的值有没有变化都要session_write_close(),没有亲测。一般session用的都是框架(我用的ZF1),这种方法不是很优美。
  3. php7之后增加了一个新的session配置session.lazy_write,这个默认是true,设置成false解决问题,亲测。
    if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
        ini_set('session.lazy_write', 0);
    }

     

参考:

https://github.com/php-memcached-dev/php-memcached/issues/269

bootstrap 列表全选(全自动)

纯js实现,确实厉害,完全不影响原有表格效果和结构。

效果图

%e5%b1%8f%e5%b9%95%e5%bf%ab%e7%85%a7-2016-11-11-%e4%b8%8b%e5%8d%882-43-31

$(function(){
	function initTableCheckbox() {
		var $thr = $('table thead tr');
		var $checkAllTh = $('<th><input type="checkbox" id="checkAll" name="checkAll" /></th>');
		/*将全选/反选复选框添加到表头最前,即增加一列*/
		$thr.prepend($checkAllTh);
		/*“全选/反选”复选框*/
		var $checkAll = $thr.find('input');
		$checkAll.click(function(event){
			/*将所有行的选中状态设成全选框的选中状态*/
			$tbr.find('input').prop('checked',$(this).prop('checked'));
			/*并调整所有选中行的CSS样式*/
			if ($(this).prop('checked')) {
				$tbr.find('input').parent().parent().addClass('warning');
			} else{
				$tbr.find('input').parent().parent().removeClass('warning');
			}
			/*阻止向上冒泡,以防再次触发点击操作*/
			event.stopPropagation();
		});
		/*点击全选框所在单元格时也触发全选框的点击操作*/
		$checkAllTh.click(function(){
			$(this).find('input').click();
		});
		var $tbr = $('table tbody tr');
		var $checkItemTd = $('<td><input type="checkbox" name="checkItem" /></td>');
		/*每一行都在最前面插入一个选中复选框的单元格*/
		$tbr.prepend($checkItemTd);
		/*点击每一行的选中复选框时*/
		$tbr.find('input').click(function(event){
			/*调整选中行的CSS样式*/
			$(this).parent().parent().toggleClass('warning');
			/*如果已经被选中行的行数等于表格的数据行数,将全选框设为选中状态,否则设为未选中状态*/
			$checkAll.prop('checked',$tbr.find('input:checked').length == $tbr.length ? true : false);
			/*阻止向上冒泡,以防再次触发点击操作*/
			event.stopPropagation();
		});
		/*点击每一行时也触发该行的选中操作*/
		$tbr.click(function(){
			$(this).find('input').click();
		});
	}
	initTableCheckbox();
});

 

参考:

http://www.voidcn.com/blog/shangmingchao/article/p-4860592.html

curl命令行上传文件并指定mime

用curl下载网页估计大家都会,但是模拟 multipart/form-data 形式的 form 上传文件则稍稍复杂些。命令行如下。

curl -F "action=upload" -F "filename=@file.tar.gz" http://localhost/action.php

如果使用了-F参数,curl就会以 multipart/form-data 的方式发送POST请求。-F参数以name=value的方式来指定参数内容,如果值是一个文件,则需要以name=@file的方式来指定。

如果通过代理,上面的命令有可能会被代理拒绝,这时需要指定上传文件的MIME类型。

curl -x myproxy.com:1080 -F "action=upload" -F "filename=@file.tar.gz;type=application/octet-stream" http://localhost/action.php