Categories
php

php简介

    php原始为Personal Home Page的缩写,已经正式更名为 “PHP: Hypertext Preprocessor”。

    php依赖php运行容器即php进程,通过该进程对php文件进行输入处理,在 标准输出流 返回输出结果。特点运行简单,无需编译。在web容器下,每个请求都会产生一个php进程,所以只需把php文件更改后,立即访问该php文件,即可看见最新的更改(每发送一个请求,产生了新的进程重新读取文件)。调试十分方便。

运行php环境有多种方法

    1:通过php命令

    php -f “xxx.php” 通过指定需要加载php文件,开启php进程,在控制台标准输出流看到该文件的输出。

    php -s localhost:8080 (-t “项目文件夹”) 通过-t 指定php文件的文件夹,默认为当前进程执行文件夹目录。浏览器访问localhost:8080通过文件系统路径访问对应的文件(默认为index.php),即可在浏览器看到对应文件的输出。这个就是把php进程的输出流打在web容器的请求输出上,所以能在浏览器看到输出

    2:通过web容器访问。其实就是通过web容器执行请求输入到socket中(文件socket或端口socket都可)。服务器开启php-fpm服务,监听对应的socket作为进程输入,将php-fpm的标准输出流打在socket上供web容器读取。web容器再把socket的读取的内容作为请求响应返回给用户。(这就是标准的cgi做法,以进程标准输入流接受请求,标准输出流产生响应,一个请求就是一个进程)。

    nginx配置:

