Http request header坑记录

在开发公共API时,在请求头中(http request header)加入key secret来认证用户。
类似阿里云AccessKey AccessSecret。
header的key为MERCHANT_KEY MERCHANT_SECRET,PHP后端接收不到这些key的header。
查阅nginx资料发现,nginx默认设置会把含有下划线的key给忽略掉。
修改这些设置有两个方法:

1、修改nginx设置,underscores_in_headers 设置为 on

2、使用减号代替下划线,推荐这个方法

php 处理高精度计算函数

PHP 为任意精度数学计算提供了二进制计算器(Binary Calculator),它支持任意大小和精度的数字,以字符串形式描述

bcadd — 加法
bccomp — 比较
bcdiv — 相除
bcmod — 求余数
bcmul — 乘法
bcpow — 次方
bcpowmod — 先次方然后求余数
bcscale — 给所有函数设置小数位精度
bcsqrt — 求平方根
bcsub — 减法

涉及到钱的计算,还是以int存储,不容易出问题

PHPStorm激活码

77751S0VBA-eyJsaWNlbnNlSWQiOiI3Nzc1MVMwVkJBIiwibGljZW5zZWVOYW1lIjoi5b285bK4IHNvZnR3YXJlMiIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiJGb3IgZWR1Y2F0aW9uYWwgdXNlIG9ubHkiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IklJIiwicGFpZFVwVG8iOiIyMDE5LTAxLTA1In0seyJjb2RlIjoiUlMwIiwicGFpZFVwVG8iOiIyMDE5LTAxLTA1In0seyJjb2RlIjoiV1MiLCJwYWlkVXBUbyI6IjIwMTktMDEtMDUifSx7ImNvZGUiOiJSRCIsInBhaWRVcFRvIjoiMjAxOS0wMS0wNSJ9LHsiY29kZSI6IlJDIiwicGFpZFVwVG8iOiIyMDE5LTAxLTA1In0seyJjb2RlIjoiREMiLCJwYWlkVXBUbyI6IjIwMTktMDEtMDUifSx7ImNvZGUiOiJEQiIsInBhaWRVcFRvIjoiMjAxOS0wMS0wNSJ9LHsiY29kZSI6IlJNIiwicGFpZFVwVG8iOiIyMDE5LTAxLTA1In0seyJjb2RlIjoiRE0iLCJwYWlkVXBUbyI6IjIwMTktMDEtMDUifSx7ImNvZGUiOiJBQyIsInBhaWRVcFRvIjoiMjAxOS0wMS0wNSJ9LHsiY29kZSI6IkRQTiIsInBhaWRVcFRvIjoiMjAxOS0wMS0wNSJ9LHsiY29kZSI6IkdPIiwicGFpZFVwVG8iOiIyMDE5LTAxLTA1In0seyJjb2RlIjoiUFMiLCJwYWlkVXBUbyI6IjIwMTktMDEtMDUifSx7ImNvZGUiOiJDTCIsInBhaWRVcFRvIjoiMjAxOS0wMS0wNSJ9LHsiY29kZSI6IlBDIiwicGFpZFVwVG8iOiIyMDE5LTAxLTA1In0seyJjb2RlIjoiUlNVIiwicGFpZFVwVG8iOiIyMDE5LTAxLTA1In1dLCJoYXNoIjoiNzY3NzcyNi8wIiwiZ3JhY2VQZXJpb2REYXlzIjowLCJhdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJpc0F1dG9Qcm9sb25nYXRlZCI6ZmFsc2V9-c7VbdE4BiafdLpgYmh2iUNu6NLR59/rUaHKmCcgq/C6BSTXTV8aEy3iZGeXPMIsTWEAR3NrwLjZZEa4DhBNgxoHfjOY5IuZ1JOVRRzytvv3sCB3gGRZCf7Y4uQ+NszauFgpksfQIhHxgmUX3Iljo9an9T5pje6zrK9DOwuScxtqwtyQ0R7AmhwnJtI6Oeo3pilV/CvNV9OHtQ9QY460li9Pi87BqbV2MZJmckioZ2Tl9vgYjS5uKaBKlSscmihHRGgwy6pgKdamTe3NMHMkEhyko/WMy6wfp8sNPxlG8GW2lloZL/ny4eM24QGiv7P1CjAEWBXslg49GGqAdqbI/3w==-MIIEPjCCAiagAwIBAgIBBTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE1MTEwMjA4MjE0OFoXDTE4MTEwMTA4MjE0OFowETEPMA0GA1UEAwwGcHJvZDN5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQC9WZuYgQedSuOc5TOUSrRigMw4/+wuC5EtZBfvdl4HT/8vzMW/oUlIP4YCvA0XKyBaCJ2iX+ZCDKoPfiYXiaSiH+HxAPV6J79vvouxKrWg2XV6ShFtPLP+0gPdGq3x9R3+kJbmAm8w+FOdlWqAfJrLvpzMGNeDU14YGXiZ9bVzmIQbwrBA+c/F4tlK/DV07dsNExihqFoibnqDiVNTGombaU2dDup2gwKdL81ua8EIcGNExHe82kjF4zwfadHk3bQVvbfdAwxcDy4xBjs3L4raPLU3yenSzr/OEur1+jfOxnQSmEcMXKXgrAQ9U55gwjcOFKrgOxEdek/Sk1VfOjvS+nuM4eyEruFMfaZHzoQiuw4IqgGc45ohFH0UUyjYcuFxxDSU9lMCv8qdHKm+wnPRb0l9l5vXsCBDuhAGYD6ss+Ga+aDY6f/qXZuUCEUOH3QUNbbCUlviSz6+GiRnt1kA9N2Qachl+2yBfaqUqr8h7Z2gsx5LcIf5kYNsqJ0GavXTVyWh7PYiKX4bs354ZQLUwwa/cG++2+wNWP+HtBhVxMRNTdVhSm38AknZlD+PTAsWGu9GyLmhti2EnVwGybSD2Dxmhxk3IPCkhKAK+pl0eWYGZWG3tJ9mZ7SowcXLWDFAk0lRJnKGFMTggrWjV8GYpw5bq23VmIqqDLgkNzuoog==

 

