Gowhich

Durban's Blog

思路

本地安装多个PHP版本,默认的不同版本对应不同的路径

1
2
3
4
5
/usr/bin/php7.1
/usr/bin/php7.2
/usr/bin/php7.3
/usr/bin/php8.3
/usr/bin/php8.4

默认的PHP路径

1
/usr/bin/php -> /etc/alternatives/php -> /usr/bin/php7.1

于是想要切换PHP版本其实只要更改/etc/alternatives/php的指向即可

脚本记录如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/bin/bash

# PHP版本切换脚本
# 该脚本通过修改/etc/alternatives/php软链接来切换PHP版本

# 定义PHP版本路径
PHP71_PATH="/usr/bin/php7.1"
PHP72_PATH="/usr/bin/php7.2"
PHP73_PATH="/usr/bin/php7.3"
PHP83_PATH="/usr/bin/php8.3"
PHP84_PATH="/usr/bin/php8.4"
ALTERNATIVES_PATH="/etc/alternatives/php"

# 检查是否以root权限运行
if [ "$(id -u)" -ne 0 ]; then
echo "错误:此脚本需要以root权限运行,请使用sudo或切换到root用户。" >&2
exit 1
fi

# 检查PHP可执行文件是否存在
check_php_exists() {
if [ ! -f "$1" ]; then
echo "错误:PHP可执行文件 $1 不存在。" >&2
return 1
fi
return 0
}

# 切换PHP版本
switch_php_version() {
local target_path=$1
local version_name=$2

# 检查目标文件是否存在
if ! check_php_exists "$target_path"; then
return 1
fi

# 移除现有软链接
if [ -L "$ALTERNATIVES_PATH" ]; then
rm -f "$ALTERNATIVES_PATH"
elif [ -e "$ALTERNATIVES_PATH" ]; then
echo "错误:$ALTERNATIVES_PATH 不是一个软链接。" >&2
return 1
fi

# 创建新的软链接
ln -s "$target_path" "$ALTERNATIVES_PATH"

# 验证切换结果
if [ $? -eq 0 ]; then
echo "成功切换到PHP $version_name"
echo "当前PHP版本:"
$ALTERNATIVES_PATH -v | head -n 1
return 0
else
echo "切换PHP版本失败" >&2
return 1
fi
}

# 显示当前版本
show_current_version() {
echo "当前PHP版本:"
if [ -L "$ALTERNATIVES_PATH" ]; then
readlink "$ALTERNATIVES_PATH"
$ALTERNATIVES_PATH -v | head -n 1
else
echo "未设置有效的PHP版本链接"
fi
}

# 显示帮助信息
show_help() {
echo "PHP版本切换工具"
echo "用法: $0 [选项]"
echo "选项:"
echo " 7.1 切换到PHP 7.1版本"
echo " 7.2 切换到PHP 7.2版本"
echo " 7.3 切换到PHP 7.3版本"
echo " 8.3 切换到PHP 8.3版本"
echo " 8.4 切换到PHP 8.4版本"
echo " current 显示当前PHP版本"
echo " help 显示此帮助信息"
}

# 根据参数执行相应操作
case "$1" in
"7.1")
switch_php_version "$PHP71_PATH" "7.1"
;;
"7.2")
switch_php_version "$PHP72_PATH" "7.2"
;;
"7.3")
switch_php_version "$PHP73_PATH" "7.3"
;;
"8.3")
switch_php_version "$PHP83_PATH" "8.3"
;;
"8.4")
switch_php_version "$PHP84_PATH" "8.4"
;;
"current")
show_current_version
;;
"help")
show_help
;;
*)
echo "无效的选项。请使用 '$0 help' 查看可用选项。" >&2
exit 1
;;
esac

exit 0

