laravel 的单元测试(tests/Unit目录下),不支持很多内置函数,适合测试不依赖laravel方法的独立方法。
否则会报错,例如在一个job中引用了config(‘xxxx’),执行test时会报错。
将测试方法放到tests/Feature 中,运行成功,因此laravel unit测试里的方法适合独立的自定义方法,并且没有依赖laravel本身的方法。
laravel 的单元测试(tests/Unit目录下),不支持很多内置函数,适合测试不依赖laravel方法的独立方法。
否则会报错,例如在一个job中引用了config(‘xxxx’),执行test时会报错。
将测试方法放到tests/Feature 中,运行成功,因此laravel unit测试里的方法适合独立的自定义方法,并且没有依赖laravel本身的方法。
OTP简介
一次性密码(One Time Password,简称OTP),又称“一次性口令”,是指只能使用一次的密码。一次性密码是根据专门算法、每隔60秒生成一个不可预测的随机数字组合,iKEY一次性密码已在金融、电信、网游等领域被广泛应用,有效地保护了用户的安全。
Exif 扩展
通过使用 exif 扩展,你可以操作图像元数据。 例如:你可以使用 exif 相关的函数从数码相机拍摄的图片文件中读取元数据。 通常 JPEG 和 TIFF 格式的图像文件都包含元数据。
可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
GD 扩展
GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片,也可以给图片加水印
ImageMagick 扩展
ImageMagick图片处理是一套功能强大、稳定而且免费的工具集和开发包,可以用来读、写和处理超过90种的图片文件,包括流行的TIFF、JPEG、GIF、 PNG、PDF以及PhotoCD等格式。 [1] 利用ImageMagick,你可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成。同时ImageMagick提供了一个高质量的2D工具包,部分支持SVG。ImageMagic的主要精力集中在性能,减少bug以及提供稳定的API和ABI上。
php扩展 Imagick是用 ImageMagic API 来创建和修改图像的PHP官方扩展。所以使用时不需要安装ImageMagick 软件,只需要安装Imagick扩展就可以了
Gmagick 扩展
GraphicsMagick 是一个用来读写、生成超过90种图像格式的工具集合,支持包括 TIFF, JPEG, JPEG-2000,PNG, PDF, PhotoCD, SVG, 和GIF 等图像格式。GraphicsMagick 是基于 ImageMagick 开发的。
linux安装webp支持
不安装情况下,无法用php程序读取(或者转换成)webp图片
ubuntu
sudo apt install webp
centos
yum -y install libwebp-devel libwebp-tools
Database Tools
mysql workbench | navicat 15 激活
PHP
开发环境 oneinstack
Javascript
开发环境 nvm
接口文档工具
showDoc php开发的几口文档管理工具,简介,支持shell脚本通过注释自动生成接口文档
YAPI YAPI是由去哪儿网移动架构组开发的可视化接口管理工具
参考链接 https://juejin.cn/post/6844903874046722055
IDE
vscode 常用插件
配置示例
基于oneinstack安装包生成的配置文件
php-fpm配置文件
位置/usr/local/php/etc/php/php-fpm.conf
;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;
[global]
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = warning
emergency_restart_threshold = 30
emergency_restart_interval = 60s
process_control_timeout = 5s
daemonize = yes
;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;
include = /usr/local/php/etc/php-fpm.d/*.conf
线程池配置目录
develop.conf
[develop]
//不同的线程池使用不同的sock文件
//nginx配置文件监听对应的sock
listen = /dev/shm/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = yangliuan
listen.group = yangliuan
listen.mode = 0666
user = yangliuan
group = yangliuan
pm = dynamic
pm.max_children = 6
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 6
pm.max_requests = 2048
pm.process_idle_timeout = 10s
request_terminate_timeout = 600
request_slowlog_timeout = 0
pm.status_path = /php-fpm_status
slowlog = var/log/slow.log
rlimit_files = 51200
rlimit_core = 0
catch_workers_output = yes
env[HOSTNAME] = yangliuan-TM1707
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
分块上传
https://github.com/peinhu/aetherupload-laravel 分块上传插件
原理使用浏览器对文件的分块slice()方法,后端php使用file_put_contents() 的FILE_APPEND
的追加写入数据功能,或者fopen() 函数的 a+
模式
直接上传
适合局域网项目
php-fpm配置文件修改
request_terminate_timeout = 120 设置单个请求的超时中止时间。该选项可能会对 php.ini 设置中的 'max_execution_time' 因为某些特殊原因没有中止运行的脚本有用。
php.ini配置修改
upload_max_filesize = 2048M 最大文件大小
post_max_size = 2048M post传输最大文件大小
max_execution_time = 600 php脚本最大运行时间
max_input_time = 600 脚本解析输入数据(类似 POST 和 GET)允许的最大时间,单位是秒。 它从接收所有数据到开始执行脚本进行测量的。
nginx配置修改
client_max_body_size 4096m; 客户端请求的最大主体内容
fastcgi_connect_timeout 600 指定nginx与后端fastcgi server连接超时时间
fastcgi_send_timeout 600 指定nginx向后端传送请求超时时间(指已完成两次握手后向fastcgi传送请求超时时间)
fastcgi_read_timeout 600 指定nginx接受后端fastcgi响应请求超时时间 (指已完成两次握手后nginx接受fastcgi响应请求超时时间)
参考
写这篇文章的起因,逛论坛读到一位博主的成长感悟,说他面试,被一个问题卡住了。PHP接受GET,POST请求分别$_GET,$_POST或$_REQUEST ,那么PHP如何接受PUT,PATCH,DELETE,OPTIONS请求。
引申问题PHP如何处理(接收)HTTP请求?
前置知识只是HTTP请求方法有哪些?https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods
HTTP1.0: GET POST HEAD | |
HTTP1.1: GET POST HEAD OPTIONS PUT PATCH DELETE TRACE | |
HTTP2.0: GET POST HEAD OPTIONS PUT PATCH DELETE TRACE |
PHP原生方法如何获取请求参数
$_GET,$_POST,$_REQUEST,file_get_content('php://input')
GET请求
GET query param $_GET $_REQUEST 可以获取
GET x-www-form-urlencoded php://input 可以获取
GET Form-data php://input 可以获取
GET application/json php://input 可以获取
POST请求
POST query param $_GET 和 $_REQUEST 可以获取
POST x-www-form-urlencoded $_POST $_REQUEST php://input 可以获取
POST Form-data $_POST $_REQUEST 可以获取
POST application/json php://input 可以获取
PUT 请求
PUT query-param $_GET 和 $_REQUEST 可以获取
PUT x-www-form-urlencoded php://input 可以获取
PUT form-data php://input 可以获取
PUT application/json php://input 可以获取
PATCH 请求
PATCH query-param $_GET 和 $_REQUEST 可以获取
PATCH x-www-form-urlencoded php://input 可以获取
PATCH form-data php://input 可以获取
PATCH application/json php://input 可以获取
DELETE 请求
DELETE query-param $_GET 和 $_REQUEST 可以获取
DELETE x-www-form-urlencoded php://input 可以获取
DELETE form-data php://input 可以获取
DELETE application/json php://input 可以获取
Laravel框架如何处理HTTP请求
支持的请求方法和数据交互类型
请求类型 | 支持的请求方法 | 说明 |
query param | GET,POST,PUT,DELETE,PATCH,OPTIONS | 查询字符串, 即url ? 后边的参数&和=拼接 |
url带数值 | GET,POST,PUT,DELETE,PATCH,OPTIONS通过/分割的 示例/xxx.com/user/1 1就是参数值 | 通过/分割的 示例/xxx.com/user/1 1就是参数值 |
form-data | POST | multipart/form-data 支持二进制数据上传文件必须使用此类型 |
x-www-form-urlencoded (form) | POST,PUT,DELETE,PATCH,OPTIONS | application/x-www-form-urlencoded 数据被编码成以 ‘&’ 分隔的键-值对 |
appliction/json | GET,POST,PUT,DELETE,PATCH,OPTIONS | json类型 |
获取方法
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* 存储一个新用户
*
* @param Request $request
* @return Response
*/
public function store(Request $request,$id)
{
//接受所有类型参数,无法获取上传文件
$name = $request->input('name');
//仅能接受查询字符串参数,?号后的参数
$name = $request->query('name');
//接受所有类型参数,包含上传文件,动态属性获取,触发__get()魔术方法
$name = $request->name;
//获取上传文件
$file = $request->file('file');
//同input是底层Symfony提供的方法,无法获取上传文件
$name = $request->get('name');
//获取路由参数,直接访问注入的$id变量
dump($id);
//获取原始输入数据symfony提供的方法,等于原生php的file_get_content('php://input')
$request->getContent()
}
}
原理和知识总结
laravel使用了symfony的HTTP请求类获取去请求,底层还是通过PHP超全局变量来获取请求参数
Symfony\Component\HttpFoundation\Request
/**
* Creates a new request with values from PHP's super globals.
*
* @return static
*/
public static function createFromGlobals()
{
//使用php超全局变量获取请求数据
$request = self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER);
if ($_POST) {
$request->request = new InputBag($_POST);
} elseif (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
&& \in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), ['PUT', 'DELETE', 'PATCH'])
) {
parse_str($request->getContent(), $data);
$request->request = new InputBag($data);
}
return $request;
}
参考
Lnmp环境运行时一般会指定用户www运行。因此配置定时任务的时候,也需要使用www用户来运行定时任务,否则会造成laravel生成的日志是其它用户,导致laravel运行报错,没有日志的可写权限。
配置方法
1.获取当前系统PHP的环境变量
执行 env > /tmp/env.output 然后 cat /tmp/env.output
找到PATH
PATH=/usr/local/mysql/bin:/usr/local/php/bin:/usr/local/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
2.设置定时任务 -u 参数指定用户 命令参考 给www用户的crontab 添加环境变量PATH
crontab -u www -e
将PATH添加到crontab的第一行,
换行后将laravel的定时任务代码加上,截图中第二行, 制定了环境变量后,可以只写php 不用写php的完整路径 /usr/local/php/bin/php
3,不能遗漏的关键一步
在home目录下创建对应用户的文件目录,www 并修改用户权限为www 最后重启定时任务
cd home && mkdir www && chown -R www.www www
service crond restart
如果没有该用户的目录,crontab日志会有报错
(CRON) ERROR chdir failed (/home/www): No such file or directory
知识总结
Crontab详细介绍可以头部的参考链接,和《鸟哥linux私房菜-基础学习篇》第16章
任务调度分为两类: 系统任务调度 和 用户任务调度
系统任务配置/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
前四行是用来配置crond任务运行的环境变量,
crontab – u xxx -e 是用来设置用户系统任务调度的
所有用户定义的crontab文件都被保存在/var/spool/cron
目录中。其文件名与用户名一致,使用者权限文件如下
/etc/cron.deny 该文件中所列用户不允许使用crontab命令
/etc/cron.allow 该文件中所列用户允许使用crontab命令
/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名
注意单独用户的crontab配置需要设置 PATH 并创建对应用户目录
service crond start # 启动服务
service crond stop # 关闭服务
service crond restart # 重启服务
service crond reload # 重新载入配置
service crond status # 查看状态
参考
PHP框架
PECL扩展框架
类库工具
图像处理
文件处理
Office文档处理
爬虫
MCU 参考
微控制单元,俗称单片机
micro python
在单片机上运行的精简python版本
socket 通信
粘包,少包,数据在内存中的存储字节序列解析及封装,包括 socket 优化及多进程时 socket 与惊群的效应问题解决办法
关于通信协议最基础的你必须知道 MQTT 协议及 MQTT-SN 协议的解释及封装和算法,我们的传感器设备大部分是 MQTT-SN 和字节流通信协议。
用到的时候后续补充