问题
在 npm install 初始化一个node项目是遇到的报错
Error: Cannot find module ‘fs-extra’
解决否
方案
内存不够了
npm –unsafe-perm increase-memory-limit install
删了重新来
rm -rf ./node_modules
npm install
全局安装
npm install -g fs-extra
又名:IT技术站
在 npm install 初始化一个node项目是遇到的报错
Error: Cannot find module ‘fs-extra’
npm –unsafe-perm increase-memory-limit install
rm -rf ./node_modules
npm install
npm install -g fs-extra
跨虚拟机Docker环境下,拉起MySQL挂载磁盘是,估计大家都会遇到的问题
Docker 拉起官方的 MySQL容器,指定使用挂载的配置文件时,报错如下:
mysql: [Warning] World-writable config file '/etc/mysql/conf.d/mysql.cnf' is ignored.
已解决
这其实是 Docker 在 Windows 下的坑! 当然了 Docker for Mac 也遇到同样的问题。
这牵涉到MySQL对配置文件的可见性安全性的一个要求。MySQL希望它的配置文件是不可编辑的,可查看不可写的。所以就需要配置对应的umask
0555.
以上问题在特定环境下才会暴露出来。我这边是 Mac OS
从宿主机的磁盘一路挂载到vbox,再挂载到Docker,垮了3个环境。为了方便,我直接umask就是 0777。
因为需要在宿主机上编辑代码,Docker环境内运行测试代码。
Windows 上环境我也试过,宿主机挂载到vbox,vbox里装了一个Ubuntu虚拟机,虚拟机内安装了Dcoker,也是跨了3个环境,Windows的磁盘和Linux的权限管理是两套体系,所以
umask
就直接在vbox上配置了。
那么现在MySQL容器需要的是 0555 权限,我尝试在Ubuntu虚拟机中将挂载的目录的访问权限改为 0555,但没有成功,改不动。
具体原因没有深究, 网上也查阅了很多方案,都试了没成功,接下来是我自己摸索出来方案。
我的解决方案是这样:
把同一个目录在vbox里面的Ubuntu虚拟机内挂载了两次,也就是同一个文件夹挂载了两个文件夹,然后两个文件夹的umask 不一样。
配置如下:
sudo mount -t vboxsf -o umask=000,dmode=777,fmode=777 Jumei /mnt/vbox
sudo mount -t vboxsf -o umask=222 Jumei /mnt/ro-vbox
这样,你挂载代码啊,MySQL的数据目录/var/lib/mysql/
,就挂载0777目录——/mnt/vbox
下,当需要挂载只读配置文件时,Docker volume就挂载 /mnt/ro-vbox
目录,这样就满足了配置文件只读,数据文件读写的配置要求。
以下是样例:
file: ./docker-compose.yaml
version: "2"
mysql:
image: mysql:5.7
ports:
- "3306:3306"
volumes:
- /mnt/ro-vbox/compose/bs/config/mysql/my.cnf:/etc/mysql/my.cnf:ro
- /mnt/ro-vbox/compose/bs/config/mysql/conf.d:/etc/mysql/conf.d:ro
- /mnt/vbox/compose/bs/mysql/:/var/lib/mysql/:rw
- /mnt/vbox/compose/bs/log/mysql/:/var/log/mysql/:rw
environment:
MYSQL_ROOT_PASSWORD: "123456"
networks:
tasker_net:
ipv4_address: "192.168.0.6"
如何用Linux命令查看磁盘,内存的占用,来看看du,df,free这三个命令的用法
显示每个文件和目录的磁盘使用空间,df 是来自于coreutils 软件包,系统安装时,就自带的;我们通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置;
du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的。
参数:
-a或-all 显示目录中个别文件的大小。
-b或-bytes 显示目录或文件大小时,以byte为单位。
-c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
-k或--kilobytes 以KB(1024bytes)为单位输出。
-m或--megabytes 以MB为单位输出。
-s或--summarize 仅显示总计,只列出最后加总的值。
-h或--human-readable 以K,M,G为单位,提高信息的可读性。
-x或--one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-L<符号链接>或--dereference<符号链接> 显示选项中所指定符号链接的源文件大小。
-S或--separate-dirs 显示个别目录的大小时,并不含其子目录的大小。
-X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。
--exclude=<目录或文件> 略过指定的目录或文件。
-D或--dereference-args 显示指定符号链接的源文件大小。
-H或--si 与-h参数相同,但是K,M,G是以1000为换算单位。
-l或--count-links 重复计算硬件链接的文件。
## 展示home目录占有空间大小
$ du -hs /home
## 展示 更目录下所有文件、文件夹占用空间大小
$ du -hs /*
## 展示这个文件终于空间大小
$ du -hs /var/log/nginx.log
df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计,显示指定磁盘文件的可用空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
-a或--all:包含全部的文件系统;
--block-size=<区块大小>:以指定的区块大小来显示区块数目;
-h或--human-readable:以可读性较高的方式来显示信息;
-H或--si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes;
-i或--inodes:显示inode的信息;
-k或--kilobytes:指定区块大小为1024字节;
-l或--local:仅显示本地端的文件系统;
-m或--megabytes:指定区块大小为1048576字节;
--no-sync:在取得磁盘使用信息前,不要执行sync指令,此为预设值;
-P或--portability:使用POSIX的输出格式;
--sync:在取得磁盘使用信息前,先执行sync指令;
-t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
-T或--print-type:显示文件系统的类型;
-x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
--help:显示帮助;
--version:显示版本信息。
## 展示磁盘使用情况
$ df -h
## 展示磁盘使用情况以及挂在的磁盘类型
$ df -Th
free命令是一个显示系统中空闲和已用内存大小的工具。free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等
-b 以Byte为单位显示内存使用情况。
-k 以KB为单位显示内存使用情况。
-m 以MB为单位显示内存使用情况。
-o 不显示缓冲区调节列。
-s<间隔秒数> 持续观察内存使用状况。
-t 显示内存总和列。
-V 显示版本信息。
缓存区
– -/+ buffers/cache:表示物理内存的缓存统计
– used2:也就是第一行中的used – buffers-cached 也是实际使用的内存总量。 //used2为第二行
– free2= buffers1 + cached1 + free1 //free2为第二行、buffers1等为第一行
– free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。
– Swap:表示硬盘上交换分区的使用情况
## 展示当前系统内存占用
$ free
## 展示内存使用,单位 -m
$ free -m
## 展示系统内存占用,以及交换区
$ free -mt
## 没3s展示一次 系统内存、交换区使用情况
$ free -mt -s 3
每次拿到压缩文件都不知道怎么解包,还在拿着后缀去百度?快快收下这篇文章吧,涵盖所有压缩格式,一站解决。
$ tar -cvf 打包输出文件 源文件or文件目录
-c : 打包
-v或--verbose: 显示打包过程
-f : 指定打包后的文件名
$ tar -xvf 打包文件
## 查看内部有啥文件
$ tar -tv 打包文件
-x或--extract或--get: 从备份文件中还原文件;
-v : 展示过程
-t或--list : 列出备份文件的内容;
## 注意:源文件会消失!
$ gzip 源文件
## 压缩文件,源文件保留
$ gzip -c -3 源文件 > 压缩文件.gz
## 递归的压缩目录
$ gzip -rv 目录
-r或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理
-<压缩效率>:压缩效率是一个介于1~9的数值,预设值为“6”,指定愈大的数值,压缩效率就会愈高;
$ gzip -d 压缩文件
$ gunzip 压缩文件
## 详细显示中压缩的文件的信息,并不解压
$ gzip -l *
## 把当前目录中中每个压缩的文件解压,并列出详细的信息
$ gzip -dv ./*
-l或——list:列出压缩文件的相关信息;
-d或--decompress或----uncompress:解开压缩文件;
gunzip命令用来解压缩文件。gunzip是个使用广泛的解压缩程序,它用于解开被gzip压缩过的文件,这些压缩文件预设最后的扩展名为.gz。事实上gunzip就是gzip的硬连接,因此不论是压缩或解压缩,都可通过gzip指令单独完成。
其实,.tar.gz 格式是先将文件或目录打包文 .tar 格式,再压缩为 .gz 格式
$ tar -zcvf 压缩文件名.tar.gz 源文件
参数说明
-z或--gzip或--ungzip:通过`gzip`指令处理备份文件; 也就是 `.tar.gz`
$ tar -zxvf 压缩包名.tar.gz
参数说明:
-z : 解压缩
-t : 查看压缩保内文件,但是不解压缩
## 源文件会移除
$ bzip2 源文件
## 保留源文件
$ bzip2 -k 源文件
-d或——decompress:执行解压缩;
-c或——stdout:将压缩与解压缩的结果送到标准输出;
-k或——keep:bzip2在压缩或解压缩后,会删除原始文件。若要保留原始文件,请使用此参数;
bzip2 不能压缩目录
## 解压缩,默认不保留压缩文件。加 -k 可保留压缩文件
$ bzip2 -d 压缩文件
## 解压到标准输出:
$ bzip2 -dc filename.bz2 > filename
## 检查展示压缩文件内容,不解压
$ bzip2 -tv zipFile.bz2
-d或——decompress:执行解压缩;
-t或——test:测试.bz2压缩文件的完整性;
-v或——verbose:压缩或解压缩文件时,显示详细的信息;
.tar.bz2
格式是先将文件或目录打包文 .tar
格式,再压缩为 .bz2
格式
tar -jxvf 压缩包名.tar.bz2 源文件or文件目录
-j : 使用`bzip2`处理,压缩为 .tar.bz2 格式
$ tar -jxvf 压缩包名.tar.bz2
-x : 解压
-t : 查看压缩保内文件,但是不解压缩
-C : 指定解压的目录(注意,该选项必须放在后面)
一般Linux没有默认安装 zip 软件,需要手动安装 zip
以及 unzip
两个软件!
## debian,ubuntu
$ apt-get install zip unzip -y
## centos
$ yum install zip unzip -y
## mac os 目测有预装
$ zip 压缩文件名.zip 源文件
## 压缩目录
$ zip -r 压缩文件名.zip 文件夹目录
$ unzip 压缩文件 [-d <文件解压缩后所要存储的目录>]
今天是2020年,PHP连接MySQL有什么接口呢?还在用mysql函数?试试mysqli、pdo_mysql吧?那mysqli和pdo_mysql又有什么异同呢?来看看
PHP-MySQL 是 PHP 操作 MySQL 资料库最原始的 Extension
为了让自己强大起来,mysql 自己为安全也做了很多努力。以前例的 SQL 叙述来说,在sql 语句中使用 变量 直接拼接 的地方容易被 SQL Injection。后来于是发展出了 mysql_escape_string() (备注:5.3.0之后弃用) 以及
mysql_real_escape_string()解决此问题。
PHP-MySQLi 的 i 代表 Improvement ,提更了相对进阶的功能,就 Extension 而言,本身也增加了安全性.
MySQL增强扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性。其特点为:面向对象接口 、prepared语句支持、多语句执行支持、事务支持 、增强的调试能力、嵌入式服务支持 、预处理方式完全解决了sql注入的问题。不过其也有缺点, 就是只支持mysql数据库。如果你要是不操作其他的数据库,这无疑是最好的选择。
其功能类似于JDBC、ODBC、DBI之类接口。
PDO是PHP5.1之后才支持的,他为访问数据库采用了一致性的接口,有非常多的操作却是MySQL扩展库所不具备的:
1). PDO真正的以底层实现的统一接口数库操作接口
2). PDO支持更高级的DB特性操作,如:存储过程的调度等,mysql原生库是不支持的.
3). PDO是php官方的PECL库,兼容性稳定性必然要高于MySQL Extension,可以直接使用 pecl upgrade pdo 命令升级
那我自己举例,我最早接触的就是php_mysql 拓展,就是一个个的函数,封装一下就面向对象了。后来又听人说mysqli更好,更安全。发现从mysql过渡到mysqli,就是find mysql, repalce mysqli 这么简单。而PDO呢,对外提供的是完全的面向对象的API,而我们mysqli 同时对外暴露了 函数式和 面向对象 API。所以,你用mysqli面向对象那种方式,再切换到PDO 也很容易。
用PDO的好处是,PDO支持多种数据库,而MySQLi只支持MySQL,一但你掌握了就你可以使用连接多种数据库。
php_mysql不能 Bind Column ,以前例的 SQL 叙述来说,$location 的地方容易被 SQL Injection。后来于是发展出了 mysql_escape_string() (备注:5.3.0之后弃用) 以及 mysql_real_escape_string()来解决这个问题,不过这麽一搞,整个叙述会变得複杂且丑陋,而且如果栏位多了,可以想见会是怎样的 情形.
在 PHP-MySQLi 中有了不少进步,除了透过 Bind Column 来解决上述问题,而且也多援 Transaction, Multi Query ,
并且同时提供了 Object oriented style (下面这段 PHP-MySQLi 范例的写法) 和 Procedural style
特性、指标 | PHP的mysqli扩展 | PDO (使用PDO MySQL驱动和MySQL Native驱动) | PHP的mysql扩展 |
---|---|---|---|
引入的PHP版本 | 5.0 | 5.0 | 3.0之前 |
PHP5.x是否包含 | 是 | 是 | 是 |
MySQL开发状态 | 活跃 | 在PHP5.3中活跃 | 仅维护 |
在MySQL新项目中的建议使用程度 | 建议 | 建议 | 不建议 |
API的字符集支持 | 是 | 是 | 否 |
服务端prepare语句的支持情况 | 是 | 是 | 否 |
客户端prepare语句的支持情况 | 否 | 是 | 否 |
存储过程支持情况 | 是 | 是 | 否 |
多语句执行支持情况 | 是 | 大多数 | 否 |
是否支持所有MySQL4.1以上功能 | 是 | 大多数 | 否 |
参数命名 | 不支持 | 支持 | 不支持 |
API 编程范式 | OOP + 函数式 | OOP | 函数式 |
对象映射(Object Mapping) | 不支持 | 支持 | 不支持 |
其实从php_mysql, mysqli,pdo_mysql 得过渡就可以看到php自己的设计哲学,不要以很强硬的方式推倒以前的,要慢慢过渡,设计规则让用户慢慢适应。php_mysql->mysqli->pod_mysql, 从过程编码到过程和OOP兼得的mysqli,再到纯OOP的pdo_mysql. 慢慢得大家都用pdo了,mysql也淡出了php的版本。