php做微信支付和支付宝支付的方法

php做微信支付和支付宝支付的方法

直接去官方下载demo 然后证书换一下 appid换下 就好了 如果测试成功 直接复制到项目中即可 这个方法目前是最好 最稳定的方法 如果自己写的话 有可能造成有些细节没注意 造成接口请求失败 很难找到原因

微信支付基本原理 首先要调用统一下单接口 这个是生成订单的 然后再调用支付接口 返回的参数值 客户端再去调用
//调用微信JS api 支付 jsApiParameters就是调用微信支付返回的接口
function jsApiCall() {
var jsApiParameters = $(‘#jsApiParameters’).val();
WeixinJSBridge.invoke(‘getBrandWCPayRequest’, jsApiParameters, function(res) {
WeixinJSBridge.log(res.err_msg);
alert(res.err_code + res.err_desc + res.err_msg);
});
}

function callpay() {
if (typeof WeixinJSBridge == “undefined”) {
if (document.addEventListener) {
document.addEventListener(‘WeixinJSBridgeReady’, jsApiCall, false);
} else if (document.attachEvent) {
document.attachEvent(‘WeixinJSBridgeReady’, jsApiCall);
document.attachEvent(‘onWeixinJSBridgeReady’, jsApiCall);
}
} else {
jsApiCall();
}
}

微信支付官方demo有bug
这个错误通过修改文件WxPay.Api.php 解决,具体如下:
第537行
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
to
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//严格校验2

mysql高并发配置

mysql高并发配置 要在mysqld下设置
1 修改back_log参数值:由默认的50修改为500.(每个连接256kb,占用:125M)
back_log=500

 back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。也就是说,如果MySql的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。将会报:unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时.
back_log值不能超过TCP/IP连接的侦听队列的大小。若超过则无效,查看当前系统的TCP/IP连接的侦听队列的大小命令:cat /proc/sys/net/ipv4/tcp_max_syn_backlog目前系统为1024。对于Linux系统推荐设置为小于512的整数。
修改系统内核参数,)http://www.51testing.com/html/64/n-810764.html
查看mysql 当前系统默认back_log值,命令:
show variables like 'back_log'; 查看当前数量

2 修改wait_timeout参数值,由默认的8小时,修改为30分钟
wait_timeout=1800(单位为妙)


我对wait-timeout这个参数的理解:MySQL客户端的数据库连接闲置最大时间值。
说得比较通俗一点,就是当你的MySQL连接闲置超过一定时间后将会被强行关闭。MySQL默认的wait-timeout  值为8个小时,可以通过命令show variables like 'wait_timeout'查看结果值;。
设置这个值是非常有意义的,比如你的网站有大量的MySQL链接请求(每个MySQL连接都是要内存资源开销的 ),由于你的程序的原因有大量的连接请求空闲啥事也不干,白白占用内存资源,或者导致MySQL超过最大连接数从来无法新建连接导致“Too many connections”的错误。在设置之前你可以查看一下你的MYSQL的状态(可用show processlist),如果经常发现MYSQL中有大量的Sleep进程,则需要 修改wait-timeout值了。
interactive_timeout:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
wait_timeout:服务器关闭非交互连接之前等待活动的秒数。在线程启动时,根据全局wait_timeout值或全局 interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义).
这两个参数必须配合使用。否则单独设置wait_timeout无效

3修改max_connections参数值,由默认的151,修改为3000(750M)。
max_connections=3000

max_connections是指MySql的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySql会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。可以过'conn%'通配符查看当前状态的连接数量,以定夺该值的大小。
MySQL服务器允许的最大连接数16384;
查看系统当前最大连接数:
show variables like 'max_connections';

4修改max_user_connections值,由默认的0,修改为800
max_user_connections=800

max_user_connections是指每个数据库用户的最大连接
针对某一个账号的所有客户端并行连接到MYSQL服务的最大并行连接数。简单说是指同一个账号能够同时连接到mysql服务的最大连接数。设置为0表示不限制。
目前默认值为:0不受限制。
这儿顺便介绍下Max_used_connections:它是指从这次mysql服务启动到现在,同一时刻并行连接数的最大值。它不是指当前的连接情况,而是一个比较值。如果在过去某一个时刻,MYSQL服务同时有1000个请求连接过来,而之后再也没有出现这么大的并发请求时,则Max_used_connections=1000.请注意与show variables 里的max_user_connections的区别。默认为0表示无限大。
查看max_user_connections值
show variables like 'max_user_connections';

5 修改thread_concurrency值,由目前默认的8,修改为64
thread_concurrency=64

thread_concurrency的值的正确与否, 对mysql的性能影响很大, 在多个cpu(或多核)的情况下,错误设置了thread_concurrency的值, 会导致mysql不能充分利用多cpu(或多核), 出现同一时刻只能一个cpu(或核)在工作的情况。
thread_concurrency应设为CPU核数的2倍. 比如有一个双核的CPU, 那thread_concurrency  的应该为4; 2个双核的cpu, thread_concurrency的值应为8.
比如:根据上面介绍我们目前系统的配置,可知道为4个CPU,每个CPU为8核,按照上面的计算规则,这儿应为:4*8*2=64
查看系统当前thread_concurrency默认配置命令:
 show variables like 'thread_concurrency';