location ~ .php$ {
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

    apache配置:

LoadModule php7_module “${INSTALL_DIR}/bin/php/php7.1.9/php7apache2_4.dll”

<IfModule php7_module>
    DirectoryIndex index.php index.php3 
AddType application/x-httpd-php .php
    AddType application/x-httpd-php .php3
</IfModule>
Categories
php

php 自定义类替换第三方包同名文件

修改自动加载规则

  1. 调整composer.json:如果必须的话,你可以调整composer.json中的autoload部分,使得你的类优先于第三方包被加载。但是,这种方法较为复杂,并且可能导致难以预测的行为。json深色版本{ "autoload": { "psr-4": { "Vendor\\Package\\": "path/to/your/classes" } } }
  2. 重新dump自动加载器:当你改变了自动加载规则后,需要运行composer dump-autoload来更新自动加载器。
Categories
验光仪

尼德克对接协议

我们用

按下打印键会收到

NCP10 模式
bluetooth data :  DRMIDNIDEK/ARK-1N
nidek.js:251 bluetooth data :  O0694DADEC/31/2024.
nidek.js:251 bluetooth data :  19:56VD12.00WD40O
nidek.js:251 bluetooth data :  L-02.00-00.50167OL-
nidek.js:251 bluetooth data :  02.00-00.501709 OL-
nidek.js:251 bluetooth data :  02.00-00.501669 OL-
nidek.js:251 bluetooth data :  02.00-00.501679 OR-
nidek.js:251 bluetooth data :  01.75-00.75004OR-01
nidek.js:251 bluetooth data :  .75-00.750039 OR-01
nidek.js:251 bluetooth data :  .75-00.750049 OR-01
nidek.js:251 bluetooth data :  .75-00.750059 PD69?
nidek.js:251 bluetooth data :  ?????DKM L08.0907
nidek.js:251 bluetooth data :  .8717107.98DL41.754
nidek.js:251 bluetooth data :  3.0017142.25-01.25 
nidek.js:251 bluetooth data :  L08.1007.8717107.99
nidek.js:251 bluetooth data :  DL41.7543.0017142.25
nidek.js:251 bluetooth data :  -01.25 L08.0907.871
nidek.js:251 bluetooth data :  7107.98DL41.7543.00
nidek.js:251 bluetooth data :  17142.25-01.25 L08.
nidek.js:251 bluetooth data :  0907.8517107.97DL41
nidek.js:251 bluetooth data :  .7543.0017142.25-01.
nidek.js:251 bluetooth data :  25 R08.0707.7800507
nidek.js:251 bluetooth data :  .93DR41.7543.500054
nidek.js:251 bluetooth data :  2.50-01.75 R08.0807
nidek.js:251 bluetooth data :  .7900507.94DR41.754
nidek.js:251 bluetooth data :  3.2500542.50-01.50 
nidek.js:251 bluetooth data :  R08.0707.7800507.93
nidek.js:251 bluetooth data :  DR41.7543.5000542.50
nidek.js:251 bluetooth data :  -01.75 R08.0607.780
nidek.js:251 bluetooth data :  0507.92DR41.7543.50
nidek.js:251 bluetooth data :  00542.50-01.75SL11.
nidek.js:251 bluetooth data :  9PL05.4NSR12.1PR0
nidek.js:251 bluetooth data :  5.0N8141
DRMIDNIDEK/ARK-1NO0694DADEC/31/2024.19:56VD12.00WD40OL-02.00-00.50167OL-02.00-00.501709 OL-02.00-00.501669 OL-02.00-00.501679 OR-01.75-00.75004OR-01.75-00.750039 OR-01.75-00.750049 OR-01.75-00.750059 PD69??????DKM L08.0907.8717107.98DL41.7543.0017142.25-01.25 L08.1007.8717107.99DL41.7543.0017142.25-01.25 L08.0907.8717107.98DL41.7543.0017142.25-01.25 L08.0907.8517107.97DL41.7543.0017142.25-01.25 R08.0707.7800507.93DR41.7543.5000542.50-01.75 R08.0807.7900507.94DR41.7543.2500542.50-01.50 R08.0707.7800507.93DR41.7543.5000542.50-01.75 R08.0607.7800507.92DR41.7543.5000542.50-01.75SL11.9PL05.4NSR12.1PR05.0N8141

example:

 DRMIDNIDEK/ARK-1N
nidek.js:251 bluetooth data :  O0695DADEC/31/2024.
nidek.js:251 bluetooth data :  20:34VD12.00WD40O
nidek.js:251 bluetooth data :  L-02.00-00.50166OL-
2nidek.js:251 bluetooth data :  02.00-00.501669 OL-
nidek.js:251 bluetooth data :  02.00-00.501679 OR-
nidek.js:251 bluetooth data :  01.75-01.00006OR-01
2nidek.js:251 bluetooth data :  .75-01.000069 OR-01
nidek.js:251 bluetooth data :  .75-01.000079 PD68?
nidek.js:251 bluetooth data :  ?????DKM L08.0907
nidek.js:251 bluetooth data :  .8917507.99DL41.754
nidek.js:251 bluetooth data :  2.7517542.25-01.00 
nidek.js:251 bluetooth data :  L08.0907.8817507.99
nidek.js:251 bluetooth data :  DL41.7542.7517542.25
nidek.js:251 bluetooth data :  -01.00 L08.0907.891
nidek.js:251 bluetooth data :  7507.99DL41.7542.75
nidek.js:251 bluetooth data :  17542.25-01.00 L08.
nidek.js:251 bluetooth data :  0907.8917507.99DL41
nidek.js:251 bluetooth data :  .7542.7517542.25-01.
nidek.js:251 bluetooth data :  00 R08.0707.7700807
nidek.js:251 bluetooth data :  .92DR41.7543.500084
nidek.js:251 bluetooth data :  2.50-01.75 R08.0707
nidek.js:251 bluetooth data :  .7700807.92DR41.754
nidek.js:251 bluetooth data :  3.5000842.50-01.75 
nidek.js:251 bluetooth data :  R08.0707.7700807.92
nidek.js:251 bluetooth data :  DR41.7543.5000842.50
nidek.js:251 bluetooth data :  -01.75 R08.0707.770
nidek.js:251 bluetooth data :  0807.92DR41.7543.50
nidek.js:251 bluetooth data :  00842.50-01.75SL11.
nidek.js:251 bluetooth data :  9PL05.0NSR12.2PR0
nidek.js:251 bluetooth data :  5.1N816D
Categories
验光仪

索维SW800 蓝牙对接协议

example

{"PatientId":20241231000001,"Name":"","Sex":2,"DeviceId":"AH0078GY1A","DeviceName":"SW-800","CaseId":"000000000000000000","ClinicResult":[{"LAxis1":63,"LAxis2":153,"LDC1":-0.25,"LDC2":0.25,"LDS1":-3.00,"LDS2":-3.25,"LSE1":-3.25,"LSE2":-3.25,"LGazeH":5,"LGazeV":1,"LPupil":4.20,"LReflex":31.37,"LRangeH":-3.20,"LSpeedH":-100.00,"LRangeV":-2.90,"LSpeedV":-90.63,"RAxis1":123,"RAxis2":33,"RDC1":-0.25,"RDC2":0.25,"RDS1":-2.00,"RDS2":-2.25,"RSE1":-2.25,"RSE2":-2.25,"RGazeH":-2,"RGazeV":0,"RPupil":4.40,"RReflex":42.35,"RRangeH":-6.00,"RSpeedH":-187.50,"RRangeV":5.70,"RSpeedV":59.38,"PD":63,"ReflexDiffer":10.98,"ExamType":10,"EyeType":3,"CreationTime":"2024-12-31T14:47:53","Id":20241231000001}]}
{
    "PatientId":20241231000001,
    "Name":"",
    "Sex":2,
    "DeviceId":"AH0078GY1A",
    "DeviceName":"SW-800",
    "CaseId":"000000000000000000",
    "ClinicResult":[
        {
            "LAxis1":63,
            "LAxis2":153,//左眼轴位
            "LDC1":-0.25,
            "LDC2":0.25, //左眼柱镜
            "LDS1":-3,
            "LDS2":-3.25,//左眼球镜
            "LSE1":-3.25,
            "LSE2":-3.25,//左眼等效球镜
            "LGazeH":5, //左眼水平瞳孔中心 左正右负
            "LGazeV":1, //左眼竖直瞳孔中心 下正上负
            "LPupil":4.2,//左眼瞳孔大小
            "LReflex":31.37,
            "LRangeH":-3.2,
            "LSpeedH":-100,
            "LRangeV":-2.9,
            "LSpeedV":-90.63,
            "RAxis1":123,
            "RAxis2":33,//右眼轴位
            "RDC1":-0.25,
            "RDC2":0.25,//右眼柱镜
            "RDS1":-2,
            "RDS2":-2.25,//右眼球镜
            "RSE1":-2.25,
            "RSE2":-2.25,//右眼等效球镜
            "RGazeH":-2, //右眼水平瞳孔中心 左正右负
            "RGazeV":0,  //右眼竖直瞳孔中心 下正上负
            "RPupil":4.4,//右眼瞳孔大小
            "RReflex":42.35,
            "RRangeH":-6,
            "RSpeedH":-187.5,
            "RRangeV":5.7,
            "RSpeedV":59.38,
            "PD":63, //瞳距
            "ReflexDiffer":10.98,
            "ExamType":10,
            "EyeType":3,
            "CreationTime":"2024-12-31T14:47:53",
            "Id":20241231000001
        }
    ]
}

BLE 蓝牙信息

service UUID

0000180D-0000-1000-8000-00805F9B34FB

character UUID

00002A39-0000-1000-8000-00805F9B34FB
Categories
验光仪

法里奥对接协议

按下打印按钮后会收到

通知指令 指令(FKR710->上位机) 指令:#!< DATY 00 #!>,该指令表示 FKR710 存在数据记录 指令:#!< DATN 00 #!>,该指令表示 FKR710 不存在数据记录 该指令在 FKR710 端触发“打印”键时由 FKR710 发出注 1,上位机针对该指令不需应答。

#!<DATY00#!>

此时要回复

获取右眼屈光数据

#!<REFR#!>

应答

#!<REFR0167.012.00-02.25---02.00-00.50006#!>

获取左眼屈光数据

#!<REFL#!>

应答

#!<REFL0167.012.00-02.25---02.00-00.75159#!>

获取右眼角膜数据

#!<KRTR#!>

应答

#!<KRTR0167.000.00-01.20MM+08.08+07.85006#!>

获取左眼角膜数据

#!<KRTL#!>

应答

#!<KRTL0167.000.00-01.10MM+08.08+07.88174#!>

返回例子

bluetooth data :  #!<DATY00#!>
falio.js:259 exam data : #!<DATY00#!>
falio.js:262 trigger printing
falio.js:277 writeBLECharacteristicValue success writeBLECharacteristicValue:ok
falio.js:298 writeBLECharacteristicValue success writeBLECharacteristicValue:ok
falio.js:219 bluetooth data :  #!<REFR0167.012.00-0
falio.js:219 bluetooth data :  2.25---02.00-00.5000
falio.js:318 writeBLECharacteristicValue success writeBLECharacteristicValue:ok
falio.js:219 bluetooth data :  6#!>#!<REFL0167.012.
falio.js:259 exam data : #!<REFR0167.012.00-02.25---02.00-00.50006#!>
falio.js:219 bluetooth data :  00-02.25---02.00-00.
falio.js:219 bluetooth data :  75159#!>#!<KRTR0167.
falio.js:259 exam data : #!<REFL0167.012.00-02.25---02.00-00.75159#!>
falio.js:338 writeBLECharacteristicValue success writeBLECharacteristicValue:ok
falio.js:219 bluetooth data :  000.00-01.20MM+08.08
falio.js:219 bluetooth data :  +07.85006#!>
falio.js:259 exam data : #!<KRTR0167.000.00-01.20MM+08.08+07.85006#!>
falio.js:219 bluetooth data :  #!<KRTL0167.000.00-0
falio.js:219 bluetooth data :  1.10MM+08.08+07.8817
falio.js:219 bluetooth data :  4#!>
falio.js:259 exam data : #!<KRTL0167.000.00-01.10MM+08.08+07.88174#!>
Categories
php

laravel wechat

用户登录流程

小程序调用 wx.login 后获得 code ,调用 laravel-wechat 的login 接口

https://depscreen.studentvision.cn/api/wechat/mini/login

返回 用户个人信息 openid accessToken 等

{
	"error_code": 0,
	"data": {
		"access_token": "bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2RlcHNjcmVlbi5zdHVkZW50dmlzaW9uLmNuL2FwaS93ZWNoYXQvbWluaS9sb2dpbiIsImlhdCI6MTczMzk4NzMzMCwiZXhwIjoxNzMzOTkwOTMwLCJuYmYiOjE3MzM5ODczMzAsImp0aSI6IkFUTTloR1dvU1VuNjlaWWgiLCJzdWIiOiIxIiwicHJ2IjoiNDI1MTRkODBlZTM4NWRhODRjYTM4YWY0NTgyZThmNTRiYjRjZmIzOSJ9.qLXirUDL8GJjkg3LS47_J1LEpdA5j02VgyfUrt6RrpY",
		"expires_in": 3600,
		"wechat_user": {
			"id": 1,
			"app_id": "wx621e0fe15a370854",
			"user_id": "0",
			"openid": "oLG3w68wIQoTn5BwLOVyREIMtiFM",
			"nickname": null,
			"avatar": null,
			"gender": "0",
			"country": null,
			"province": null,
			"city": null,
			"subscribed_at": null,
			"created_at": "2024-12-11T04:15:17.997000Z",
			"updated_at": "2024-12-11T04:15:17.997000Z",
			"gender_readable": null
		}
	}
}

之后的每个请求都要带上 该jwt access token 作为通信票据以保证安全

Accept:application/json
Content-Type:application/json
Authorization:bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2RlcHNjcmVlbi5zdHVkZW50dmlzaW9uLmNuL2FwaS93ZWNoYXQvbWluaS9sb2dpbiIsImlhdCI6MTczMzk4NzMzMCwiZXhwIjoxNzMzOTkwOTMwLCJuYmYiOjE3MzM5ODczMzAsImp0aSI6IkFUTTloR1dvU1VuNjlaWWgiLCJzdWIiOiIxIiwicHJ2IjoiNDI1MTRkODBlZTM4NWRhODRjYTM4YWY0NTgyZThmNTRiYjRjZmIzOSJ9.qLXirUDL8GJjkg3LS47_J1LEpdA5j02VgyfUrt6RrpY

controller 增加一个middleware 作为checking

Route::middleware('auth:mini')

具体实现类是
这个作为jwt入口
 Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
 php artisan  jwt:secret

该命令可以重新生成jwt 私钥

Categories
K8S

Traefik Controller

K3S 默认安装 Traefik 作为ingress 控制器

默认没有开启dashboard 且 占用了各个node的80 和 443 端口

traefix配置在kube-system 命名空间内

一个例子 暴露8081 的nexus-service

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: nexus-ingress
  namespace: nexus
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`nexus.local`) # 域名
    kind: Rule
    services:
      - name: nexus-service  
        port: 8081
