ThinkPHP5 框架redis配置

看了半天官方文档 https://www.kancloud.cn/manual/thinkphp5_1/354116

硬是没测试出来怎么写连接到redis配置,于是干搓源码,看到如何写redis配置

/config/cache.php

return [
    // 驱动方式
    'type' => env('CACHE_TYPE', 'File'),
    'path' => '',
    'prefix' => 'app_name_',
    'expire' => 0,
    'host' => env('REDIS_HOST', '127.0.0.1'),
    'password' => env('REDIS_PASSWORD', ''),
];

写个配置示例,作为备忘

php7.4新语法

// A collection of Post objects
$posts = [/* … */];

$ids = array_map(fn($post) => $post->id, $posts);

上面这个代码等同于下面

$ids = array_map(function ($post) {
    return $post->id;
}, $posts);

使用时有几个注意事项:

  • php7.4才开始支持此语法
  • 以fn关键字开始
  • 只允许有一条语句,一般是return 那句话
  • return关键字可以省略
  • 参数类型和返回类型可以声明

声明类型写法如下:

$ids = array_map(fn(Post $post): int => $post->id, $posts);

如果你想返回一个引用类型,可以这么写:

fn&($x) => $x

还有个特性,在匿名函数里面,引入外部变量时,不需要显式use那个变量

$modifier = 5;

array_map(fn($x) => $x * $modifier, $numbers);

以上的代码,$modifier变量在闭包函数中修改值后,在外部的$modifier不会改变其值,但是$this关键字是给例外。

array_map(fn($x) => $x * $this->modifier, $numbers);

关于PHP程序员技术职业生涯规划 韩天峰

看到很多PHP程序员职业规划的文章,都是直接上来就提Linux、PHP、MySQL、Nginx、Redis、Memcache、jQuery这些,然后就直接上手搭环境、做项目,中级就是学习各种PHP框架和类库,高级阶段就是MySQL优化、PHP内核与扩展、架构设计这些了。

这些文章都存在一个严重的缺陷,不重视基础。就好比练武功,只求速成,不修炼内功和心法,只练各种招式,这样能高到哪里去?我所见过的PHP大牛每一个都是具备非常扎实的基础,他们之所以能成为大牛,是因为基础足够好。基础不稳,面对技术复杂的系统,如同盲人摸象、管中窥豹,只得其门不得其法。而且如果基础不扎实,也没办法进入大公司。国外的Google、Facebook,国内的腾讯、阿里、百度、滴滴、京东、新浪等知名互联网企业,无论哪一家公司面试必然会考验应聘者的技术功底。无法进入一个拥有大规模并发请求的项目中得到历练,不坚持提升自己,那也只能在小公司混日子了。

我最开始工作也是在2家小公司,后来加入腾讯阿里,主要原因还是我坚持学习基础知识,从而得倒了这个机会。有几个方面的基础知识,我建议每一位PHP程序员都应该好好学习一下。我推荐几本书给大家,包括深入理解计算机系统、现代操作系统、C程序设计语言、C语言数据结构和算法、Unix环境高级编程、TCP/IP网络通信详解。另外我建议大家学习一下面向对象方面知识,PHP这方面的书不太多,建议看Java面向对象编程、Java编程思想、J2EE这些书。PHP语言基础方面,建议认真地把PHP5权威编程这本书好好读完。另外不光要读,还要照着书中的讲解动手去编程实践。

总之有一个好的基础,再去学LAMP、Redis、PHP框架、前端,这样取得的成就更大。这与年龄无关、与学历无关、与智力无关,与天赋也无关。只要肯努力学习,人人可以成为技术大牛。

转载自: http://rango.swoole.com/archives/570

一种PHP的nginx伪静态写法

众所周知,thinkphp5的Nginx写法是这样子的:

location / {
   if (!-e $request_filename) {
      rewrite  ^(.*)$  /index.php?s=/$1  last;
   }
}

现在网站根目录下面有一个admin.php文件

请求http://abc.com/admin.php/login时候,请求会被nginx转发到index.php

按照开发需求,则需要转发至admin.php

nginx单host完整配置代码如下

server {
     listen 80;
     server_name abc.com;
     root /xxxx/xxxx;
     index index.html index.htm index.php;
     charset utf-8;
	location ~ [^/]\.php(/|$)
	{
		try_files $uri =404;
		fastcgi_pass  127.0.0.1:9000;
		fastcgi_index index.php;
		include fastcgi.conf;
		set $real_script_name $fastcgi_script_name;
		if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
			set $real_script_name $1;
			set $path_info $2;
		}
		fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
		fastcgi_param SCRIPT_NAME $real_script_name;
		fastcgi_param PATH_INFO $path_info;
	}

	location / {
		if (!-e $request_filename) {
			rewrite  ^/(.*)$  /index.php?s=/$1 last;
			break;
		}
	}
}

如何让laravel永远返回json串,包含报错内容

在使用laravel做API服务端的时候,想让laravel永远返回json串,方便App端或者ajax查看调试信息.

思路:让Illuminate/Http/Request类的expectsJson、wantsJson这两个方法永远返回true

这个Request类是composer提供的,我们不能直接修改,先extends这个类,然后我们覆盖这两个方法。

<?php

namespace App\Http\Requests;

use Illuminate\Http\Request;

class BaseRequest extends Request {

public function wantsJson() {return true;}

public function expectsJson() {return true;}

}

在框架的index.php修改一下 注入的Request类

$response = $kernel->handle(
    $request = \App\Http\Requests\BaseRequest::capture()
);

之后,laravel返回的默认类型都是json了,包括了错误日志

参考:https://laravel-china.org/wikis/16069

composer版本符号

* : 最新版 


>=1.0: 大于等于1.0的最高版本 


>=1.0 <2.0:大于等于1.0且小于2.0的最高版本


1.0 – 2.0:1.0至2.0之间的最高版本 


1.0.*:>=1.0且<1.1的最高版本 


~1.2:>=1.2且<2.0的最高版本 


~1.2.3:>=1.2.3且<1.3.0最高版本 


^1.2.3:>=1.2.3且<2.0.0的最高版本

https://blog.csdn.net/hwhsong/article/details/79079197

PHP curl模拟form表单上传文件

关键代码如下:

$ch = curl_init('https://www.baidu.com/uploadImage');
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, ['file' => new \CURLFile($fileRealPath)]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);

备忘

PHP脚本实现webhook源码

error_reporting(1);
set_time_limit(0);
// 部署目录
$target = '/www/www.baidu.com';
// 部署密钥
$token = '123456789';
// 部署分支
$branch = 'develop';

// token判断
$request_token = isset($_SERVER['HTTP_X_GITLAB_TOKEN']) ? $_SERVER['HTTP_X_GITLAB_TOKEN'] : '';
if ($token !== $request_token) {
die;
}

// 分支判断
$arr = file_get_contents('php://input', 'r');
$arr = json_decode($arr, true);
if (JSON_ERROR_NONE !== json_last_error()) {
die;
}
$ref = isset($arr['ref']) ? $arr['ref'] : die;
$ref = explode('/', $ref);
$ref = array_pop($ref);
if ($branch != $ref) {
die;
}

$cmd = "(cd $target && git pull && composer install -vvv) > /dev/null 2>&1 &";
echo shell_exec($cmd);

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、使用减号代替下划线,推荐这个方法