有效期至 2019-01-05

laravel框架session使用教程

laravel是一款php框架了,在使用laravel时会碰到session使用问题了,在使用过程中碰到一些问题与一些应用的例子。

用Laravel开发应用,把原有的代码copy过来,以前的代码session使用了$_SESSION,本以为移植过来可以很好的运行的,因为没有依赖其他的组件,结果出现了这个
Undefined variable: _SESSION

Laravel的session的配置文件配置在 app/config/session.php 中,使用时可以看看 session 配置文件中可用的选项设定及注释。
Laravel 默认使用 file 的方式来实现 session的。她并不用php原生的$_SESSION(php原生的session要看php.ini的位置),所以忽略php相关的session函数,例如session_start(), $_SESSION。Laravel在运行过程中会在app/storage/session/目录写入session的信息,所以这个目录需要有写权限,否者session就无法写入成功。
Laravel除了使用默认的file作为session的实现,还支持cookie, Memcached, Redis 和数据库的后端驱动作为session的实现。必要的时候还需要自己实现一个session的实现方式,比如在微信公众账号和用户的交互,这中session就无法直接使用,因为每次都是微信服务器来请求,无法通过请求的来源来辨别用户。

laravel的session简要API

Session的API还是比较简单的,大家看看中文文档也大概知道是怎么个意思。但是有那么几个还不太好理解。

//session的永久保存(在不过期范围内)
Session::put(‘key’, ‘value’);

//等同于PHP的原生session
$_SESSION[‘key’] = ‘value’;

//get操作
$value = Session::get(‘key’, ‘default’);

//去除操作并删除,类似pop概念
$value = Session::pull(‘key’, ‘default’);