Categories
K8S

APISIX

apisix 作为流量网关

其本身数据通讯以来etcd

页面配置以来apisix-dashboard

以后是三个docker镜像的启动配置

containerd 脚本

apisix

#!/bin/sh
ctr run --detach --net-host --mount type=bind,src=/home/pi/apisix/apisix/config/conf.yaml,dst=/usr/local/apisix/conf/config.yaml,options=rbind:rw 192.168.0.30:30003/apache/apisix:latest apisix

dashboard

#!/bin/sh
ctr run -d --net-host --env DASHBOARD_LISTEN_IP=0.0.0.0 --env DASHBOARD_LISTEN_PORT=9000 --mount type=bind,src=/home/pi/apisix/apisix-dashboard/config/conf.yaml,dst=/usr/local/apisix-dashboard/conf/conf.yaml,options=rbind:rw 192.168.0.30:30003/apache/apisix-dashboard:latest apisix-dashboard

etcd

#!/bin/sh
ctr run --detach --net-host --env ALLOW_NONE_AUTHENTICATION=yes --env ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379 --env ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 192.168.0.30:30003/bitnami/etcd:latest my-etcd

apisix 和 dashboard都指定了配置文件(十分重要 对接promethus + grafana 也是在这里暴露一个metric作为endpoint)