使用说明:

  • 将脚本保存为switch_php_version.sh
  • 赋予执行权限:chmod +x switch_php_version.sh
  • 使用方法:
    • 切换到 PHP 7.1:sudo ./switch_php_version.sh 7.1
    • 切换到 PHP 8.4:sudo ./switch_php_version.sh 8.4
    • 查看当前版本:./switch_php_version.sh current
    • 查看帮助:./switch_php_version.sh help

脚本特点:

  • 需要 root 权限运行(因为要修改系统目录下的软链接)
  • 会检查目标 PHP 版本文件是否存在
  • 切换后会显示当前 PHP 版本信息进行验证
  • 处理了软链接不存在或不是链接的异常情况

今天启动Virtualbox后启动不了报错,提示我运行

/sbin/vboxconfig

得到的结果提示如下

1
2
3
4
5
6
7
8
9
10
11
Kernel driver not installed (rc=-1908)

The VirtualBox Linux kernel driver is either not loaded or not set up correctly. Please try setting it up again by executing

'/sbin/vboxconfig'

as root.

If your system has EFI Secure Boot enabled you may also need to sign the kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load them. Please see your Linux system's documentation for more information.

where: suplibOsInit what: 3 VERR_VM_DRIVER_NOT_INSTALLED (-1908) - The support driver is not installed. On linux, open returned ENOENT.

社区的解决方案https://forums.virtualbox.org/viewtopic.php?t=110128

1
2
3
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/ppa -y
$ sudo apt update
$ sudo apt install g++-12 gcc-12

我执行上面的步骤没有问题后,重新运行还是不行

于是又执行了

/sbin/vboxconfig

ssl证书在当代是一个比较流行的技术

但是配置起来可谓是很麻烦,尤其是各大平台有免费的也是要自己去申请下,然后绑定dns验证,通过后在审批证书而且每年要自己去申请

技术是用来方便生活的,为何大家总想着为难自己也去为难别人

记录下使用经历

初次体验下来,最后的理想效果是能够进行自动更新免去了手动配置的烦恼

https://github.com/acmesh-official/acme.sh

这里是官方的地址,可以自行访问下

我记录下自己的使用心得

我用的是nginx

安装完acme.sh就可以生成证书了

1
acme.sh --issue -d gowhich.com -d www.gowhich.com -w /var/www/gowhich/web

我的博客是用Yii2搭建的,项目目录在/var/www/gowhich

如果你是其他的项目请自行查资料或者关注我交流下

1
2
3
4
[2023年 04月 13日 星期四 15:49:50 CST] Your cert is in: /home/dpzhang/.acme.sh/gowhich.com_ecc/gowhich.com.cer
[2023年 04月 13日 星期四 15:49:50 CST] Your cert key is in: /home/dpzhang/.acme.sh/gowhich.com_ecc/gowhich.com.key
[2023年 04月 13日 星期四 15:49:50 CST] The intermediate CA cert is in: /home/dpzhang/.acme.sh/gowhich.com_ecc/ca.cer
[2023年 04月 13日 星期四 15:49:50 CST] And the full chain certs is there: /home/dpzhang/.acme.sh/gowhich.com_ecc/fullchain.cer

最后生成的文件是这样的

我想的是就算后面到期的话,如果要手动进行操作的话,文件的存放还是一样的路径,所以我觉得直接用软链接就好了,这个就不用以后每次都去copy了

1
2
sudo ln -s /home/dpzhang/.acme.sh/gowhich.com_ecc/fullchain.cer ./gowhich.com.crt
sudo ln -s /home/dpzhang/.acme.sh/gowhich.com_ecc/gowhich.com.key ./gowhich.com.key

nginx的配置

1
2
ssl_certificate ssl/gowhich.com/gowhich.com.crt;
ssl_certificate_key ssl/gowhich.com/gowhich.com.key;

对应的路径可以根据具体的配置来配置

配置完之后重启下nginx就好了

前提条件

安装的版本

mariadb-5.5.68-linux-systemd-x86_64.tar.gz

