首页
统计
留言
Search
1
PHP中使用反射
995 阅读
2
phpstorm配置SFTP
940 阅读
3
Go语言——结构体
792 阅读
4
PhpStorm 使用 AI 代码生成工具 Codeium
779 阅读
5
关于PHP的垃圾回收机制
763 阅读
后端
PHP
Go
数据库
其他
前端
其他技术
生活杂谈
登录
Search
标签搜索
Laravel
Mysql
RPC
Redis
Liunx
PHP
CSS
ES
算法
开发工具
断点续传
反射
phpstorm
工具
防盗链
CURL
设计模式
面试
Nginx
搜索引擎
quhe.net
首页
栏目
后端
PHP
Go
数据库
其他
前端
其他技术
生活杂谈
页面
统计
留言
搜索到
43
篇与
后端
的结果
2021-08-09
go build、go install、go get的区别
1.作用go build:用于 测试编译包有无错误 ,在项目目录下 生成可执行文件 ( 有main包 )。go install:主要用来生成库和工具。一是编译包文件(无main包),将编译后的包文件放到 pkg 目录下($GOPATH/pkg)。二是编译生成可执行文件(有main包),将可执行文件放到 bin 目录($GOPATH/bin)。go get:相当于 git clone + go install2. 相同点都能生成可执行文件3. 不同点go build 不能生成包文件(.a), go install 可以生成包文件(.a,但是在mod模式下只会在编译中间缓存生成,不会生成到pkg目录下)go build 生成可执行文件在 当前目录下 , go install 生成可执行文件在 bin目录 下( $GOPATH/bin )
2021年08月09日
79 阅读
0 评论
1 点赞
2021-06-18
PHP实现无限级分类生成树结构
方法封装/** * @param $current_key string 当前编号 * @param $parent_key string 父级编号 * @param $array array 数据 * @return array */ public function getTreeList($current_key,$parent_key,$array){ //第一步 构造数据 $items = array(); foreach($array as $value){ $items[$value[$current_key]] = $value; } //第二部 遍历数据 生成树状结构 $tree = array(); foreach($items as $key => $value){ if(isset($items[$value[$parent_key]])){ $items[$value[$parent_key]]['children'][] = &$items[$key]; }else{ $tree[] = &$items[$key]; } } return $tree; }使用例子$arrayData=array( array('name'=>'小明','wbs_no'=>1,'p_wbs_no'=>0), array('name'=>'小王','wbs_no'=>2,'p_wbs_no'=>1), array('name'=>'小李','wbs_no'=>3,'p_wbs_no'=>2), ); $result=$this->getTreeList('wbs_no','p_wbs_no',$arrayData); 输出
2021年06月18日
50 阅读
0 评论
2 点赞
2021-06-09
Go的三种包管理方式(gopath,govendor,gomodule)
前言go语言的发展极其迅速,短短几年便已经历了高速变迁和进化,可能仅仅是几年前的项目,在现在的开发者眼中看起来都像是“上古时代”的产物。其中go的包管理方式就是其中一种,因为各种历史遗留原因导致目前go module、go path和go vendor三种包管理方式在各种项目中都有混杂使用,这篇文章主要来介绍下三种方式的区别和优缺点,现在的go项目该选择哪一种。先说结论,以目前的情况来说,更推荐选择go module。go path和go vendor都是在发展的过程中因为不适应需求逐渐被更好的包管理方式替代,所以也不能说目前的go module就一定是最佳选择,只能说是目前的最佳实践。两个命令go install xxx(安装xxx第三方二进制可执行文件 )go get xxx(下载xxx第三方依赖包并安装)简单说go install类似go build, 将生成的可执行文件放到【$GOPATH/bin】目录中。go get是下载并安装,即git clone+go install,将clone的源码放到【$GOPATH/src】中。需注意,go get从go 1.17开始官方不建议(deprecated)用于安装二进制可执行文件,并且从go 1.18开始不再支持。选项-d未来将成为默认参数,仅执行下载,不进行安装,这么做是为了更符合get的语义。所以安装二进制可执行文件推荐使用go install参见Deprecation of 'go get' for installing executables两个路径GOROOT:go的安装目录,类似java的jdk,存放一些内置的开发包和工具。GOPATH:go指定的工作空间,用于保存go项目的代码和第三方依赖包。可以通过go env查看go相关的环境变量三个包管理工具**go path【不推荐使用】go path是最早的依赖包管理方式(Go1.0),启用GOPATH模式(注意区分GOPATH模式和GOPATH路径,这是两个语境),要求将所有工程代码要求放在GOPATH/src目录下。在工程经过go build、go install或 go get等指令后,会将拉取的第三方xxx依赖包放在GOPATH/src目录下,产生的二进制可执行文件放在GOPATH/bin 目录下,生成的中间缓存文件会被保存在 GOPATH/pkg下。go path有什么问题呢?GOPATH模式下没有版本控制的概念,在执行 go get 的时候,获取的永远是最新的依赖包,下载到GOPATH/src,如果你有两个工程依赖一个包的v1和v2版本,则会发生冲突,因为 GOPATH 模式下两个工程内依赖的导入路径都是一样的,因此两个工程获取的都是v2版本。所以这个模式已经不推荐使用了。govendor【不推荐使用】在Go 1.5版本之后,Go 提供了 GO15VENDOREXPERIMENT 环境变量(Go 1.6版本默认开启该环境变量)和 Go vendor包管理工具,用于将 go build 时的应用路径搜索调整成为当前工程路径/vendor目录的方式,有效的解决了不同工程使用自己独立的依赖包问题。编译 Go 代码会优先从工程目录下的vendor目录先寻找依赖包,如果没有找到,然后GOPATH 中查找,都没找到最后在 GOROOT中查找。优势:因为将第三方依赖完全和工程整合,完全本地化,使得项目构建速度快,且可以工作在无法连接外网的CI/CD流程中。问题:放弃了依赖重用,使得冗余度上升。同一个依赖包如果不同工程想重用,都必须各自复制一份在自己的vendor目录下。而且有趣的是,在go vendor库的官方README文件已经推荐改用go module了。go module从Go1.11开始,官方推出Go module作为包管理工具,且从Go1.13开始为默认选择启用。GOMODULE模式下所有依赖的包存放在GOPATH/pkg/mod目录下,所有第三方二进制可执行文件放在GOPATH/bin目录下,且工程项目可以放在GOPATH路径之外,但要求项目中需要有go.mod文件(该文件通过go mod init命令初始化可以生成)。GOMODULE模式和GOPATH模式一样都指定了依赖包存放的位置,而不是如vendor模式放入工程内,区别在于GOMODULE的go.mod文件中记录了所依赖包的具体版本,既实现了工程之间重用依赖包,且解决了GOPATH模式下不同工程无法依赖同一个包的不同版本的问题。使用GO MODULE模式,需要先开启配置。在Go1.13之后,可以通过如下命令设置GO MODULE启用状态。export GO111MODULE=on GO111MODULE有三个可选值: on、off 和auto ,go 1.16之前默认auto,go 1.16之后默认onGO111MODULE=off 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。GO111MODULE=on 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。GO111MODULE=auto 在 $GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持。关于GO111MODULE有兴趣的可以参考这篇文章 【Why is GO111MODULE everywhere, and everything about Go Modules (updated with Go 1.17)】go mod命令go help mod查看相关帮助命令(govendor是第三方可执行文件,但是go mod命令是go自带的,不用额外go install)命令功能go mod init初始化当前文件夹,创建go.mod文件,事实上,如果你的环境中GO111MODULE=on,使用类似goland的工具创建工程会自动生成go.modgo mod tidy包整理(多的删去、少的拉取),使用之前自然是import了需要的库了go mod download下载依赖到本地(默认为 GOPATH/pkg/mod 目录)go mod vendor将依赖包复制到工程文件的vendor目录下在GO111MODULE=on且项目中包含go.mod文件时,执行go get xxx 或 go install xxx下载的包或者二进制可执行文件将放入GOPATH/pkg/mod目录和GOPATH/bin目录下。总结import后面的是目录包名和目录名没有关系,但是包名最好等于目录名同一个目录下只能有一种包名。import 后面的目录,如果不加./,直接xxx/xxx这种就是从goroot的src下面找下找,或者从gopath/pkg/mod(go mod模式时)、GOPATH/src(gopath)、或当前项目(gomod模式时其实就是以gomod里定义的当前项目名开头)。如果加了./(只能在非go.mod模式下使用),就是从当前文件目录查找go.mod 里的module就是当前项目的包名(目录名)Go mod模式下,第三方包在gopath/pkg/mod ;gopath模式下,第三方包在gopath/src下。
2021年06月09日
77 阅读
0 评论
1 点赞
2021-04-09
PHP下载文件的三种方式
1、直接添加文件链接<button> <a href = "http://localhost/demo.zip">下载文件</a> </button>点击该按钮下载:2、传递参数查找并跳转到下载链接传递参数:<button> <a href = "http://localhost?f='down'">下载文件</a> </button>查找文件并挑战到下载链接:<?php $down = $_GET['f']; //获取文件参数 $filename = $down.'.zip'; //获取文件名称 $dir ="demo/"; //相对于网站根目录的下载目录路径 $down_host = $_SERVER['HTTP_HOST'].'/'; //当前域名 //判断如果文件存在,则跳转到下载路径 if(file_exists(__DIR__.'/'.$dir.$filename)){ header('location:http://'.$down_host.$dir.$filename); }else{ header('HTTP/1.1 404 Not Found'); }文件存在文件不存在3、head() 和 fread()函数把文件直接输出到浏览器<?php $file_name = "down"; $file_name = "down.zip"; //下载文件名 $file_dir = "./down/"; //下载文件存放目录 //检查文件是否存在 if (! file_exists ( $file_dir . $file_name )) { header('HTTP/1.1 404 NOT FOUND'); } else { //以只读和二进制模式打开文件 $file = fopen ( $file_dir . $file_name, "rb" ); //告诉浏览器这是一个文件流格式的文件 Header ( "Content-type: application/octet-stream" ); //请求范围的度量单位 Header ( "Accept-Ranges: bytes" ); //Content-Length是指定包含于请求或响应中数据的字节长度 Header ( "Accept-Length: " . filesize ( $file_dir . $file_name ) ); //用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。 Header ( "Content-Disposition: attachment; filename=" . $file_name ); //读取文件内容并直接输出到浏览器 echo fread ( $file, filesize ( $file_dir . $file_name ) ); //可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区。 fclose ( $file ); exit(); }总结:第一个和第二个操作比较简单,但是容易暴露文件的真实地址,安全性不高,第三种能够较好的把文件的真实地址隐藏起来
2021年04月09日
25 阅读
0 评论
0 点赞
2021-03-15
Mysql查找某个字段在哪个表里
要在mysql数据库查去修改某个字段的值,但是只记得字段名称(也就是列名),不记得具体表名,所以就需要先查询到有这个字段的表。命令如下:SELECT * FROM information_schema.`COLUMNS` t WHERE t.column_name = '字段名称' 在实际使用时,将字段名称改为自己要查询的字段名称(也就是列名)即可。 在查询结果内自行判断哪个表是自己需要修改的。
2021年03月15日
58 阅读
0 评论
0 点赞
1
...
3
4
5
...
9