在promethus.yml添加一个job

scrape_configs:
- job_name: 'apisix'
  static_configs:
    - targets: ['apisix:9091/metric'] 更改为指定apisix 的endpoint
Categories
linux

设置静态IP

一般通过命令nmtui设置

Categories
linux

linux 硬盘管理常用命令

dd

硬盘复制用命令 镜像复制命令

例子

sudo dd if=openwrt-image.img of=/dev/mmcblk0 bs=4M status=progress
复制当前目录下 openwrt-image.img 镜像  到/dev/mmcblk0 的硬盘

sudo dd if=/dev/mmcblk1 of=/dev/mmcblk0 bs=4M status=progress
将/dev/mmcblk1整个硬盘复制到/dev/mmcblk0  /dev/mmcblk0容量大于/dev/mmcblk1

sudo dd if=/dev/zero of=/dev/mmcblk0 bs=4M status=progress
清空控盘内容(全写0)

fdisk

管理查看硬盘分区信息

例子

sudo fdisk /dev/mmcblk0  
然后会进入硬盘命令行子命令交互空间

df

查看硬盘占用情况

df ./
展示当前目录所在硬盘分区占用情况

df -h
展示系统硬盘分区占用情况  包括挂载点信息

mount

挂载分区到某个挂载点

sudo mount /dev/mmcblk0p2 /mnt
其实一般当自动插入sd卡 或者USB就会自动挂载到这里
但是要改变挂载方式(可读可写) 就要先卸载在挂载