由于最新的mysql不再适合我的古老项目,也没有升级,服务器上部署的是mysql5.7,本机器是ubuntu 22.04,apt安装的话的是mysql 8.0,降低版本安装暂时没有找到好的办法
而且想试试mariadb于是就搞了一个,其实把这种东西看作是软件就好了,毕竟这个报下载下来我就执行能运行了,不用再安装其他的依赖了。

安装解压后按照文件夹中INSTALL-BINARY进行安装使用就好了

配置文件修改

以前没注意,安装我看了下/etc/mysql目录,居然有这么多好东西

1
2
3
4
5
6
7
8
9
10
11
$ ll /etc/mysql     
总计 32K
drwxr-xr-x 2 root root 4.0K 10月 19 13:34 conf.d
-rw------- 1 root root 317 3月 14 09:35 debian.cnf
-rwxr-xr-x 1 root root 120 1月 28 22:44 debian-start
-rw-r--r-- 1 root root 1.1K 3月 15 18:15 mariadb.cnf
drwxr-xr-x 2 root root 4.0K 6月 17 2022 mariadb.conf.d
lrwxrwxrwx 1 root root 24 10月 19 13:34 my.cnf -> /etc/alternatives/my.cnf
-rw-r--r-- 1 root root 839 10月 20 2020 my.cnf.fallback
-rw-r--r-- 1 root root 682 3月 11 2021 mysql.cnf
drwxr-xr-x 2 root root 4.0K 3月 14 09:35 mysql.conf.d

然后我就改了mariadb.cnf

1
2
port = 3307
socket = /run/mysqld/mysqld.sock

主要是这两项,端口3307是为了跟mysql 8.0启动的端口做个区分

启动方式

1
2
cd /usr/local/mysql
sudo ./support-files/mysql.server start

启动后

1
2
3
mysql     120523       1  0 14:39 ?        00:00:05 /usr/sbin/mysqld
root 121333 1 0 14:42 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/durban-workspace.pid
mysql 121464 121333 0 14:42 ? 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/durban-workspace.err --pid-file=/usr/local/mysql/data/durban-workspace.pid --socket=/run/mysqld/mysqld.sock --port=3307

奇怪的是如何用起来 mariadb.cnf 这个配置文件的 我看了./support-files/mysql.server其实是使用的/etc/mysql/my.cnf

原来是软链接过去的

1
2
my.cnf -> /etc/alternatives/my.cnf
/etc/alternatives/my.cnf -> /etc/mysql/mariadb.cnf

这个操作没搞懂,不过不记得了,应该是在安装mariadb的时候操作的,具体细节忘记留意了

laravel-excel的安装直接看官网

官网地址 https://docs.laravel-excel.com/

使用场景记录:

导出一个表格,指定表头,指定对应的数据

需求很简单,不过使用新版本还是有点不知如何下手,不过仔细看了文档还是找到了办法,所以文档是一个好东西

说说以前是如何使用的

首先数据源的获取,这个是一致的,需要什么数据不管新版本旧版本都一样的

1
$data = [[1,2,3,4],[1,2,3,4]];

之前的版本”maatwebsite/excel”: “^2.1”

1
2
3
4
5
6
Excel::create('conversion', function($excel) use ($data) {
$excel->sheet('信息', function($sheet) use ($data) {
$sheet->rows($data);
$sheet->prependRow(['header1','header2','header3','header4']);
});
})->export('xlsx');

新版本”maatwebsite/excel”: “^3.1”就比较麻烦了

配置数据源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use Maatwebsite\Excel\Facades\Excel;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Illuminate\Support\Collection;
class DataExport implements FromCollection, WithHeadings
{
public function collection()
{
$data = [[1,2,3,4],[1,2,3,4]];
return new Collection($data);
}

public function headings(): array
{
return [
'header1',
'header2',
'header3',
'header4',
];
}
}

导出实现