添加skip-name-resolve,默认被注释掉,没有该参数


skip-name-resolve:禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!

mysql慢查询日记

mysql慢查询日记

#必须写到mysqld 注意给/tmp/showslowmysql.log 775权限 要写入权限
[mysqld]
#开启慢查询日记
slow_query_log = 1
#设置日记路径
slow_query_log_file = /tmp/showslowmysql.log
#超过1秒 就代表慢查询记录到日志
long_query_time=1





mysql> show variables like '%query%';
+------------------------------+------------------------+
| Variable_name                | Value                  |
+------------------------------+------------------------+
| binlog_rows_query_log_events | OFF                    |
| ft_query_expansion_limit     | 20                     |
| have_query_cache             | YES                    |
| long_query_time              | 1.000000               |
| query_alloc_block_size       | 8192                   |
| query_cache_limit            | 1048576                |
| query_cache_min_res_unit     | 4096                   |
| query_cache_size             | 1048576                |
| query_cache_type             | OFF                    |
| query_cache_wlock_invalidate | OFF                    |
| query_prealloc_size          | 8192                   |
| slow_query_log               | ON                     |
| slow_query_log_file          | /tmp/showslowmysql.log |
+------------------------------+------------------------+
13 rows in set

运行mysql语句select sleep(1);

然后查看慢查询日志 cat /tmp/showslowmysql.log
# Time: 170516 14:46:47
# User@Host: root[root] @ [122.224.247.131] Id: 67
# Query_time: 1.000352 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1494917207;
select sleep(1);

linux echo -e 处理特殊字符

linux echo -e 处理特殊字符

若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;

$echo -e "a\bdddd"  
dddd

$echo -e "a\adddd" //输出同时会发出报警声音
adddd


$echo -e "a\ndddd" //自动换行
a
dddd

mysql 使用inet_aton和inet_ntoa处理ip地址数据

创建表

CREATE TABLE `user` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(100) NOT NULL,
 `ip` int(10) unsigned NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB;

插入几条数据


INSERT INTO `user` (`id`, `name`, `ip`) VALUES
(2, 'Abby', inet_aton('192.168.1.1')),
(3, 'Daisy', inet_aton('172.16.11.66')),
(4, 'Christine', inet_aton('220.117.131.12'));

查询显示为电地址


mysql> select id,name,inet_ntoa(ip) as ip from `user`;
+----+-----------+----------------+
| id | name      | ip             |
+----+-----------+----------------+
|  2 | Abby      | 192.168.1.1    |
|  3 | Daisy     | 172.16.11.66   |
|  4 | Christine | 220.117.131.12 |
+----+-----------+----------------+

比较方法
如果需要找出在某个网段的用户(例如:172.16.11.1 ~ 172.16.11.100),可以利用PHP的ip2long方法,把ip地址转为整型,再进行比较。

mysql> select ip,name,inet_ntoa(ip) as ip from `user` where ip>=2886732545 and ip<=2886732644;
+------------+-------+---------------+
| ip         | name  | ip            |
+------------+-------+---------------+
| 2886732610 | Daisy | 172.16.11.66  |
+------------+-------+---------------+

注意:使用ip2long方法把ip地址转为整型时,对于大的ip会出现负数,采取如下方案

<?php
$ip = '192.168.101.100';
$ip_long = sprintf('%u',ip2long($ip));
echo $ip_long.PHP_EOL;  
?>

mysql 时间戳格式化函数from_unixtime使用说明

mysql 时间戳格式化函数from_unixtime使用说明

mysql> select from_unixtime(1459338786);

+---------------------------+
| from_unixtime(1459338786) |
+---------------------------+
| 2016-03-30 19:53:06       |
+---------------------------+
1 row in set (0.00 sec)

mysql> select from_unixtime(1459338786, '%Y-%m-%d %H:%i:%s');
+------------------------------------------------+
| from_unixtime(1459338786, '%Y-%m-%d %H:%i:%s') |
+------------------------------------------------+
| 2016-03-30 19:53:06                            |
+------------------------------------------------+
1 row in set (0.00 sec)

format格式说明:

%M 月名字(January~December)
%W 星期名字(Sunday~Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun~Sat)
%d 月份中的天数, 数字(00~31)
%e 月份中的天数, 数字(0~31)
%m 月, 数字(01~12)
%c 月, 数字(1~12)
%b 缩写的月份名字(Jan~Dec)
%j 一年中的天数(001~366)
%H 小时(00~23)
%k 小时(0~23)
%h 小时(01~12)
%I 小时(01~12)
%l 小时(1~12)
%i 分钟, 数字(00~59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00~59)
%s 秒(00~59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ~6=Saturday )
%U 星期(0~52), 这里星期天是星期的第一天
%u 星期(0~52), 这里星期一是星期的第一天
%% 一个文字%

//下面是输出每天的数据 按小时算的数据

mysql> select from_unixtime(addtime,'%Y-%m-%d %H') as date,count(*) from `table` group by from_unixtime(addtime,'%Y-%m-%d %H');
+---------------+----------+
| date          | count(*) |
+---------------+----------+
| 2016-03-30 19 |      409 |
| 2016-03-30 20 |      161 |
+---------------+----------+
2 rows in set (0.00 sec)