41.保存用户密码:加密(用户密码+随机盐),然后将密码和盐保存。盐每次应该是随机的,不同的,并且应该足够长。一个好的经验是使用和哈希函数输出的字符串等长的盐值。例如, SHA256 的输出为256位(32字节),所以该盐也应该是32个随机字节。对于实用性而言,加盐 MD5 和加盐 SHA256 的安全性一样。尽管如此,可能的话,要使用更安全的哈希函数,比如 SHA256 、 SHA512 、 RipeMD 或 WHIRLPOOL 。php生成随机盐可以用mcrypt_create_iv(php7.1弃用,改成random_bytes),openssl_random_pseudo_bytes。每个用户的每一个密码都要使用独一无二的盐值。用户每次创建帐号或更改密码时,密码应采用一个新的随机盐值。永远不要重复使用某个盐值。
42.webservice 实现方式有soap,nusoap,phprpc等,其中phprpc安装方式有下载源代码(git或download),在windows上用git命令可以用cmder,另一种方式是用composer,http://docs.phpcomposer.com/00-intro.html#Dependency-management,其中根据composer.json安装前先配置一下采用国内镜像https://pkg.phpcomposer.com/
43.wampserver增加php对sqlserver的扩展:a.https://www.microsoft.com/en-us/download/details.aspx?id=20098下载对应php版本的扩展,放入php目录ext目录下,并且配置php目录下的php.ini和apache/apachexxx/bin/php.ini,添加上sqlsrv和pdo_sqlsrv配置,重启wampserver,你会发现扩展里还是没有支持sqlsrv,需要执行b步骤;b.https://msdn.microsoft.com/en-us/library/cc296170(v=sql.105).aspx,往下浏览,你会发现有个列表,列出了Microsoft Drivers for PHP for SQL Server Version和Version of Microsoft ODBC Driver for SQL Server or SQL Server Native Client的对应关系,然后在右边选择对应的下载安装。这样安装好后,重启wampserver,就ok了。
44.linux上放上项目后,firefox和google正常,ie登陆不上,原因是linux的系统时间问题,造成项目中的session过期。修改linux时间,详见[linux]第16条
45.科学计数法转普通数
$a = '1.27175E-5';
echo rtrim(rtrim(sprintf('%.20F', $a), '0'), ".")
46.
[xdebug]
zend_extension ="E:/zm/wamp/bin/php/php7.0.10/zend_ext/php_xdebug-2.4.1-7.0-vc14.dll"
xdebug.auto_trace = On
xdebug.show_exception_trace = On
xdebug.remote_autostart = On
xdebug.remote_enable = 1
xdebug.collect_vars = On
xdebug.collect_return = On
xdebug.collect_params = On
xdebug.trace_output_dir="E:/zm/wamp/tmp/xDebugLog"
xdebug.profiler_output_dir="E:/zm/wamp/tmp/xDebugLog"
xdebug.profiler_enable=On
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
47.js传递json字符串给php,php接到后中文乱码,js可以用encodeURI函数处理下,PHP接收后用urldecode处理下就ok了。php两个函数
urlencode() 和urldecode();js两个函数decodeURI() 和encodeURI()
48.getallheaders用于apache下获取头部参数,php官网getallheaders函数定义页面的下方有提供适用于nginx的解决方式,需要注意的是,nginx下头部参数不能包含下划线,否则获取不到
49.swoole
$db = new Swoole\MySQL;
$server = array(
'host' => 'localhost',
'user' => 'root',
'password' => 'root',
'database' => 'gaoBingFa',
);
$db->connect($server, function ($db, $result) {
$db->query("show tables", function (Swoole\MySQL $db, $result) {
if ($result === false) {
var_dump($db->error, $db->errno);
} elseif ($result === true) {
var_dump($db->affected_rows, $db->insert_id);
} else {
var_dump($result);
$db->close();
}
});
});
50.利用redis的list,的确可以防止高并发下,秒杀货品场景出现超卖的情况。但是当并发数过大或请求数过大的情况,出现了少卖的情况,也就是请求数多于商品数,执行完后,数据库中还有剩余商品。总体来说:redis可以相对于服务环境并发数不大的情况,可以帮助应对并发。
$redis=new Redis();
$result=$redis->connect('127.0.0.1',6379);
$count=$redis->lpop('goods_store');
if(!$count){
insert_log('error:no store redis');
return;
}