sudo mount -o rw /dev/mmcblk0p2 /mnt
增加-o rw 即为可读可写

umount

卸载分区

sudo umount /dev/mmcblk0p2

ln

这个命令可以为文件夹和文件设置硬链接和软连接

个人更加推崇软连接(硬链接是硬盘级别内部的连接 不能跨硬盘,软连接可以)

ln -s /path/to/source /path/to/destination

/etc/fstab

这个文件用来设置文件系统自动挂载

sudo blkid
列出系统所有分区的uuid

/etc/fstab 添加一行

UUID=1234-5678 /mnt ntfs rw 0 0

UUID=1234-5678:替换为你在步骤 1 中获取的 UUID。
/mnt:替换为你创建的挂载点。
ntfs:替换为你的文件系统类型(例如 ext4、ntfs 等)。
rw:默认挂载选项,包括 rw(读写)、suid、dev、exec、auto、nouser 和 async。
0 0:表示不进行备份和不进行文件系统检查。

Categories
K8S

K3S PVC local drive SD卡扩容

默认node 实体机器 PVC文件夹

/var/lib/kubelet/pods/<pod-uid>/volumes/kubernetes.io~csi/<pvc-name>/mount

可以通过 yaml 改变路径

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /mnt/data
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - your-node-name

通过 spec.local.path 设置指定路径