//检测是否存在key
Session::has(‘users’);

//删除key
Session::forget(‘key’);
这个对应只要session不过期,基本上是永久保存,下次http请求也是存在的。不同于下面的flash概念。
laravel的session中flash概念
但是Laravel出了个快闪flash的概念,把我一下子给搞混了。这个flash两次请求有效(本次和下次请求有效),与本次请求取操作多少次无关。

//保存key,value
Session::flash(‘key’, ‘value’);

//取值方法还是一样的
Session::get(‘key’);

//刷新快闪数据时间,保持到下次请求
Session::keep(array(‘username’, ’email’));
这个flash的概念和上面的put的概念不太一样。

put :这个对应只要session不过期,基本上是永久保存,下次请求也是存在的。
flash :保存的值,本次请求可以使用,下次http请求可以使用,再下一次就不存在了。
也就是说下一次的请求用完就被销毁了,不会让session的值变的越来越大,可以保存一些临时的数据。

这中情况的使用场景比如有:
用户请求了页面,出现错误信息,重定向到一个新的页面,需要展示之前的数据。(虽然可以通过url参数来传递,处理不好可能会有xss漏洞)。

用户访问了一个页面,过滤器发现没权限,保存当前页面url,重定向到登录页面,登录成功,取出值,重定向到原先的页面。(这里可能需要刷新保存的快闪数据)

session落地的时间
我天真的以为使用了Session::put函数就能保存这个变量了。于是我的代码这样写:

class LoginController {

public function login(){
Session::put(‘key’,’value’);
print_r( Session::all() ); //取出来看看是否put成功
exit; //习惯性的调试都exit,不执行后续代码
//return Redirect::to(/); 框架在return后还会有后续的代码执行的
}
}

结果下次请求就是找不到本次的Session,而且看app/storage/session目录就是没有文件生成。总感觉不对劲啊。

后来看到网络上有个方法Session::save(),于是我也用了下,居然发现成功的生成了session的文件。于是我感觉到,Laravel不用php原生的session,那么在controller之后应该做了一些事情,将session写入到文件中,而不是每次put操作都写操作,这样会IO操作太频繁的,影响性能的。

查看调用相关的代码。laravel编译后,在bootstrap/compiled.php中

class Middleware implements HttpKernelInterface
{

public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
{
$this->checkRequestForArraySessions($request);
if ($this->sessionConfigured()) {
$session = $this->startSession($request); // 启动session
$request->setSession($session);
}
$response = $this->app->handle($request, $type, $catch); // 调用controller的method
if ($this->sessionConfigured()) {
$this->closeSession($session); //关闭session
$this->addCookieToResponse($response, $session);
}
return $response;
}

protected function closeSession(SessionInterface $session)
{
$session->save(); // 保存session
$this->collectGarbage($session);
}
}
小提示:如果不知道函数调用情况,可以在controller中throw new Exception();,然后在/config/app.php的debug更改为debug=>true。可以看到函数的调用关系。

可以看见,在调用完controller之后,调用了session->save()的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了exit;,
那么session是不会被保存的,除非主动的写Session::save()才能手工的保存起来。因此在debug调试的时候千万要注意啊。

 

 

转载自:http://www.cnblogs.com/qhorse/p/4763169.html

php 数组 类对象 值传递 引用传递 区别

php中,数组是当一个普通变量,值传递是要一个实参的一个拷贝副本,跟实参无关,引用传递后可以改变实参的值

而类的对象是无论值传递和引用传递都是引用传递,是对对象的引用,都会改变实参的值

结合clone函数就不难理解PHP对对象的传递是类似指针传递

对象的值传递和引用传递在特定场景下面是有区别的

PHPExcel 行号、数字互转

$a = PHPExcel_Cell::columnIndexFromString(‘A’);

// $a = 1;

$b = PHPExcel_Cell::stringFromColumnIndex(0);

// $b = ‘A’;

注意,这两个方法的起始数字 一个是1 一个是0