1
Excel::store(new DataExport(), "invoices.xlsx");

看起来麻烦,不过梳理了之后感觉还是很方便的,应该算是增加了耦合度

composer不同php版本的使用方法

1
2
3
4
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

如果本地安装了多个版本的php,需要将不同版本的php重命名一下
比如安装了

7.1 7.2 7.3 8.1 8.2
那么,对应的重命名php的名称是
php7.1 php7.2 php7.3 php8.1 php8.2

之后安装composer的时候直接使用对应重命名的php就好了
比如使用php7.3

1
2
3
4
php7.3 -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php7.3 -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php7.3 composer-setup.php
php7.3 -r "unlink('composer-setup.php');"

如果需要制定composer的话,参考如下

1
php7.3 composer-setup.php --install-dir=/usr/local/bin --filename=composer7.3 

如果遇到错误提示

The installation directory “/usr/local/bin” is not writable

请加上sudo

1
sudo php7.3 composer-setup.php --install-dir=/usr/local/bin --filename=composer7.3 

之后就可以正常使用composer的命令

1
php7.3 /usr/local/bin/composer7.3 install -vvv

不过执行命令的时候需要将composer替换为composer7.3

对于其他的版本的也可以使用类似的方式

之前在mac下开发,使用sublime text一直很苦脑的问题就是方法跳转很慢,尤其是使用golang开发的时候

之前的就不再多提了,应该多少跟我的配置也有关系或者是因为系统的原因

现在开发转到了Linux上 Ubuntu系统,感觉一切只要折腾就会变的越来越好

系统环境

这个就是我现在的环境

然后sublime text的版本是Sublime Text Build 4143

然后我说下我这天改用sublime开始开发php语言的项目和golang语言的项目的一些情况

其实我的电脑配置现在来说不算很高,这台电脑是我从我老婆手里拿来的,本来要扔掉的,不过我怕浪费就买了内存和硬盘做了升级,期间安装过windows 但是使用起来,不利于我的开发,配置起来相当麻烦,可能跟我之前一直使用mac有关系

今天我就说下两个配置 很方便

如果是开发php项目的话

请安装LSP+LSP-intelephense,就安装完就可以了

如果是开发golang项目的花

请安装LSP+LSP-gopls,也是安装完就可以了

期间我遇到过一个问题就是安装完LSP-gopls后,启动服务器的时候一直报错提示我go path不存在,这个原因是zsh和bash的原因

就是sublime默认使用了~/.profile

然后我就通过terminal启动sublime就可以了,让他获取到我现在使用的zsh配置

还有一个问题就是在使用LSP-intelephense的时候需要安装nodejs这个是文档上面没提到的,只要安装好就行了 推荐nvm

composer install或者composer update 时出现下面错误

OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

说明需要ssl 证书没有配置或者配置的有问题

首先去下载证书

1
wget http://curl.haxx.se/ca/cacert.pem

然后将证书配置到指定目录

1
mv cacert.pem /usr/local/openssl/cert.pem

之后在修改php.ini文件中openssl的配置

1
openssl.cafile=/usr/local/openssl/cert.pem

前提是我用的是ubuntu

Image

通过增加swap的大小,就能提升程序运行速度,对于程序开发的我,还是被耍了一下,我居然不知道

最近运行浏览器google chrome,无意间打开了多个tab,然后就发现电脑卡住了

无意间最近观察了下进程发现swap在卡住的时候是占用满了的,然后还是2G我发现不对,于是想着这玩意以前接触过,应该可以扩容于是搞起来

1
sudo fallocate -l 8G /swapfile8 # 创建命令
1
sudo mkswap /swapfile8 # 格式化命令
1
sudo swapon /swapfile8 # 挂载swap

如果swap在使用中,需要先进行卸载swap操作

1
sudo swapoff /swapfile # 卸载swap

注意我是卸载的*/swapfile不是/swapfile8*

0%