编译php5.6时报undefined reference to libiconv

config后编辑Makefile,在最后加上 -liconv,如下,再make make install

EXTRA_LIBS = -lcrypt -lz -lcrypt -lrt -lmysqlclient -lmcrypt -lldap -llber -lfreetype -lpng -lz -ljpeg -lcurl -lz -lrt -lm -ldl -lnsl -lrt -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lidn -lssl -lcrypto -lz -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lxml2-lz -lm -lcrypt -liconv

mysql5.7多主一从,从机调优

多主一从架构见前面文章,本文略。

同步了三个库到一台从机后,发现有两个库延时特别严重,且与主库延迟时间越拉越长,查看延迟时间,用show slave status;看Seconds_Behind_Master的值。

为了查找原因,准备开启慢日志,发现mysql从5.6开始慢日志配置项就改了,新的配置项有这么几个:

long_query_time=2
slow_query_log = 1
slow_query_log_file=/xx/xx/slow.log

配置好重启后,发现slow.log是生成了,但是等了一段时间后,没有记录到一条慢sql,通过show processlist发现慢sql多的是,就是无记录,暂未解决这个问题。

没办法,只好用show processlist人工检查慢sql,逐条优化。

之前为了初始多台主服的数据,将导过来的从库挨个改成了myisam引擎,为了加快同步速度,又改回innodb,发现在mysql5.7版本下,innodb确实要比myisam快。

经过一段时间观察,优化了几个关键的慢sql,同步延迟终于改善

mysql5.7.10主从后续

主服mysql5.6.28,从服mysql5.7.10,其中主服是从5.5.15升级到5.6.28,升到5.6的原因上一篇已经说过了,都是uuid搞的鬼。

因为数据量庞大,用mysqldump导出sql再导入的办法不太可行,太慢,采用拷贝库文件的方法。

1、停掉主服,打包库目录和idata1,上传到从服。

2、备份从服的idata1文件,因为5.7的系统库默认引擎是innodb,不能简单覆盖idata1文件,然后再替换成从库的idata1文件。

3、从库解压主库传过来的库目录和idata1文件,重启从库,这时候系统库实际上是无法使用的,因为idata1文件被替换了。

4、将移过来的库,所有表引擎改成myisam,以释放idata1文件,然后恢复老的idata1文件,重启从服。

5、这个时候从库系统库也可以用了,移过来的库也ok了,唯一的问题是引擎全部变成myisam,这个不影响主从同步,如果是多主一从,还不能改回innodb,因为idata1文件只有一个,其他库移过来都会有冲突,也都要转成myisam引擎。

遇到的问题,datetime,timestamp等字段默认值,在mysql5.7版本里,不能设置成’0000-00-00’,必须设置成正确的时间范围,拿timestamp来说,如果时区设置是中国,最小默认时间戳是’1970-01-01 08:00:01’,注意那个1秒,少一秒都不行,所有设置了默认值,小于这个时间或者用触发器获取当前时间的,都要重新定义。

Spreadsheet Excel Reader调试问题

从http://sourceforge.net/projects/phpexcelreader/files/Spreadsheet_Excel_Reader/下载的example.php,无法调试,大致有以下几个问题

1、报Deprecated: Assigning the return value of new by reference is deprecated in D:\wamp\www\phpExcelReader\Excel\reader.php on line 262,这是因为php5.3后,new不需要&引用,去掉&就可以了

2、报Spreadsheet/Excel/Reader/OLERead.php文件不存在,直接改成oleread.inc,example如此粗心!!!

3、支持中文,需要改$data->setOutputEncoding(‘CP1251’);改成UTF-8或者GB2312,看你具体编码

4、示范的excel文件格式是坏的,自己重新搞一个excel吧,否则一直会报超时。

php7继续试用-preg_replace的e修饰符

应该说在php5.5版本,preg_replace就不支持e修饰符了,需要换成preg_replace_callback函数。大致替换如下:

preg_replace("/..../e","..'\\1'...",$str)
preg_replace_callback("/..../",'func',$str);// 去掉e修饰,第二参数改成回调函数名
function func($match){
return ..$match[1]...;// 就把替换的位置'\\1'换成$match[1]就可以了
}

如果函数在类里要这样写:

preg_replace_callback("/..../",array($this,'func'),$str);

 

php7初体验

PHP7.0.0alpha1已经发布了,之前下了windows的包,丢本机wamp里发现跑不起来,这次下了linux,在测试机上试了一下,编译安装都很顺利,apache改一下配置文件,注释掉LoadModule php5_module,启用LoadModule php7_module        modules/libphp7.so,重启正常。

不过php7不再支持mysql扩展,只能改用mysqli或者mysqlnd,如果机器对mysql模块依赖很重,要谨慎,我是直接把mysql改成mysqli,大部分只要直接替换就可以了,部分函数参数要调换一下,mysqli需要带linkid的函数,默认都是放在第一参数,这个和mysql函数是相反的。

因为是测试机,性能没去研究,代码跑的还算正常,没发现什么问题。

ecshop添加微信支付jsapi

一直没捣鼓过ecshop,也没捣鼓过微信支付,这次一起碰上了。

先说说官方提供的demo吧,lib/WxPay.Config.php里的curl代理设置要修改,否则第一步获取openid就要挂

const CURL_PROXY_HOST = "0.0.0.0";//"10.152.18.220";
	const CURL_PROXY_PORT = 0;//8080;

接着是微信公众号后台,要填上测试url和测试微信号,这两个位置还比较明显,一般都能看到,有个东西就不好找了,oather2.0的回调域名,默认就是注册绑定的域名吧,我测试是用test的二级域名,捣鼓半天都获取不到openid,要到开发者中心-》配置项,找网页授权获取用户基本信息,后面有个修改按钮,点开就可以改回调域名了。

再说一下这个openid,微信公众平台接口在获取这个openid的时候需要做一次url跳转

public function GetOpenid()
	{
		//通过code获得openid
		if (!isset($_GET['code'])){
			//触发微信返回code码
			$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);
			$url = $this->__CreateOauthUrlForCode($baseUrl);

			Header("Location: $url");
			exit();
		} else {
			//获取code码,以获取openid
		    $code = $_GET['code'];
			$openid = $this->getOpenidFromMp($code);
			return $openid;
		}
	}

第一次GET[code]肯定是空的,要做一次跳转,得到code后再次回到获取openid页面,放在ecshop这就有问题了,你不能在支付时才去获取openid,那个时候做跳转,一个是购物车已经被清空二个说不定还要跳出两个订单也有可能,这是很衰的事情,所以最好在入口处就获取openid,判断一下是否在微信内,是否有获取到openid

if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false && !$_COOKIE["sopenid"]) {
	header("location:/getopenid.php");
}

因为ecshop不是单入口,所以最好放到init.php里,基本每个页面都会调用到,获取到openid后再跳转回去

最后就是支付和回调了,ecshop支付文件必须配置在include/modules/payment目录里,且要调用get_code方法,这样就不能直接用demo了,重新整理好丢payment目录,回调地址是在支付时就设定好的,参考其他支付的回调页面改写一下就可以了。

最后上线,记得把公众平台里的回调域名改成正式域名,开发配置里的支付授权目录也配置好,ecshop的支付是由根目录的flow.php发起的,一般配置到根目录就可以了,虽然内部是调用modules/payment

最后还要配置一下language目录的payment,参考其他支付的配置文件拷贝一个就可以了,这样就可以在管理员后台支付管理里,把微信支付开启起来,开始调试上线吧