1 Star 0 Fork 0

ZHNAG Q / anlondon

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
search.json 279.35 KB
一键复制 编辑 原始数据 按行查看 历史
ZHNAG Q 提交于 2023-02-08 23:37 . Site updated: 2023-02-08 23:37:38
[{"title":"1.2swoole wget安装","url":"/2021/06/21/1-2swoole-wget%E5%AE%89%E8%A3%85/","content":"1.2swoole wget安装官方文档:Swoole4 文档参照:1.PHP—swoole通往大神修炼之路_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili2.分分钟学会swoole+tcp和udp服务端以及练习小案列——哔哩哔哩\nwget方法\n检查环境和php版本环境:Linuxphp: php-7.1 或更高版本gcc-4.8 或更高版本\n下载swoole# wget https://pecl.php.net/get/swoole-4.2.0.tgz# tar -zxf swoole-4.2.0.tgz\n安装依赖# yum -y install gcc gcc-c++ autoconf pcre-devel make\n编译# phpize#su ./configure 具体参数根据自己的需求#su make &amp;&amp; make install\n配置\n先# php -m | grep swoole,如果没有则可以# php -r &quot;echo phpinfo()&quot;看下是否报错。(1). 编译成功后,修改php.ini(# locate php.ini查找)加入extension=swoole.so(注意这里是swoole.so扩展地址)(2). 如果报’Unable to load dynamic library “swoole.so”‘的错误,找到报错的目录然后在# vim /etc/ld.so.conf 最后一行添加上该目录,/ld.so.conf/是加载库文件。保存退出再输入# ldconfig即可\n如我的报错信息PHP Warning: PHP Startup: Unable to load dynamic library 'swoole.so' (tried: /usr/lib64/php/modules/swoole.so (/usr/lib64/php/modules/swoole.so: undefined symbol: zif_time_nanosleep), /usr/lib64/php/modules/swoole.so.so (/usr/lib64/php/modules/swoole.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 \n\n\n其中报错目录指向 /usr/lib64/php/modules,则在/etc/ld.so.conf最后添加该字段,保存后运行# ldconfig,再次运行# php -r &quot;echo phpinfo();&quot;则可以看到swoole的相关信息。有时因为加载的关系,# php -m | grep swoole不一定能找到。参考资料:安装Swoole报Unable to load dynamic library ‘swoole.so’错误的解决 - 一闻自习室\n\n\n\n\n\n","categories":["swoole","基础了解"],"tags":["swoole"]},{"title":"1.redis入门与应用(慕课)","url":"/2022/08/21/1-redis%E5%85%A5%E9%97%A8%E4%B8%8E%E5%BA%94%E7%94%A8%EF%BC%88%E6%85%95%E8%AF%BE%EF%BC%89/","content":"来源:免费redis的安装环境,redis的入门与应用教程-慕课网课程针对Linux(centos)\n二章 安装2-1. 服务器端安装2-1-1 安装redis\n1. 查看系统版本\n\n`# cat /etc/redhat-release`\n\n2. 下载安装包\n\n找到一个合适的目录 演示使用redis2.8.13\n`# wget http://download.redis.io/releases/redis-2.8.13.tar.gz`\n\n3. 安装依赖\n\n预装 gcc[^gcc],tcl[^tcl] \n`# yum install gcc tcl -y`\n\n4. 解压配置\n\n`# tar -xf redis-2.8.13.tar.gz`\n`# cd redis-2.8.13`\n`# make test`没报错就 `# make`\n完成后可以在 `ll src/redis`中查看安装的服务 `src/redis-cli`,`src/redis-server`\n\n5. 安装\n\n`# sudo make install`\n\n6. 查看server位置\n\n`# which redis-server`即可查看redis-server所在目录\n\n2-1-2 配置redis\n\n在redis-2.8.13中,找到redis.conf,这是redis的配置文件。复制该文件到一个方便的目录,比如# mkdir /etc/redis/confcp -r redis.conf /etc/redis/conf/redis.conf\n\n修改# vim /etc/redis/conf/redis.conf37行 daemonize no=&gt;daemonize yes后台运行45行 port 6379=&gt;port 7200修改默认端口其他的可根据需要修改\n\n指定pidfile 进程存储文件\n\nlogfile Log文件存储文件\n\ndir 数据库镜像备份的文件存储路径\n\n\n基本配置\n\n 1. pidfile 配置多个pid的地址,默认在var/run/redis.pid\n 2. bind 绑定ip 设置后只接受来自该ip的请求\n 3. port 监听端口 默认6379\n 4. timeout 设置客服端连接时的超时时间 单位s\n 5. loglevel 日志级别 分为4级(debug,verbose,notice,warming)\n 6. logfile 配置log文件的地址\n 7. databases 设置数据库的个数 默认16个 ,默认当前使用的数据库编号为0\n 8. save设置 redis进行数据镜像的频率\n 9. rdbcompress 镜像备份时是否进行压缩\n 10. dbfilename 镜像备份的文件名\n 11. dir数据库镜像备份文件存放路径\n 12. slaveof 设置数据库为其他数据库的从数据库\n 13. masterauth 主数据库连接时需要的密码验证\n 14. requirepass 设置操作时需要的密码\n 15.maxclients 同时连接的客户端最大数量\n 16.maxmemory 能够使用的最大内存\n 17.appendonly 开启appendonly模式\n 18.appendfsync设置对appendonly.aof文件同步的频率(第二种数据备份方式)\n 19.vm-enabled 是否开启虚拟内存支持\n 20.vm-swap-file 虚拟内存的交换文件路劲\n 21.vm-max-memory 设置redis使用最大的物理内存大小\n 22.vm-page-size 设置虚拟内存的页大小\n 23.vm-pages 交换文件的总pages数量\n 24.vm-max-threads 设置vmio同时使用的线程数量\n 25.glueoutputbuf 把小的输出缓存存放在一起\n 26.hash-max-zipmap-entries 设置hash的临界值\n 27.activerehashing 重新hash\n \n \n\n\n\n2-1-3 启动redis\n\n# sudo redis-server redis.conf需要指定redis-server 和 redis.conf的位置 完整指令: # sudo /usr/local/bin/redis-server /etc/redis/conf/redis.conf 这样很麻烦,也可以添加redis-server到环境变量中[^添加环境变量]\n查看是否启动# ps aux|grep redis-server\n\n2-2. 客户端安装2-2-1 安装 \n\nredis的客户端(client)是包含在redis中的,安装服务端时,客户端就已安装。\n\n2-2-2 配置\n\n输入# redis-cli提示Could not connect to Redis at 127.0.0.1:6379: Connection refusedredis127.0.0.1:6379拒绝连接这是因为上面修改了服务端的端口,默认6379端口无法登录\n输入# redis-cli --help提示输入-h &lt;hostname,default:127.0.0.1&gt;修改登录IP-p &lt;port,default:6379&gt;修改登录端口\n输入# redis-cli -h 127.0.0.1 -p 7200显示127.0.0.1:7200&gt;表示连接成功\n连接状态输入# info即可查看redis详细信息\n\n[^添加环境变量]: 见 本地文章 [添加环境变量](\n","categories":["Redis"]},{"title":"[Err] (1146)Table 'performance_schema.session_status' doesn't exist","url":"/2021/04/13/1/","content":"\n来源: Mysql出现Table ‘performance_schema.session_status’ doesn’t exist - 芳缘的个人空间 - OSCHINA\n\n在查询mysql的B+树大节点存储数据量大小时,出现\n[Err] 1146 - Table &#x27;performance_schema.session_status&#x27; doesn&#x27;t exist\n\n解决办法\nmysql -u &#123;user&#125; -pmysql&gt; set @@global.show_compatibility_56=ON;\n","categories":["MySql"]},{"title":"2. redis五种数据类型(慕课)","url":"/2022/08/21/2-redis%E4%BA%94%E7%A7%8D%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%EF%BC%88%E6%85%95%E8%AF%BE%EF%BC%89/","content":"来源:免费 redis的五种数据类型-慕课网课程只是基础介绍,详细指令见官网\n整体介绍\n\n\n数据类型\n存储的值\n读写能力\n\n\n\nString\n可以是字符串、整数或浮点,统称为元素\n对字符串操作对整数类型加减\n\n\nList\n一个序列集合且每个节点都包好了一个元素\n序列两端推入、或弹出元素修剪、查找或移除元素\n\n\nSet\n各不相同的元素\n从集合中插入或者删除元素\n\n\nHash\n有key-value的散列组,其中key是字符串,value是元素\n按照key进行增加删除\n\n\nSort Set\n带分数的score-value有序集合,其中score为浮点,value为元素\n集合插入,按照分数范围查找\n\n\nstring类型\nstring类型的键和值可以是 字符串(str)、整数(int)、浮点小数(float) \n\n\n\nkey\nvalue(string/int/float)\n\n\n\n\n操作string类型元素设置一个string类型的元素# set key value获取一个string类型的元素# get key连接状态下\n$ set string1 nihaoya~ #设置一个string类型的元素#ok$ get string1 #获取该元素的值#&quot;nihaoya~&quot;$ set string2 123 #设置一个整数值#ok$ get string2 #获取该元素的值#&quot;123&quot; $ set 1 123456 #设置一个key,value都为整数的元素#ok$ get 1 #获取该元素的值#&quot;123456&quot;\n\n string类型元素自增自减\n $ incr string2 5 #自增操作,表示string2+5,不写5默认为1#(int) 128$decrby string2 #自减操作,默认减一#(int) 127\n\nlist类型\nlist是一个有序的列表\n\nlist元素与string元素一样可以为:str,int,float,并且元素可以重复\n\n一个列表最多包含超40亿个元素\n\n对list操作需要说明方向:左或右\n\n假设我们有个list数据list1=&gt;[1,2,3,4]操作设置的方向,即设定从list的左l(left)/右r(right)操作为\n\n$ lpush list1 0 #从左边插入一位#(int) 5 #list1中元素个数为5#此时list1=&gt;[0,1,2,3,4]$ rpop list1 #从右边弹出一位#(int) &quot;4&quot;#此时list1=&gt;[0,1,2,3]$ llen list1 #查看元素个数(不分左右,没有rlen)#(int) 4\n\nset类型\nSet 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。指令:s(set)-xxx\n$ sadd set1 12 #给set1插入一个元素12#(int) 1 #表示插入成功$ sadd set1 13#(int) 1$ sadd set1 13#(int) 0 #表示插入失败#set1中有多少个元素$ scard set1 #(int) 2#判断某个元素是否在列表内$ sismember set1 13#(int) 1#删除某个元素$ srem set1 13#(int) 1\nRedis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。\n\n每个集合可存储40多亿个成员。 \n\n\nhash类型\nRedis hash 是一个 string 类型的 key-value(键值对)的映射表,hash 特别适合用于存储对象。\nhash 的键值是一一对应的\nRedis 中每个 hash 可以存储40多亿键值对。指令 h(hash)-xxx\n\n#插入一个键值到hash表中,返回1表示插入成功$ hset hash1 key1 12#(int) 1$ hset hash1 key2 13#(int) 1$ hset hash1 key3 13#(int) 1$ hlen hash1#(int) 3#hset的键(key)如果存在,且值(value)成功覆盖旧值就返回0$ hset hash1 key3 14#(int) 0#根据键获取值$ hmget hash1 key3 key1 key2#1) &quot;14&quot;#2) &quot;12&quot;#3) &quot;13&quot;#获取全部内容$ hgetall hash1#1) &quot;key1&quot;#2) &quot;12&quot;#3) &quot;key12&quot;#4) &quot;13&quot;#5) &quot;key3&quot;#6) &quot;14&quot;#插入多条内容$ hmset hash2 name &quot;redis tutorial&quot; description &quot;redis basic commands for caching&quot; likes 20 visitors 23000#OK$ hgetall hash2#1) &quot;name&quot;#2) &quot;redis tutorial&quot;#3) &quot;description&quot;#4) &quot;redis basic commands for caching&quot;#5) &quot;likes&quot;#6) &quot;20&quot;#7) &quot;visitors&quot;#8) &quot;23000&quot;\n\nsort set类型\n是一个有序集合,且不允许重复的value。\n\n可看做一个排行榜,score为热度(分数),value为内容(姓名),rank为隐藏部分属于排行,score值最小rank越靠前\n\n映射关系不同于hash的key-value,sortSet的映射为score-value,score为浮点数。![RH3S5BR$YZNE0OIGHZZEU`0.png](/2022/08/21/2-redis五种数据类型(慕课)/2fca0ee6.png)\n\nvalue是唯一的,重复时会覆盖之前那条数据的score与value。\n\nscore相同时,排序根据value中字段的字典顺序\n# 添加 table score value$ zadd zset1 10.1 val1#(int) 1$ zadd zset1 11.2 val2#(int) 1$ zadd zset1 12.3 val3#(int) 1#value相同时,覆盖之前的数据$ zadd zset1 9.1 val1#(int) 0$ zcard zset1 #查看元素个数#(int) 3$ zrange zset1 0 2 withscores #根据score查出0到2的排序#1) &quot;val1&quot;#2) &quot;9.0999999999999996&quot;#3) &quot;val2&quot;#4) &quot;11.199999999999999&quot;#5) &quot;val3&quot;#6) &quot;12.300000000000001&quot;#`score`相同时,排序根据`value`中字段的字典顺序$ zadd zset1 12.3 val0#(int) 1$ zrange zset1 0 3 withscores#1) &quot;val1&quot;#2) &quot;9.0999999999999996&quot;#3) &quot;val2&quot;#4) &quot;11.199999999999999&quot;#5) &quot;val0&quot;#6) &quot;12.300000000000001&quot;#7) &quot;val3&quot;#8) &quot;12.300000000000001&quot;#查看某个value排序$ zrank zset1 val2#(int) 1\n\n","categories":["Redis"]},{"title":"2. 编辑器自动上传项目到服务器","url":"/2021/06/21/2-%E7%BC%96%E8%BE%91%E5%99%A8%E8%87%AA%E5%8A%A8%E4%B8%8A%E4%BC%A0%E9%A1%B9%E7%9B%AE%E5%88%B0%E6%9C%8D%E5%8A%A1%E5%99%A8/","content":"2. 编辑器自动上传项目到服务器\nphpStorm打开项目\n点击 工具tool -&gt; deployment -&gt; configuration\n弹出的窗口中点击 + \n【name】: 你的项目名称 【Type】: SFTP\n点击项目名称,在【Mappings】中\n在”Deployment path on server 项目名称 “中写根目录/即可 \n\n\n在【Connection】中\nSFTP host: 后写服务器的IP地址 \nPort :服务器的端口号\nUser name:远程连接的用户名\nPassword:远程连接的用户密码 \n勾选 save password \n点击 Root path 后 …… 找到Linux下www并新建项目目录\n点击确定\n\n\n上传\n上传全部 tool-&gt;Deployment-&gt;Upload to..\n上传当前文件 tool-&gt;Deployment-&gt;Upload to 项目名\n自动更新 tool-&gt;Deployment-&gt;Automation Upload 每当出现文件更改就会自动更新\n\n\n浏览远程目录\ntool-&gt;Deployment-&gt;Browse Remote host 查看服务器该目录\n\n\n\n","categories":["swoole","基础了解"],"tags":["swoole"]},{"title":"3-2 swoole 源码安装","url":"/2021/08/07/3-2-swoole-%E6%BA%90%E7%A0%81%E5%AE%89%E8%A3%85/","content":"源码安装swoole下载地址:https://gitee.com/swoole/swoole/tree/v4.4.8/\n注意:\n\nphp7.4 对应swoole版本为4.4.8\n源码安装时,swoole包中没有 configure,在软件包目录下输入/php安装路径/php/bin/phpize,即可自动生成configure文件\nswoole编译时需要指定php-config位置。指令为./configure --with-php-config=/php安装路径/php/bin/php-config。\n\n一键安装#!&#x2F;bin&#x2F;bashpecl install swoole\n\n\n遇到的问题:\n\n错误:提供给函数‘zend_vm_stack_push_call_frame’的实参太多\nmake error:只允许在 C99 模式下使用‘for’循环初始化声明\nmake test error: proc_open() is available\n\n","categories":["swoole","Swoole入门到实战打造高性能赛事直播平台"],"tags":["swoole"]},{"title":"3. PHP redis扩展安装(慕课)","url":"/2022/08/21/3-PHP-redis%E6%89%A9%E5%B1%95%E5%AE%89%E8%A3%85%EF%BC%88%E6%85%95%E8%AF%BE%EF%BC%89/","content":"来源:免费PHP redis扩展安装环境,redis的入门与应用教程-慕课网只针对Linux centos\n扩展安装\n确认Linux版本 # cat /etc/redhat-release# php -v 确认安装有php# which phpize,# which php-config,确认安装有php依赖: phpize,php-config PHP安装包中一般都带有这两个依赖,没有则# yum install php-devel# php -m确认安装有php redis扩展(wget https://github.com/phpredis/phpredis/archive/develop.zip)\n\n解压develop.zip,# unzip develop.zip生成phpredis-develop文件夹\n\n# cd phpredis-develop进入文件夹输入# phpize编译生成configure工具\n\n使用configure工具之前需要找到php-config的路径# which php-config在configure工具中with-php-config参数可以将php配置同步安装到指定的地方,避免安装好后复制配置文件过去# ./configure --with-php-config=Your_php-config_path\n\n编译安装# make test无误后# make &amp; make install出现 Installing shared extensions: 表示安装成功\n\n开启扩展查找php.ini# php --ini\n\n在php7以下可以直接在php.ini中添加extension=redis.so\n\nphp7.0+则需要新建在 php.d目录中# vim /your/path/to/php.d/redis.ini添加\n; Enable redis extension module\nextension=redis.so\n\n最后# php -m查看是否安装成功\n\n\n\n\n","categories":["Redis"]},{"title":"4-1 swoole TCP服务器","url":"/2021/08/07/4-1-swoole-TCP%E6%9C%8D%E5%8A%A1%E5%99%A8/","content":"[官方手册|tcp服务器](https://wiki.swoole.com/#/start/start_tcp_server)\n–资料:\n\ntelnet安装|centos\n\n","categories":["swoole","Swoole入门到实战打造高性能赛事直播平台"],"tags":["swoole"]},{"title":"4-4 Swoole - HTTP服务(上)","url":"/2021/08/08/4-4-Swoole-HTTP%E6%9C%8D%E5%8A%A1%EF%BC%88%E4%B8%8A%EF%BC%89/","content":"\n","categories":["swoole","Swoole入门到实战打造高性能赛事直播平台"],"tags":["swoole"]},{"title":"4. php redis操作(慕课)","url":"/2022/08/21/4-php-redis%E6%93%8D%E4%BD%9C%EF%BC%88%E6%85%95%E8%AF%BE%EF%BC%89/","content":"来源:免费redis的链接操作,redis的入门与应用教程-慕课网课程只是基础介绍,详细指令见官网\n常见指令都可参考文档地址:https://github.com/phpredis/phpredis\n4-1 php链接redis\nRedis类的命名空间是根因此在其他命名空间使用redis类时需要加上\\根目录符号\nphpredis的命令和参数基本和redis.io中的实际命令对应\n\n&lt;?php$redis = new \\Redis();//不要忘了加\\$redis-&gt;connect(&quot;127.0.0.1&quot;,7200);\n\n\n4-2 php 操作string类型\n见GitHub - phpredis/phpredis: A PHP extension for Redis\nRedis 字符串(String) | 菜鸟教程\n官网Command reference – Redis简单操作\n\n&lt;?php$redis = new \\Redis();$redis-&gt;connect(&#x27;127.0.0.1&#x27;,7200);//string 操作$redis-&gt;delete(&quot;string1&quot;);$redis-&gt;set(&quot;string1&quot;,&quot;val1&quot;);$val = $redis-&gt;get(&quot;string1&quot;);var_dump($val); //val1$redis-&gt;set(&quot;string1&quot;,4);$redis-&gt;incr(&quot;string1&quot;,2);$val = $redis-&gt;get(&quot;string1&quot;);var_dump($val); //6\n\n\n4-3 php 操作list类型\n见GitHub - phpredis/phpredis: A PHP extension for Redis\nRedis 列表(List) | 菜鸟教程\n官网Command reference – Redis\n\nlist因为谁先进谁先出的特点,适合做下单用户下单后提示用户下单成功,而后台则插入待做事项list,等实际操作后台时获取待做事项并处理。\n&lt;?php$redis = new \\Redis();$redis-&gt;connect(&#x27;127.0.0.1&#x27;,7200);//list操作$redis -&gt;delete(&quot;list1&quot;);$redis-&gt;lpush(&quot;list1&quot;,&quot;A&quot;);$redis-&gt;lpush(&quot;list1&quot;,&quot;B&quot;);$redis-&gt;lpush(&quot;list1&quot;,&quot;C&quot;);$val = $redis-&gt;rpop(&quot;list1&quot;);var_dump($val); //A 先入先出\n\n4-4 php 操作set类型\n见GitHub - phpredis/phpredis: A PHP extension for Redis\nRedis 集合(Set) | 菜鸟教程\n官网Command reference – Redis\n\n&lt;?php$redis = new \\Redis();$redis-&gt;connect(&#x27;127.0.0.1&#x27;,7200);//set操作$redis-&gt;delete(&quot;set1&quot;);$redis-&gt;sAdd(&quot;set1&quot;,&quot;A&quot;);$redis-&gt;sAdd(&quot;set1&quot;,&quot;B&quot;);$redis-&gt;sAdd(&quot;set1&quot;,&quot;C&quot;);$redis-&gt;sAdd(&quot;set1&quot;,&quot;C&quot;);$val =$redis-&gt;sCard(&quot;set1&quot;);var_dump($val); //3$val = $redis-&gt;sMembers(&quot;set1&quot;);var_dump($val); //array()\n\n4-4 php 操作hash类型\n见GitHub - phpredis/phpredis: A PHP extension for Redis\nRedis 集合(Set) | 菜鸟教程\n官网Command reference – Redis\nhash适合存储个人信息这类比较复杂多样的数据,个人信息可能有年龄属性,性别属性,教育属性等等\n\n&lt;?php$redis = new \\Redis();$redis-&gt;connect(&quot;127.0.0.1&quot;,7200);//操作hash$redis-&gt;delete(&quot;driver1&quot;);$redis-&gt;hSet(&quot;driver1&quot;,&quot;name&quot;,&quot;mingming&quot;); //hset(key,hashkey,value)$redis-&gt;hSet(&quot;driver1&quot;,&quot;age&quot;,25);$redis-&gt;hSet(&quot;driver1&quot;,&quot;gender&quot;,1);$val = $redis-&gt;hGet(&quot;driver1&quot;,&quot;name&quot;);var_dump($val);$val = $redis-&gt;hMGet(&quot;driver1&quot;,array(&quot;name&quot;,&quot;age&quot;,&quot;gender&quot;));var_dump($val);\n\n4-4 php 操作sort set类型\n见GitHub - phpredis/phpredis: A PHP extension for Redis\nRedis 集合(Set) | 菜鸟教程\n官网Command reference – Redis\nsort set适合存储 存取无序但需要排行的数据因为sort_set太长,因此取 Z 替代sort,指令都为 Z-xxxx\n\n&lt;?php$redis = new \\Redis();$redis-&gt;connect(&#x27;127.0.0.1&#x27;,7200);$redis-&gt;delete(&#x27;zset1&#x27;);$redis-&gt;zAdd(&#x27;zset1&#x27;,100,&#x27;xiaoming&#x27;); //rank:2$redis-&gt;zAdd(&#x27;zset1&#x27;,90,&#x27;xiaohong&#x27;); //rank:0$redis-&gt;zAdd(&#x27;zset1&#x27;,93,&#x27;xiaowang&#x27;); //rank:1$val = $redis-&gt;zRange(&quot;zset1&quot;,0,-1); //从低到高var_dump($val);$val = $redis-&gt;zRevRange(&#x27;zset1&#x27;,0,-1); //从高到低var_dump($val);\n\n","categories":["Redis"]},{"title":"6.1 同步异步","url":"/2021/06/21/6-1-%E5%90%8C%E6%AD%A5%E5%BC%82%E6%AD%A5/","content":"6.1 同步异步! swoole4.0后不再支持异步回调模块 \n同步通信 sync适用场景:消息队列,硬件通信等,需要及时通信的应用场景\n在客户端client.php中\nSwoole\\Client-&gt;connect(string $host,int $port, float $timeout = 0.5, int $flag = 0 ): bool\n\nint $flag\n在 UDP 类型时表示是否启用 udp_connect 设定此选项后将绑定 $host 与 $port,此 UDP 将会丢弃非指定 host/port 的数据包。\n 在 TCP 类型,$flag=1 表示设置为非阻塞 socket,之后此 fd 会变成异步 IO,connect 会立即返回。如果将 $flag 设置为 1,那么在 send/recv 前必须使用 swoole_client_select 来检测是否完成了连接。\n\n\n同步阻塞\nconnect 方法会阻塞,直到连接成功并返回 true。这时候就可以向服务器端发送数据或者收取数据了。$client = new Swoole\\Client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_SYNC);//SWOOLE_SOCK_SYNC 添加该参数开启同步通信\n\n\n\n异步通信 async","categories":["swoole","基础了解"],"tags":["swoole"]},{"title":"7. TCP和UDP介绍","url":"/2021/06/21/7-TCP%E5%92%8CUDP%E4%BB%8B%E7%BB%8D/","content":"7. TCP和UDP介绍详细的介绍见网络协议-&gt;TCP和UDP\n两者区别\nTCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接\nTCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可蒙交付\ntcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。\nUDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。\nTCP对系统资源要求较多,UDP对系统资源要求较少。\n\n","categories":["swoole","基础了解"],"tags":["swoole"]},{"title":"8.1多任务处理中心","url":"/2021/06/21/8-1%E5%A4%9A%E4%BB%BB%E5%8A%A1%E5%A4%84%E7%90%86%E4%B8%AD%E5%BF%83/","content":"8.1多任务处理中心什么叫多任务处理中心?php属于单线程应用,每次只能处理一个任务,然而当项目越来越复杂越来越庞大时,单线程就难以支撑庞大繁多的任务处理,而有的任务会因为网络/用户反应时间等原因,导致框架需要得到某些数据却迟迟得不到使得任务阻塞。\n\n如1万个用户中一部分在付款等待付款结果,一部分在下单,一部分在等待短信通知,这些任务都会有一定的处理延迟,如果使用php框架处理,就会影响运行效率和用户体验。而多任务处理中心则是独立于框架外,可以高效并同时处理多个任务的swoole模块(Swoole\\Process)如上述的例子,当框架遇到一些需要等待较久且使用频繁的功能时,可以将任务传递给Swoole的多任务处理中心,处理中心可以同时运行并根据需要返回结果,而php框架主体应用不会产生阻塞等待,可以更加专注于自己的任务\n\n为什么需要多任务处理中心?\n在大流量高并发下为一部任务提供快速消费的能力\n实现业务逻辑的解耦,避免系统故障\n对人物做数据的轨迹、存储、挖掘、分析之类的工作\n\n简单的实例\n模拟10个任务,每个任务需要一秒钟\nfor($i=0;$i&lt;10;$i++)&#123; sleep(1); echo &#x27;正在执行任务&#x27;.($i+1);&#125;\n运行结果\n[hime@192 swoole-sixstartedu]$ time php job&#x2F;process.php 正在执行任务1正在执行任务2正在执行任务3正在执行任务4正在执行任务5正在执行任务6正在执行任务7正在执行任务8正在执行任务9正在执行任务10real\t0m10.053suser\t0m0.026ssys\t0m0.009s\n使用Swoole 提供的进程管理模块模拟十个任务\nfor($k=0;$k&lt;10;$k++)&#123; $process = new Swoole\\Process(function()&#123; //子进程 sleep(10); echo &#x27;:正在执行任务&#x27;.PHP_EOL; &#125;); $process-&gt;start();//启动进程,创建进程&#125;//[hime@192 swoole-sixstartedu]$ time php job/process.php//:正在执行任务//:正在执行任务//:正在执行任务//:正在执行任务//:正在执行任务//:正在执行任务//:正在执行任务//:正在执行任务//:正在执行任务//:正在执行任务//real\t0m10.347s//user\t0m0.132s//sys\t0m2.200s\nfor循环制造了10个任务(sleep在实例process中,因此对for循环没有影响),并通过Process处理,10个任务同时进行,因此整体时间花费只在10s+从上面实例可以看出,swoole的进程处理是十分高效的,可以同时执行多个任务。p9:50分钟左右,讲解任务处理中心的功能分层(主进程,接收任务进程,执行任务进程,监听回收进程,进程间通信!\n\n\n\n","categories":["swoole","基础了解"],"tags":["swoole"]},{"title":"Git 版本切换","url":"/2021/03/07/Git-%E7%89%88%E6%9C%AC%E5%88%87%E6%8D%A2/","content":"主要内容:\n1) HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。2)用git log可以查看提交历史,可以查询到我们要返回版本的ID。3)版本回退之后,需要再次回到会退前,可以用git reflog查看命令历史,可以查看到每次命令的记录,里面会有我们需要的版本ID。\n\n一: 按次回退HEAD表示当前版本,回退到上一个版本用:git reset --hard HEAD^\n回退到上上一个版本,使用:git reset --hard HEAD^^\n回退到20个版本之前,使用:git reset --hard HEAD~20\n二:指定commit_id有时候,提交的东西多了git log 查看记录git reflog 查看历史记录\n回退到指定版本:$ git reset --hard 52602b0\n\n只需要输入7位 ID 即可\n\n\n相关资料:\n\nGit 版本前后切换|博客园|codingOrange\n\n","categories":["Git"]},{"title":"Git 配置与介绍","url":"/2021/03/07/Git-%E9%85%8D%E7%BD%AE%E4%B8%8E%E4%BB%8B%E7%BB%8D/","content":"Github一、安装配置\n安装 \n访问网址 Git-download\nlinux Git-linux\n # yum install git (up to Fedora 21)\n # dnf install git(Fedora 22 and later)\n\n\n\n\n配置\n第一次使用需要进行用户配置\n# git config --global user.name &quot;username&quot;(不支持中文)\n# git config --global user.email &quot;useremail&quot;\n查看配置结果# git config --list\n\n\n\n\n\n二、认识Git\ngit记录的是什么\n\n\n![431e79f8.png]传统的版本控制器如svn工作原理,则是记录文件的每次改动\n\n\n\n\n![6c92b049.png]Git则是每个版本都保存一次,形成一个分支\n普通的程序员是把很多时间放在写代码和调bug上,而优秀的程序员是将更多的经历放在设计上。\n\n\n\ngit的工作流程\n\ngit流程\n本地:在工作目录中添加、修改文件\n暂存区-本地:将需要进行版本管理的文件放入暂存区\n提交:将暂存区的文件提交到Git仓库\n\n\ngit管理文件的三种状态\n已修改 (modified)\n已暂存 (staged)\n已提交 (committed)\n\n\n\n\n![8f8a0fbb.png]\n\n\n\n三、使用\nGit -生成 -添加 -提交\n\n# git init即可在当前项目中生成一个.git目录\n# git add README.md 文件添加到暂存区(本地必须存在该文件)。文件编码:utf-8notBOM\n# git commit -m &quot;add a readme file&quot;提交文件到仓库,””中为本次提交说明信息[1]\n# git log 查看历史提交记录,从近到远排序,commit后为提交的唯一hashId Author提交作者,Date提交时间,以及提交说明 \n\n\nGit -查看状态\n\n# git status 查看git状态,出现的提示[2]\n文件的两种状态[3]\n\n\nGit -取消暂存\n\n# git reset HEAD &lt;file&gt;... 取消还未提交文件的暂存状态,不指定文件则将当前所有暂存状态文件全部取消暂存状态\n\n\n\n\nGit -取消修改\n\n[!] # git checkout -- &lt;file&gt; 将仓库最近一次提交的file覆盖本地file\n\n\nGit -查看历史记录\n\n# git reflog 查看git历史记录\n\n\n\n四、Git -reset![5d67d3bb.png]\n\nGIT -reset\n# git reset HEAD &lt;file&gt;... \n取消还未提交文件的暂存状态,不指定文件则将当前所有暂存状态文件全部取消暂存状态\n仅对暂存区文件有效\n\n\n# git reset --mixed HEAD~\n--mixed默认指令,不加也可\n移动HEAD[4]的指向,将其指向指定的快照[5]\n将HEAD(指针)移动后指向的快照 回滚到暂存区,工作目录不受影响\n\n\n# git reset --soft HEAD~\n--soft软回滚\n移动HEAD的指向,将其指向上一个快照\n将指定版本的提交,回滚到暂存区,相当于撤销指定版本的一次提交\n\n\n# git reset --hard HEAD~\n--hard强制回滚\n移动HEAD的指向,将其指向指定的快照\n将HEAD指向的快照回滚到暂存区,同时将暂存区的文件还原到工作目录\n相当于本地、暂存区完全回滚到指定快照(版本)\n**会覆盖本地文件,删除版本中没有文的件**\n\n\n\n\nGit -回滚指定快照\n~ 可换成指定Hashid,一般输入Hashid不少于5位即可识别\n# git reset Hashid,只要知道某版本的Hashid,就可以回滚到暂存区,如果加上--hard,就会直接回滚到工作目录中\n\n\nGit -回滚个别文件\n# git reset 版本快照 文件名/路径因为没有HEAD指令,所以不会移动HEAD \n\n\n\n\n1.如果提交无误,则会返回【create mode 100644 readme.md】,其中100表示文件为普通文件,644表示权限 ↩2.'on branch master' 表示处于一个分支上;'Untracked files'表示下面红色的文件/文件夹是没有添加到暂存区的;'changes to be committed'表示新添加到暂存区的文件 ↩3.当一个文件已经被添加到暂存区(HEAD)后,这时再修改该文件,# git status就会看到该文件的两种状态,一个未提交到仓库(绿色),一个未添加到暂存区。 ↩4.这里的HEAD表示指针,表示指向某个分支。HEAD~表示指向上一个分支,并覆盖本地文件HEAD~~表示回退2个版本,也可使用HREAD~2表示 ↩5.版本 ↩5.每一个版本称为一个快照 ↩","categories":["Git"]},{"title":"MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)","url":"/2021/03/07/MySQL%E5%B8%B8%E8%A7%81%E7%9A%84%E4%B8%89%E7%A7%8D%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E%EF%BC%88InnoDB%E3%80%81MyISAM%E3%80%81MEMORY%EF%BC%89/","content":"\n\n转载:MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY) |博客园 my笔触作者:于果\n\nMySQL是我们经常使用的数据库处理系统(DBMS),不知小伙伴们有没有注意过其中的“存储引擎”(storage_engine)呢?有时候面试题中也会问道MySQL几种常用的存储引擎的区别。这次就简短侃一下存储引擎那些事儿。\n\n\n引擎(Engine)是电子平台上开发程序或系统的核心组件。利用引擎,开发者可迅速建立、铺设程序所需的功能,或利用其辅助程序的运转。一般而言,引擎是一个程序或一套系统的支持部分。常见的程序引擎有游戏引擎,搜索引擎,杀毒引擎等。\n\nOk,我们知道了,引擎就是一个程序的核心组件。\n简单来说,存储引擎就是指表的类型以及表在计算机上的存储方式。\n存储引擎的概念是MySQL的特点,Oracle中没有专门的存储引擎的概念,Oracle有OLTP和OLAP模式的区分。不同的存储引擎决定了MySQL数据库中的表可以用不同的方式来存储。我们可以根据数据的特点来选择不同的存储引擎。\n在MySQL中的存储引擎有很多种,可以通过“SHOW ENGINES”语句来查看。下面重点关注InnoDB、MyISAM、MEMORY这三种。\n一.InnoDB存储引擎\nInnoDB给MySQL的表提供了事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全。在MySQL从3.23.34a开始包含InnnoDB。它是MySQL上第一个提供外键约束的表引擎。而且InnoDB对事务处理的能力,也是其他存储引擎不能比拟的。靠后版本的MySQL的默认存储引擎就是InnoDB。\nInnoDB存储引擎总支持AUTO_INCREMENT。自动增长列的值不能为空,并且值必须唯一。MySQL中规定自增列必须为主键。在插入值的时候,如果自动增长列不输入值,则插入的值为自动增长后的值;如果输入的值为0或空(NULL),则插入的值也是自动增长后的值;如果插入某个确定的值,且该值在前面没有出现过,就可以直接插入。\nInnoDB还支持外键(FOREIGN KEY)。外键所在的表叫做子表,外键所依赖(REFERENCES)的表叫做父表。父表中被字表外键关联的字段必须为主键。当删除、更新父表中的某条信息时,子表也必须有相应的改变,这是数据库的参照完整性规则。\nInnoDB中,创建的表的表结构存储在_.frm_文件中(我觉得是frame的缩写吧)。数据和索引存储在innodb_data_home_dir和innodb_data_file_path定义的表空间中。\nInnoDB的优势在于提供了良好的事务处理、崩溃修复能力和并发控制。缺点是读写效率较差,占用的数据空间相对较大。\n二.MyISAM存储引擎\nMyISAM是MySQL中常见的存储引擎,曾经是MySQL的默认存储引擎。MyISAM是基于ISAM引擎发展起来的,增加了许多有用的扩展。\nMyISAM的表存储成3个文件。文件的名字与表名相同。拓展名为_frm、MYD、MYI_。其实,frm文件存储表的结构;MYD文件存储数据,是MYData的缩写;MYI文件存储索引,是MYIndex的缩写。\n基于MyISAM存储引擎的表支持3种不同的存储格式。包括静态型、动态型和压缩型。其中,静态型是MyISAM的默认存储格式,它的字段是固定长度的;动态型包含变长字段,记录的长度不是固定的;压缩型需要用到myisampack工具,占用的磁盘空间较小。\nMyISAM的优势在于占用空间小,处理速度快。缺点是不支持事务的完整性和并发性。\n三.MEMORY存储引擎\nMEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来创建表,而且数据全部放在内存中。这些特性与前面的两个很不同。\n每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为_frm_类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。\nMEMORY默认使用哈希索引。速度比使用B型树索引快。当然如果你想用B型树索引,可以在创建索引时指定。\n注意,MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,所有数据都会消失。因此,基于MEMORY的表的生命周期很短,一般是一次性的。\n四.怎样选择存储引擎\n在实际工作中,选择一个合适的存储引擎是一个比较复杂的问题。每种存储引擎都有自己的优缺点,不能笼统地说谁比谁好。\n\nInnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。\nMyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。\nMEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。\n注意,同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。\n__EOF__","categories":["MySql"],"tags":["MySql"]},{"title":"MySQL数据库崩溃","url":"/2021/03/07/MySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B4%A9%E6%BA%83/","content":"错误:某台服务器下的网站能访问,但是所有的网站数据库都不能连接\n使用PHPmyadmin 提示#2003 无法登录 MySQL 服务器\n\nERROR 2003(HYO00):Can’t connect to MySQL server on ‘localhost’(10061)\n\n原因:数据库崩溃\n解决:\n重启数据库\n\n\nwin:cmd中;(在没有数据库管理软件,且不愿意重启服务器时)输入 tasklist | findstr mysql 查看进程状态输入 net start mysql 启动进程net stop mysql 结束进程\n\n若提示服务名无效,在MySql/bin/目录,执行命令:mysqld -install 即可卸载同上 mysqld --remove mysql\n\n\nLinux:systemctl status mysql 查看进程状态systemctl restart mysql 重启systemctl stop mysql 停止systemctl start mysql 启动\n或者重启服务器(开关机的那种,前提是,各项服务设置过开机启动)\n\n\n相关资料:\n\nwindows下Mysql安装启动及常用操作\n\n","categories":["MySql"]},{"title":"MySql row_number()序号函数","url":"/2021/07/22/MySql-row-number-%E5%BA%8F%E5%8F%B7%E5%87%BD%E6%95%B0/","content":"row_number函数简介row_number()是一个排名函数,它返回一行的序号,从第一行的1开始。为结果集中的每一行或每组行添加唯一编号。\n\n要求MySQL:8.0\n\n不过幸运的是,低版本的MySQL提供了可用于模拟row_number()函数的会话变量。\n下面将演示原版和模拟两种方式\nMySql 8.0 原生写法\nROW_NUMBER() OVER (&lt;partition_definition&gt; &lt;order_definition&gt;) \n\n常见用法:为行分配序号以下语句使用ROW_NUMBER()函数为products表中的每一行分配一个序号:\nSELECT ROW_NUMBER() OVER ( ORDER BY productName ) row_num, productName, msrpFROM productsORDER BY productName; # 这是输出+---------+---------------------------------------------+--------+| row_num | productName | msrp |+---------+---------------------------------------------+--------+| 1 | 18th century schooner | 122.89 || 2 | 18th Century Vintage Horse Carriage | 104.72 || 3 | 1900s Vintage Bi-Plane | 68.51 || 4 | 1900s Vintage Tri-Plane | 72.45 || 5 | 1903 Ford Model A | 136.59 || 6 | 1904 Buick Runabout | 87.77 || 7 | 1911 Ford Town Car | 60.54 || 8 | 1912 Ford Model T Delivery Wagon | 88.51 || 9 | 1913 Ford Model T Speedster | 101.31 || 10 | 1917 Grand Touring Sedan | 170.00 || 11 | 1917 Maxwell Touring Car | 99.21 || 12 | 1926 Ford Fire Engine | 60.77 || 13 | 1928 British Royal Navy Airplane | 109.42 |...\n\n更多语法见MySQL ROW_NUMBER 函数\n模拟 row_number()** 方法一 **\n要模拟row_number()函数,您必须在查询中使用会话变量。\n以下语句从employees表中获取5名员工,并从1开始为每行添加行号。\nSET @row_number &#x3D; 0;SELECT\t( @row_number :&#x3D; @row_number + 1 ) AS num,\tfirstName,\tlastName FROM\temployees \tLIMIT 5; # 这是输出+------+-----------+-----------+| num | firstName | lastName |+------+-----------+-----------+| 1 | Diane | Murphy || 2 | Mary | Phan || 3 | Jeff | Firrelli || 4 | William | Patterson || 5 | Gerard | Bondur |+------+-----------+-----------+5 rows in set (0.00 sec)\n在上面的陈述中:\n\n在第一个语句中,我们定义了一个名为的变量 row_number,并将其值设置为0.这row_number是由@前缀指示的会话变量。\n在第二个语句中,我们从employees表中选择数据,并将每行的 row_number变量值增加到1。LIMIT子句用于约束返回的行数,在这种情况下,它被设置为5。\n\n** 方法二 **另一种技术是使用会话变量作为派生表,并将其与主表交叉连接。请参阅以下查询:\nSELECT (@row_number:&#x3D;@row_number + 1) AS num, firstName, lastNameFROM employees,(SELECT @row_number:&#x3D;0) AS tLIMIT 5; # 这是输出+------+-----------+-----------+| num | firstName | lastName |+------+-----------+-----------+| 1 | Diane | Murphy || 2 | Mary | Phan || 3 | Jeff | Firrelli || 4 | William | Patterson || 5 | Gerard | Bondur |+------+-----------+-----------+5 rows in set (0.00 sec)\n请注意,派生表必须具有自己的别名,以使查询在语法上正确。\n更多语法见MySQL 添加序号\n\n参考资料:\n\nMySQL ROW_NUMBER 函数\nMySQL 添加序号\n力扣|图解SQL面试题:经典排名问题\n\n","categories":["MySql"],"tags":["MySql"]},{"title":"Mysql 5.7 的‘虚拟列’是做什么?","url":"/2021/08/13/Mysql-5-7-%E7%9A%84%E2%80%98%E8%99%9A%E6%8B%9F%E5%88%97%E2%80%99%E6%98%AF%E5%81%9A%E4%BB%80%E4%B9%88%EF%BC%9F/","content":"\n原文:Mysql 5.7 的‘虚拟列’是做什么?作者:菜鸟笔记\n\nMysql 5.7 中推出了一个非常实用的功能\n虚拟列 Generated (Virtual) Columns\n对于它的用途,我们通过一个场景来说明\n假设有一个表,其中包含一个 date 类型的列\nSimpleDateSimpleDate 是一个常用的查询字段,并需要对其执行日期函数,例如SELECT ... WHERE dayofweek(SimpleDate) = 3 ...\n 此时的问题是 即使对 SimpleDate 建立索引,这个查询语句也无法使用,因为日期函数阻止了索引\n为了提高查询效率,通常要进行额外的操作,例如新建一个字段 SimpleDate_dayofweek,存放 dayofweek(SimpleDate) 的计算结果,然后对这列创建索引\nSimpleDate_dayofweek 的值需要程序写入,例如使用触发器,在 SimpleDate 有变动时更新\n这样查询就可以改为SELECT ... WHERE SimpleDate_dayofweek = 3 ...\n这么做的好处是提高了查询性能,可以使用 SimpleDate_dayofweek 列的索引了,但又带来了其他麻烦,例如\n\n降低了数据写入性能\n增加冗余数据,占用了更多的存储空间\n增加代码维护成本\n\n虚拟列 Generated Columns 就是用来解决这个问题的,可以增加一个可被索引的列,但实际上并不存在于数据表中\n对于上面的例子,可以对 SimpleDate 创建一个虚拟列,然后对虚拟列创建索引,如\nCREATE TABLE &#96;test&#96; ( &#96;id&#96; int(11) NOT NULL AUTO_INCREMENT, &#96;SimpleDate&#96; date DEFAULT NULL, ... &#96;SimpleDate_dayofweek&#96; tinyint(4) GENERATED ALWAYS AS (dayofweek(SimpleDate)) VIRTUAL, PRIMARY KEY (&#96;id&#96;), KEY &#96;SimpleDate_dayofweek&#96; (&#96;SimpleDate_dayofweek&#96;), ) ENGINE&#x3D;InnoDB\n这样就建好了虚拟列,此列的值不用我们计算SELECT ... WHERE SimpleDate_dayofweek = 3 ...\n 查询语句可以正常使用索引\n通过虚拟列的方式,即满足了查询性能,也不会有之前那个解决方案的潜在麻烦\n虚拟列不存储在数据行中,但虚拟列的元数据信息会存在于相关系统表中,对虚拟列的添加或者删除只会涉及这些系统表,不会导致数据表的重建,所以效率很高\n需要注意,不能建立虚拟列和真实列的联合索引\n","categories":["MySql"],"tags":["MySql"]},{"title":"Mysql 模糊查询的几种方式","url":"/2022/02/18/Mysql-%E6%A8%A1%E7%B3%8A%E6%9F%A5%E8%AF%A2%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F/","content":"查询方式LIKESELECT * FROM 表名 WHERE 字段名 like &quot;%字符%&quot;;\nfind_in_set(要查的字符, 表字段名)SELECT * FROM 表名 WHERE find_in_set(&#39;字符&#39;, 字段名);\nlocate(要查的字符,表字段名)SELECT * FROM 表名 WHERE locate(&#39;字符&#39;, 字段名);\nINSTR(表字段名,要查的字符)select * from 表名 where INSTR(字段,字符);\n查询效率我有张表,数据不多,我想查出表字段service_project_ids含有25的结果\nmysql&gt; SELECT id,name,service_project_ids FROM &#96;laifu&#96;.&#96;laifu_service_diseases&amp;problems&#96;;+----+-----------------+---------------------+| id | name | service_project_ids |+----+-----------------+---------------------+| 1 | 心血管疾病 | 25 || 2 | 肝病 | 2,25,3 || 5 | 胃病 | 3,4,25 || 6 | 皮肤病 | 4,5,235 || 7 | 肠胃病 | 5,1256 |+----+-----------------+---------------------+5 rows in set (0.00 sec)\n以下分别是不同查询语句的结果,以及查询时间\nLikemysql&gt; select id,name,service_project_ids FROM &#96;laifu_service_diseases&amp;problems&#96; where service_project_ids LIKE &#39;25&#39; OR service_project_ids LIKE &#39;25,%&#39; -&gt; OR service_project_ids LIKE &#39;%,25,%&#39; OR service_project_ids LIKE &#39;%,25&#39;;+----+-----------------+---------------------+| id | name | service_project_ids |+----+-----------------+---------------------+| 1 | 心血管疾病 | 25 || 2 | 肝病 | 2,25,3 || 5 | 胃病 | 3,4,25 |+----+-----------------+---------------------+3 rows in set (0.000082 sec)\n\nfind_in_set()mysql&gt; select id,name,service_project_ids FROM &#96;laifu_service_diseases&amp;problems&#96; where find_in_set(25,service_project_ids);+----+-----------------+---------------------+| id | name | service_project_ids |+----+-----------------+---------------------+| 1 | 心血管疾病 | 25 || 2 | 肝病 | 2,25,3 || 5 | 胃病 | 3,4,25 |+----+-----------------+---------------------+3 rows in set (0.000086 sec)\n\nlocate()mysql&gt; select id,name,service_project_ids FROM &#96;laifu_service_diseases&amp;problems&#96; where locate(25,service_project_ids);+----+-----------------+---------------------+| id | name | service_project_ids |+----+-----------------+---------------------+| 1 | 心血管疾病 | 25 || 2 | 肝病 | 2,25,3 || 5 | 胃病 | 3,4,25 || 7 | 肠胃病 | 5,1256 |+----+-----------------+---------------------+4 rows in set (0.000592 sec)\n\nINSTR()mysql&gt; select id,name,service_project_ids FROM &#96;laifu_service_diseases&amp;problems&#96; where INSTR(service_project_ids,25);+----+-----------------+---------------------+| id | name | service_project_ids |+----+-----------------+---------------------+| 1 | 心血管疾病 | 25 || 2 | 肝病 | 2,25,3 || 5 | 胃病 | 3,4,25 || 7 | 肠胃病 | 5,1256 |+----+-----------------+---------------------+4 rows in set (0.000799 sec)\n\n结论对于小规模的模糊查询,使用LIKE依旧是最好的选择,而其他网页说大规模模糊查询时,locate却是性能最好的。\n\n参考资料:\n\nMySQL如何判断字段是否包含某个字符串\n\n","categories":["MySql"],"tags":["MySql"]},{"title":"Mysql主从同步的实现原理与配置实战","url":"/2022/08/21/Mysql%E4%B8%BB%E4%BB%8E%E5%90%8C%E6%AD%A5%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%AE%9E%E6%88%98/","content":"来源:Mysql主从同步的实现原理与配置实战 - 八重樱 - 博客园\n\n什么是mysql主从同步?当master(主)库的数据发生变化的时候,变化会实时的同步到slave(从)库。\n\n\n主从同步有什么好处?\n\n水平扩展数据库的负载能力。\n容错,高可用。Failover(失败切换)/High Availability\n数据备份。\n\n\n\n\n主从同步的原理是什么?首先我们来了解master-slave的体系结构。如下图:\n\n不管是delete、update、insert,还是创建函数、存储过程,所有的操作都在master上。当master有操作的时候,slave会快速的接收到这些操作,从而做同步。 \n但是,这个机制是怎么实现的呢?在master机器上,主从同步事件会被写到特殊的log文件中(binary-log);在slave机器上,slave读取主从同步事件,并根据读取的事件变化,在slave库上做相应的更改。\n如此,就实现了主从同步了!\n下面我们来详细的了解。\n\n3-1 主从同步事件有哪些上面说到:在master机器上,主从同步事件会被写到特殊的log文件中(binary-log);主从同步事件有3种形式:statement、row、mixed。\nstatement:会将对数据库操作的sql语句写入到binlog中。\nrow:会将每一条数据的变化写入到binlog中。\nmixed:statement与row的混合。Mysql决定什么时候写statement格式的,什么时候写row格式的binlog。\n\n\n\n\n3-2. 在master机器上的操作当master上的数据发生改变的时候,该事件(insert、update、delete)变化会按照顺序写入到binlog中。binlog dump线程当slave连接到master的时候,master机器会为slave开启binlog dump线程。当master 的 binlog发生变化的时候,binlog dump线程会通知slave,并将相应的binlog内容发送给slave。\n\n\n3-3. 在slave机器上的操作当主从同步开启的时候,slave上会创建2个线程。\nI/O线程。该线程连接到master机器,master机器上的binlog dump线程会将binlog的内容发送给该I/O线程。该I/O线程接收到binlog内容后,再将内容写入到本地的relay log。\nSQL线程。该线程读取I/O线程写入的relay log。并且根据relay log的内容对slave数据库做相应的操作。\n\n\n\n\n3-4. 如何在master、slave上查看上述的线程?使用SHOW PROCESSLIST命令可以查看。如图,在master机器上查看binlog dump线程如图,在slave机器上查看I/O、SQL线程。\n\n接下来给大家讲解mysql主从同步实战系统环境:系统的话大同小异,都差不多,我这里用的是ubuntu16.04+mysql5.7,用到两台服务器:其中master IP:192.168.33.22,另一个slave IP:192.168.33.33\nmaster机器上的操作\n更改配置文件我们找到文件/etc/mysql/mysql.conf.d/mysqld.cnf。\n\n配置如下:\nbind-address = 192.168.33.22 #your master ipserver-id = 1 #在master-slave架构中,每台机器节点都需要有唯一的server-idlog_bin = /var/log/mysql/mysql-bin.log #开启binlog\n\n\n\n重启mysql,以使配置文件生效。\n\nsudo systemctl restart mysql\n\n\n\n创建主从同步的mysql user。\n\n$ mysql -u root -pPassword:##创建slave1用户,并指定该用户只能在主机192.168.33.33上登录。mysql&gt; CREATE USER &#39;slave1&#39;@&#39;192.168.33.33&#39; IDENTIFIED BY &#39;slavepass&#39;;Query OK, 0 rows affected (0.00 sec)##为slave1赋予REPLICATION SLAVE权限。mysql&gt; GRANT REPLICATION SLAVE ON *.* TO &#39;slave1&#39;@&#39;192.168.33.33&#39;;Query OK, 0 rows affected (0.00 sec)\n\n\n为MYSQL加读锁为了主库与从库的数据保持一致,我们先为mysql加入读锁,使其变为只读。\n\nmysql&gt; FLUSH TABLES WITH READ LOCK;Query OK, 0 rows affected (0.00 sec)\n\n\n\n记录下来MASTER REPLICATION LOG 的位置该信息稍后会用到。\n\nmysql&gt; SHOW MASTER STATUS;+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001 | 613 | | | |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)\n\n\n\n将master DB中现有的数据信息导出\n\n$ mysqldump -u root -p --all-databases --master-data &gt; dbdump.sql\n\n\n\n接触master DB的读锁\n\nmysql&gt; UNLOCK TABLES;\n\n\n\n将步骤6中的dbdump.sql文件copy到slave\n\nscp dbdump.sql ubuntu@192.168.33.33:/home/ubuntu\n\n\n\n\nslave机器上的操作\n更改配置文件我们找到文件/etc/mysql/mysql.conf.d/mysqld.cnf。\n\n更改配置如下:\nbind-address = 192.168.33.33 #your slave ipserver-id = 2 #master-slave结构中,唯一的server-idlog_bin = /var/log/mysql/mysql-bin.log #开启binlog\n\n\n\n重启mysql,以使配置文件生效\n\nsudo systemctl restart mysql\n\n\n\n导入从master DB。导出的dbdump.sql文件,以使master-slave数据一致\n\n$ mysql -u root -p &lt; /home/ubuntu/dbdump.sql\n\n\n\n使slave与master建立连接,从而同步复制代码\n\n$ mysql -u root -pPassword:mysql&gt; STOP SLAVE;Query OK, 0 rows affected, 1 warning (0.00 sec)mysql&gt; CHANGE MASTER TO -&gt; MASTER_HOST=&#x27;192.168.33.22&#x27;, -&gt; MASTER_USER=&#x27;slave1&#x27;, -&gt; MASTER_PASSWORD=&#x27;slavepass&#x27;, -&gt; MASTER_LOG_FILE=&#x27;mysql-bin.000001&#x27;, -&gt; MASTER_LOG_POS=613;Query OK, 0 rows affected, 2 warnings (0.01 sec)mysql&gt; START SLAVE;Query OK, 0 rows affected (0.00 sec)MASTER_LOG_FILE=&#x27;mysql-bin.000001&#x27;与MASTER_LOG_POS=613的值,是从上面的SHOW MASTER STATUS得到的。经过如此设置之后,就可以进行master-slave同步了\n\n","categories":["MySql"]},{"title":"NERD Commenter","url":"/2021/03/07/NERD-Commenter/","content":"\n转载:vim插件之 NERD Commenter作者:_扬帆起航\n\n【插件使用】注:这里已经将””改为”,”\n简单介绍下NERD Commenter的常用键绑定,以C/C++文件为例,详析的使用方法,请:h NERDCommenter。在Normal或者Visual 模式下:\n经测试,想要下面的命令生效,需要将光标置于每行的空白处,也就是说光标上不能有字符。\n\n\\ca 在可选的注释方式之间切换,比如C/C++ 的块注释/* */和行注释//\\cc 注释当前行\\c 切换注释/非注释状态\\cs 以”性感”的方式注释\\cA 在当前行尾添加注释符,并进入Insert模式\\cu 取消注释Normal模式下,几乎所有命令前面都可以指定行数。 比如 输入 6,cs 的意思就是以性感方式注释光标所在行开始6行代码Visual模式下执行命令,会对选中的特定区块进行注释/反注释\n\n此外,其它的nerdcommenter命令可以在NORMAL模式下输入命令 :map 看到。 下面是我的截图\n\n注:再次说明,各命令前缀是可以自己设置的,通常是逗号’,’或者’\\’.\n注:看名字可以知道,它和The NERD Tree同属一个作者A mind needs books like a sword needs a whetstone.\n【插件介绍】这是一款用于快速高效注释代码的插件\n使用这款插件,你可以对多种文件类型的文件进行不同方式地、快速地注释。这对使用Vim来写代码或者修改配置文件的同学来说,无疑是提升效率和快感的一件利器。\n【插件安装】我总结了三种安装方法\n(1). 在bundle中安装\n 会使用Bundle管理vim插件的朋友都知道,只要加入以下代码,即可。 Bundle &#39;The-NERD-Commenter&#39; 或者Bundle&#39;scrooloose/nerdcommenter&#39;\n(2)直接下载你可以到这里来下载这个插件,将压缩包里面的doc/和plugin/文件夹丢到~/.vim/下面就是安装了。为了可以使用其帮助文档,你还需要在Vim中执行:helptags ~/.vim/doc/来注册。\n【插件配置】如果想把默认的leader从“\\”改为“,”, 则在在配置文件.vimrc中,加入下面一行let mapleader=&quot;,&quot;\n","categories":["Vim"]},{"title":"NPM 基本用法介绍","url":"/2021/04/05/NPM-%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95%E4%BB%8B%E7%BB%8D/","content":"npm是node js工程管理的工具,在一个大的node js项目可能中有着许多第三方的包和库,如vue、angular、react、webpack等。我们就可以使用npm进行安装删除等管理操作。\n另外在我们把项目分享给他人时,只需要上传核心代码,依赖包和库他人就直接使用npm下载就可以了。\n\n安装包\n\n 全局安装:#npm install -g PackName &gt; 1. #npm install -g create-react-app &gt; 这时电脑中就有了一个react的全局安装包,当在某个项目需要时,就可以使用#create-react-app react-helloworld在该处创建一个’react-hellowworld’的项目文件夹。进入该文件夹输入npm start[^start]启动访问 &gt; 2. install 可简写为 i #npm i -g packname 提示无法加载….\\npm\\xxx.ps1因为在此系统上禁止运行脚本… 1.以管理员方式打开powershell 2.运行命令:set-ExecutionPolicy RemoteSigned 3.出现: 执行策略更改 执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险,如 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies 帮助主题所述。是否要更改执行策略? [Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“N”): 4. 输入:Y 即可 5. 来自:无法加载ps1文件 博客园 \n 局部安装:#npm install PackName --save\n\n在测试某些包时,我们可以通过 #npm init -y来新建项目进行测试[^test]\n\n\n\n\n\n查看包\n\n 查看全局:#npm list -g --depth 0 &gt; -g:global &gt; --depth 0:深度0,所有项目只展示一级 查看当前:#npm list --depth 0\n\n \n 3. 删除包\n **删除**:#`#npm uninstall PackName`\n \n\n\n\n安装特定版本包\n\n 删除:##npm i PackName@0.26.0 &gt; @0.26.0:在包名后加@+特定版本就可以下载特定版本的包\n\n \n\n\n\nNPM 基本用法介绍 | Node.js 入门 JavaScript_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili\n\n注释\n[^start]:这里的npm start 指令在当前目录’package.json’ 中 “scripts”行,不同的包启动指令不一样,可自定义\n[^test]:比如我们要测试ramda这个包,我们先新建一个文件夹‘node-test’,再运行#npm init -y,在‘node-test’下创建一个package.josn文件,打开后在[script]行中添加&quot;start&quot;: &quot;node index.js&quot;,然后目录下创建 index.js 文件,这样就会直接启动 index.js文件;再运行 #npm i --save ramda,并在index.js中写入const R = require(&quot;ramda&quot;);console.log(R.add(1,5));运行 #npm start即可查看结果\n","categories":["npm"]},{"title":"Nginx负载均衡策略","url":"/2021/03/15/Nginx%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B9%8B%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E7%AD%96%E7%95%A5%EF%BC%886%E7%A7%8D%EF%BC%89/","content":"\n原文:Nginx服务器之负载均衡策略(6种)作者: 左羽\n\n一、关于Nginx的负载均衡在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器。详情请查看我的另一篇博客。\n二、Nginx负载均衡策略负载均衡用于从”upstream”模块定义的后端服务器列表中选取一台服务器接受用户的请求。一个最基本的 upstream 模块是这样的模块内的 server 是服务器列表:\n# 动态服务器组upstream dynamic_zuoyu &#123;\tserver localhost:8080; #tomcat 7.0\tserver localhost:8081; #tomcat 8.0\tserver localhost:8082; #tomcat 8.5 server localhost:8083; #tomcat 9.0&#125;\n\n在 upstream 模块配置完成后,要让指定的访问反向代理到服务器列表:\n# 其他页面反向代理到tomcat服务器localtion ~ 。*$ &#123;\tindex index.jsp index.html; proxy_pass http://dynamic_zuoyu;&#125;\n\n这就是最基本的负载均衡实列,但这不足以满足实际需求;目前Nginx服务器的 upstream 模块支持6种方式的分配:\n\n\n\n轮询\n默认方式\n\n\n\nweight\n权重方式\n\n\nip_hash\n依据IP分配方式\n\n\nleast_conn\n最少连接方式\n\n\nfair(第三方)\n响应时间方式\n\n\nurl_hash(第三方)\n依据URL分配方式\n\n\n在这里,只详细说明Nginx自带的负载均衡策略,第三方不多描述。\n\n\n\n1、轮询最基本的配置方法,上面的例子就是轮询的方式,它是 upstream 模块默认的负载均衡策略。每个请求会按时间顺序逐一分配到不同的后端服务器。\n有如下参数:\n\n\n\n\n\n\n\n\nfail_time\n与 max_fails 结合使用\n\n\nmax_fails\n设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了\n\n\nfail_time\n服务器会被认为停机的时间长度,默认为10s。\n\n\nbackup\n标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。\n\n\ndown\n标记服务器永久停机了。\n\n\n注意:\n\n在轮询中,如果服务器的down掉了,会自动剔除该服务器。\n缺省配置就是轮询策略。\n此策略适合服务器配置相当,无状态且短平快的服务使用。\n\n2、weight权重方式,在轮询策略的基础上指定轮询的几率。例子如下:\n#动态服务器组upstream dynamic_zuoyu &#123;\tserver localhost:8080 weight=2; #tomcat 7.0\tserver localhost:8081; #tomcat 8.0\tserver localhost:8082 backup; #tomcat 8.5\tserver localhost:8083 max_fails=3 fail_timeout=20s; #tomcat 9.0&#125;\n\n在该例子中,weight 参数用于指定轮询几率,weight 的默认值为1;weight的数值与访问比率成正比,比如Tomcat7.0被访问的几率为其他服务器的两倍。\n注意:\n\n权重越高分配到需要处理的请求元多。\n此策略可以与least_conn和ip_hash 结合使用。\n此策略比较适合服务器硬件配置差别比较大的情况。\n\n3、ip_hash指定负载均衡器按照级域客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服器的问题。\n#动态服务器组upstream dynamic_zuoyu &#123;\tip_hash; #保证每个访客固定访问一个后端服务器\tserver localhost:8080 weight=2; #tomcat 7.0\tserver localhost:8081; #tomcat 8.0\tserver localhost:8082; #tomcat 8.5\tserver localhost:8083 max_fails=3 fail_timeout=20s; #tomcat 9.0&#125;\n注意:\n\n在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。\nip_hash不饿能与backup同时使用。\n此策略适合有状态服务,比如session。\n当有服务器需要剔除,必须手动down掉。\n\n4、least_conn把请求转发给连接数较少的后端服务器。轮询算法是把请求评菌的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。\n#动态服务器组upstream dynamic_zuoyu &#123;\tleast_conn; #把请求转发给连接数较少的后端服务器\tserver localhost:8080 weight=2; #tomcat 7.0\tserver localhost:8081; #tomcat 8.0\tserver localhost:8082 backup; #tomcat 8.5\tserver localhost:8083 max_fails=3 fail_timeout=20s; #tomcat 9.0&#125;\n注意:\n\n此负载均衡策略适合请求处理时间长短不一造成的服务器过载的情况。\n\n5、第三方策略第三方的负载均衡策略的实现需要安装第三方插件。\n① fair按照服务器端的响应时间来分配请求,响应时间短的优先分配。\n#动态服务器组upstream dynamic_zuoyu &#123;\tserver localhost:8080; #tomcat 7.0\tserver localhost:8081; #tomcat 8.0\tserver localhost:8082; #tomcat 8.5\tserver localhost:8083; #tomcat 9.0\tfair; #实现响应时间短的优先分配 &#125;\n\n② url_hash按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多此请求,可能会达到不同的服务器上,导致不必要的多此下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。\n#动态服务器组upstream dynamic_zuoyu &#123;\thash $request_uri; #实现每个url定向到同一个后端服务器\tserver localhost:8080; #tomcat 7.0\tserver localhost:8081; #tomcat 8.0\tserver localhost:8082; #tomcat 8.5\tserver localhost:8083; #tomcat 9.0&#125;\n\n三、总结以上便是6种负载均衡策略的实现方式,其中除了轮询和轮询权重外,都是Nginx根据不同的算法实现的。在实际运用中,需要更具不同的场景选择性运用,大都是多种策略结合使用以达到实际需求。\n","categories":["Nginx"],"tags":["Nginx"]},{"title":"No input file specified","url":"/2021/03/07/No-input-file-specified/","content":"nginx解决NGINX PHP “No input file specified”\napacheno input file specified 三种解决方法打开.htaccess 在RewriteRule 后面的index.php教程后面添加一个“?”\n完整代码如下\n# /www.xx.com/.htaccess RewriteEngine onRewriteCond %&#123;Request_FILENAME&#125; !-fRewriteCond $1 !^(index.php|images|robots.txt)RewriteRule ^(.*)$ /index.php?/$1 [L]\n\n如果是apache服务器出问题,看看是不是的Apache 把 .php 后缀的文件解析哪里有问题了。\n总结\nApache 将哪些后缀作为 PHP 解析。例如,让 Apache 把 .php 后缀的文件解析为PHP。可以将任何后缀的文件解析为 PHP,只要在以下语句中加入并用空格分开。这里以添加一个 .phtml 来示例。\nAddType application/x-httpd-php .php .phtml\n为了将 .phps教程作为 PHP 的源文件进行语法高亮显示,还可以加上:\nAddType application/x-httpd-php-source .phps\n用通常的过程启动 Apache(必须完全停止 Apache 再重新启动,而不是用 HUP 或者USR1 信号使 Apache 重新加载)。\n","categories":["Apache"]},{"title":"PHP has encountered an Access Violation","url":"/2021/04/06/PHP-has-encountered-an-Access-Violation-at-0416B2AF/","content":"遇到一个报错\n\nPHP has encountered an Access Violation at 0416B2AF\n\n配置为:\n\nphp 5.3.2\nwindows 2008 R2\nmysql 5.7 \nIIS7\n\n解决根据关于PHP has encountered an Access Violation问题的处理这篇文章列举的可能\n突然想到公司iis从来没有计划回收过,遂重启iis并回收应用池,完美解决\n","categories":["IIS"]},{"title":"PHP高效率写法","url":"/2021/08/25/PHP%E9%AB%98%E6%95%88%E7%8E%87%E5%86%99%E6%B3%95/","content":"\n转自: PHP高效率写法(详解原因)作者: ﹏Sakura\n\n1. 尽量静态化:如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍。当然了,这个测试方法需要在十万级以上次执行,效果才明显。其实静态方法和非静态方法的效率主要区别在内存:静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快。静态方法始终调用同一块内存,其缺点就是不能自动进行销毁,而是实例化可以销毁。\n2.echo的效率高于print,因为echo没有返回值,print返回一个整型;测试:Echo0.000929 - 0.001255 s (平均 0.001092 seconds)Print0.000980 - 0.001396 seconds (平均 0.001188 seconds)相差8%左右,总体上echo是比较快的。注意,echo大字符串的时候,如果没有做调整就严重影响性能。使用打开apached的mod_deflate进行压缩或者打开ob_start先将内容放进缓冲区。\n3.在循环之前设置循环的最大次数,而非在在循环中;傻子都明白的道理。\n4.销毁变量去释放内存,特别是大的数组;数组和对象在php特别占内存的,这个由于php的底层的zend引擎引起的,一般来说,PHP数组的内存利用率只有 1/10, 也就是说,一个在C语言里面100M 内存的数组,在PHP里面就要1G。特别是在PHP作为后台服务器的系统中,经常会出现内存耗费太大的问题。\n5.避免使用像__get, __set, __autoload等魔术方法;对于__开头的函数就命名为魔术函数,此类函数都在特定的条件下初访的。总得来说,有下面几个魔术函数__construct(),__destruct(),__get(),__set(),__unset(),__call(),__callStatic(),__sleep(),__wakeup(),__toString(),__set_state(),__clone(),__autoload()\n其实,如果__autoload不能高效的将类名与实际的磁盘文件(注意,这里指实际的磁盘文件,而不仅仅是文件名)对应起来,系统将不得不做大量的文件是 否存在(需要在每个include path中包含的路径中去寻找)的判断,而判断文件是否存在需要做磁盘I/O操作,众所周知磁盘I/O操作的效率很低,因此这才是使得autoload机制效率降低的原因。\n因此,我们在系统设计时,需要定义一套清晰的将类名与实际磁盘文件映射的机制。这个规则越简单越明确,autoload机制的效率就越高。结论:autoload机制并不是天然的效率低下,只有滥用autoload,设计不好的自动装载函数才会导致其效率的降低.\n所以说尽量避免使用__autoload魔术方法,有待商榷。\n6.requiere_once()比较耗资源;这是因为requiere_once需要判断该文件是否被引用过),所以能不用尽量不用。常用require/include方法避免。\n7.在includes和requires中使用绝对路径。如果包含相对路径,PHP会在include_path里面遍历查找文件。用绝对路径就会避免此类问题,因此解析操作系统路径所需的时间会更少。\n8.如果你需要得到脚本执行时的时间,$_SERVER[‘REQUSET_TIME’]优于time();可以想象。一个是现成就可以直接用,一个还需要函数得出的结果。\n9.能用PHP内部字符串操作函数的情况下,尽量用他们,不要用正则表达式; 因为其效率高于正则;没得说,正则最耗性能。有没有你漏掉的好用的函数?例如:strpbrk()strncasecmp()strpos()/strrpos()/stripos()/strripos()加速 strtr如果需要转换的全是单个字符的时候,用字符串而不是数组来做 strtr: 'e', )); // bad\n?>效率提升:10 倍。\n10.str_replace字符替换比正则替换preg_replace快,但strtr比str_replace又快1/4;另外不要做无谓的替换即使没有替换,str_replace 也会为其参数分配内存。很慢!解决办法:用 strpos 先查找(非常快),看是否需要替换,如果需要,再替换效率:- 如果需要替换:效率几乎相等,差别在 0.1% 左右。如果不需要替换:用 strpos 快 200%。\n11.参数为字符串如果一个函数既能接受数组又能接受简单字符做为参数,例如字符替换函数,并且参数列表不是太长,可以考虑额外写一段替换代码,使得每次传递参数都是一 个字符,而不是接受数组做为查找和替换参数。大事化小,1+1&gt;2;\n12.最好不用@,用@掩盖错误会降低脚本运行速度;用@实际上后台有很多操作。用@比起不用@,效率差距:3 倍。特别不要在循环中使用@,在 5 次循环的测试中,即使是先用 error_reporting(0) 关掉错误,在循环完成后再打开,都比用@快。\n13.$row[‘id’]比$row[id]速度快7倍建议养成数组键加引号的习惯;\n14.在循环里别用函数例如For($x=0; $x &lt; count($array); $x), count()函数在外面先计算;原因你懂的。\n16.在类的方法里建立局部变量速度最快,几乎和在方法里调用局部变量一样快;17.建立一个全局变量要比局部变量要慢2倍;由于局部变量是存在栈中的,当一个函数占用的栈空间不是很大的时候,这部分内存很有可能全部命中cache,这时候CPU访问的效率是很高的。相反,如果一个函数里既使用了全局变量又使用了局部变量,那么当这两段地址相差较大时,cpu cache需要来回切换,那么效率会下降。(我理解啊)\n18.建立一个对象属性(类里面的变量)例如($this-&gt;prop++)比局部变量要慢3倍;19.建立一个未声明的局部变量要比一个已经定义过的局部变量慢9-10倍20.声明一个未被任何一个函数使用过的全局变量也会使性能降低(和声明相同数量的局部变量一样)。PHP可能去检查这个全局变量是否存在;\n21.方法的性能和在一个类里面定义的方法的数目没有关系因为我添加10个或多个方法到测试的类里面(这些方法在测试方法的前后)后性能没什么差异;\n22.在子类里方法的性能优于在基类中;23.只调用一个参数并且函数体为空的函数运行花费的时间等于7-8次$localvar++运算,而一个类似的方法(类里的函数)运行等于大约15次$localvar++运算;24 用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。\nPHP 引擎允许使用单引号和双引号来封装字符串变量,但是这个是有很大的差别的!使用双引号的字符串告诉 PHP 引擎首先去读取字符串内容,查找其中的变 量,并改为变量对应的值。一般来说字符串是没有变量的,所以使用双引号会导致性能不佳。最好是使用字符串连接而不是双引号字符串。BAD:$output = “This is a plain string”;GOOD:$output = ‘This is a plain string’;BAD:$type = “mixed”;$output = “This is a $type string”;GOOD:$type = ‘mixed’;$output = ‘This is a ‘ . $type .’ string’;\n25.当echo字符串时用逗号代替点连接符更快些。echo一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。\n例如echo $str1,$str2。\n26.Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。\n28.尽量使用缓存,建议用memcached。高性能的分布式内存对象缓存系统,提高动态网络应用程序性能,减轻数据库的负担;\n也对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。\n29.使用ip2long()和long2ip()函数把IP地址转成整型存放进数据库而非字符型。这几乎能降低1/4的存储空间。同时可以很容易对地址进行排序和快速查找;\n30.使用checkdnsrr()通过域名存在性来确认部分email地址的有效性这个内置函数能保证每一个的域名对应一个IP地址;\n31.使用mysql_的改良函数mysqli_;32.试着喜欢使用三元运算符(?:);33.是否需要PEAR在你想在彻底重做你的项目前,看看PEAR有没有你需要的。PEAR是个巨大的资源库,很多php开发者都知道;\n35.使用error_reporting(0)函数来预防潜在的敏感信息显示给用户。理想的错误报告应该被完全禁用在php.ini文件里。可是如果你在用一个共享的虚拟主机,php.ini你不能修改,那么你最好添加error_reporting(0)函数,放在每个脚本文件的第一行(或用\nrequire_once()来加载)这能有效的保护敏感的SQL查询和路径在出错时不被显示;\n36.使用 gzcompress() 和gzuncompress()对容量大的字符串进行压缩(解压)在存进(取出)数据库时。这种内置的函数使用gzip算法能压缩到90%;\n37.通过参数变量地址得引用来使一个函数有多个返回值。你可以在变量前加个“&amp;”来表示按地址传递而非按值传递;\n38. 完全理解魔术引用和SQL注入的危险。Fully understand “magic quotes” and the dangers of SQL injection. I’m hoping that most developers reading this are already familiar with SQL injection. However, I list it here because it’s absolutely critical to understand. If you’ve never heard the term before, spend the entire rest of the day googling and reading.\n39.某些地方使用isset代替strlen当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。\n(举例如下)if (strlen($foo) &lt; 5) { echo “Foo is too short”$$ }(与下面的技巧做比较)if (!isset($foo{5})) { echo “Foo is too short”$$ }调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。\n40.使用++$i递增When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i. This is something PHP specific and does not apply to other languages, so don’t go modifying your C or Java code thinking it’ll suddenly become faster, it won’t. ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually causes in the creation of a temporary var that is then incremented. While preincrementation increases the original value directly. This is one of the optimization that opcode optimized like Zend’s PHP optimizer. It is a still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer.\n当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。\n40. 不要随便就复制变量有时候为了使 PHP 代码更加整洁,一些 PHP 新手(包括我)会把预定义好的变量复制到一个名字更简短的变量中,其实这样做的结果是增加了一倍的内存消耗,只会使程序更加慢。试想一下,在下面的例子中,如果用户恶意插入 512KB 字节的文字到文本输入框中,这样就会导致 1MB 的内存被消耗!BAD:$description = $_POST[‘description’];echo $description;GOOD:echo $_POST[‘description’];\n41 使用选择分支语句switch case好于使用多个if,else if语句,并且代码更加容易阅读和维护。\n42.在可以用file_get_contents替代file、fopen、feof、fgets在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;\n43.尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;44.优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);45.尽可能的使用PHP内部函数46.循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);\n47.多维数组尽量不要循环嵌套赋值;48.foreach效率更高,尽量用foreach代替while和for循环;49.“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;50. 对global变量,应该用完就unset()掉;51. 并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。52 不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?53 如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。54、打开apache的mod_deflate模块,可以提高网页的浏览速度。(提到过echo 大变量的问题)\n55、数据库连接当使用完毕时应关掉,不要用长连接。56、split比exploade快split()0.001813 - 0.002271 seconds (avg 0.002042 seconds)explode()0.001678 - 0.003626 seconds (avg 0.002652 seconds)Split can take regular expressions as delimiters, and runs faster too. ~23% on average.\n","categories":["PHP"],"tags":["PHP"]},{"title":"Playwright","url":"/2021/03/07/Playwright/","content":"\n转载:微软开源最强Python自动化神器Playwright!不用写一行代码!作者:Python数据科学\n\n相信玩过爬虫的朋友都知道selenium,一个自动化测试的神器工具。写个Python自动化脚本解放双手基本上是常规的操作了,爬虫爬不了的,就用自动化测试凑一凑。\n虽然selenium有完备的文档,但也需要一定的学习成本,对于一个纯小白来讲还是有些门槛的。\n最近,微软开源了一个项目叫「playwright-python」,简直碉堡了!这个项目是针对Python语言的纯自动化工具,连代码都不用写,就能实现自动化功能。\n\n可能你会觉得有点不可思议,但它就是这么厉害。下面我们一起看下这个神器。\n1. Playwright介绍Playwright是一个强大的Python库,仅用一个API即可自动执行 Chromium、Firefox、WebKit等主流浏览器自动化操作,并同时支持以无头模式、有头模式运行。\nPlaywright提供的自动化技术是绿色的、功能强大、可靠且快速,支持Linux、Mac以及Windows操作系统。\n2.Playwright使用安装Playwright的安装非常简单,两步走。\n# 安装playwright库pip install playwright# 安装浏览器驱动文件(安装过程稍微有点慢)python -m playwright install\n上面两个pip操作分别安装:\n\n安装Playwright依赖库,需要Python3.7+\n安装Chromium、Firefox、WebKit等浏览器的驱动文件\n\n录制使用 Playwright 无需写一行代码,我们只需手动操作浏览器,它会录制我们的操作,然后自动生成代码脚本。\n下面就是录制的命令codegen,仅仅一行。\n# 命令行键入 --help 可看到所有选项python -m playwright codegen\ncodegen 的用法可以使用 --help 查看,如果简单使用就是直接在命令后面加上url链接,如果有其他需要可以添加options。\npython -m playwright codegen --helpUsage: index codegen [options] [url]open page and generate code for user actionsOptions: -o, --output &lt;file name&gt; saves the generated script to a file --target &lt;language&gt; language to use, one of javascript, python, python-async, csharp (default: &quot;python&quot;) -h, --help display help for commandExamples: $ codegen $ codegen --target=python $ -b webkit codegen https://example.com\noptions含义:\n-o:将录制的脚本保存到一个文件\n\n–target:规定生成脚本的语言,有JS和Python两种,默认为Python\n\n-b:指定浏览器驱动\n\n比如,我要在 baidu.com 搜索,用chromium驱动,将结果保存为my.py的python文件。\npython -m playwright codegen --target python -o &#39;my.py&#39; -b chromium https://www.baid\n命令行输入后会自动打开浏览器,然后可以看见在浏览器上的一举一动都会被自动翻译成代码,如下所示。结束后自动关闭浏览器,保存生成的自动化脚本到py文件。\nfrom playwright import sync_playwrightdef run(playwright): browser = playwright.chromium.launch(headless=False) context = browser.newContext() # Open new page page = context.newPage() page.goto(&quot;https://www.baidu.com/&quot;) page.click(&quot;input[name=\\&quot;wd\\&quot;]&quot;) page.fill(&quot;input[name=\\&quot;wd\\&quot;]&quot;, &quot;jingdong&quot;) page.click(&quot;text=\\&quot;京东\\&quot;&quot;) # Click //a[normalize-space(.)=&#x27;京东JD.COM官网 多快好省 只为品质生活&#x27;] with page.expect_navigation(): with page.expect_popup() as popup_info: page.click(&quot;//a[normalize-space(.)=&#x27;京东JD.COM官网 多快好省 只为品质生活&#x27;]&quot;) page1 = popup_info.value # --------------------- context.close() browser.close()with sync_playwright() as playwright: run(playwright)\n\n此外,playwright还提供了同步和异步的API接口,文档如下。\n\n链接:https://microsoft.github.io/playwright-python/index.html\n\n同步下面示例代码:依次打开三个浏览器,前往baidu搜索,截图后退出。\nfrom playwright import sync_playwrightwith sync_playwright() as p: for browser_type in [p.chromium, p.firefox, p.webkit]: browser = browser_type.launch() page = browser.newPage() page.goto(&#x27;https://baidu.com/&#x27;) page.screenshot(path=f&#x27;example-&#123;browser_type.name&#125;.png&#x27;) browser.close()\n\n异步异步操作可结合asyncio同时进行三个浏览器操作。\nimport asynciofrom playwright import async_playwrightasync def main(): async with async_playwright() as p: for browser_type in [p.chromium, p.firefox, p.webkit]: browser = await browser_type.launch() page = await browser.newPage() await page.goto(&#x27;http://baidu.com/&#x27;) await page.screenshot(path=f&#x27;example-&#123;browser_type.name&#125;.png&#x27;) await browser.close()asyncio.get_event_loop().run_until_complete(main())\n\n移动端更厉害的是,playwright还可支持移动端的浏览器模拟。下面是官方文档提供的一段代码,模拟在给定地理位置上手机iphone 11 pro上的Safari浏览器,首先导航到maps.google.com,然后执行定位并截图。\nfrom playwright import sync_playwrightwith sync_playwright() as p: iphone_11 = p.devices[&#x27;iPhone 11 Pro&#x27;] browser = p.webkit.launch(headless=False) context = browser.newContext( **iphone_11, locale=&#x27;en-US&#x27;, geolocation=&#123; &#x27;longitude&#x27;: 12.492507, &#x27;latitude&#x27;: 41.889938 &#125;, permissions=[&#x27;geolocation&#x27;] ) page = context.newPage() page.goto(&#x27;https://maps.google.com&#x27;) page.click(&#x27;text=&quot;Your location&quot;&#x27;) page.screenshot(path=&#x27;colosseum-iphone.png&#x27;) browser.close()\n另外,还可以配合pytest插件一起使用,感兴趣可以自己试一下。\n总结playwright相比已有的自动化测试工具有很多优势,比如:\n\n跨浏览器,支持Chromium、Firefox、WebKit\n跨操作系统,支持Linux、Mac、Windows\n可提供录制生成代码功能,解放双手\n可用于移动端\n\n目前存在的缺点就是生态和文档还不是非常完备,比如没有API中文文档、没有较好的教程和示例供学习。不过相信,随着知道的人越来越多,未来会越来越好。\n\nGitHub链接:https://github.com/microsoft/playwright-python开源组织:Microsoft\n\n","categories":["Python"]},{"title":"词云不报错不输出","url":"/2022/08/21/Python/","content":"词云不报错不输出 wordcloud根据老师视频所说安装wordcloud#pip install wordcloud,并没有提示出错,反而是pip有新版本可以升级(忽略升级)之后运行发现不报错也不输出任何文件\n查看库列表以及版本 #pip list\n然后在另一台win7上运行#pip install wordcloud后测试发现能正常运行\n查看安装库版本\n\ncycler-0.10.0、 kiwisolver-1.2.0、 matplot1ib-3.2.1、 numpy-1.18.2、 pillow-7.1.1 、 pyparsing-2.4.7、 python-dateutil-2.8.1、 wordcloud-1.6.0\n\n对比发现kiwisolver-1.2.0,matplot1ib-3.2.1,numpy-1.18.2,pillow-7.1.1 等等版本和我电脑内版本不同于是怀疑是国内安装源不一样,导致下载的版本不同便对比C:\\Users\\用户文件夹\\pip\\pip.ini./pip/pip.ini是自己创建的,目的是重置pip为国内安装源\n这是清华的安装源,把内容复制到pip.ini内便可使用该源\n[global]index-url = https://pypi.tuna.tsinghua.edu.cn/simple[install]trusted-host = https://pypi.tuna.tsinghua.edu.cn\n\n重置之后卸载版本低的库#pip uninstall numpy pillow kiwisover pyparsing matplotlib卸载后安装#pip install numpy==1.18.2 pillow==7.1.1 kiwisover==1.2.0 matplotlib==3.2.1\n然后再试就可以了,推测是库的版本的原因\n","categories":["Python"]},{"title":"Uncaught RedisException: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.","url":"/2022/08/21/Uncaught-RedisException-MISCONF-Redis-is-configured-to-save-RDB-snapshots-but-is-currently-not-able-to-persist-on-disk-Commands-that-may-modify-the-data-set-are-disabled-Please-check-Redis-logs-for-details-about-the-error/","content":"来源:https://www.jianshu.com/p/3aaf21dd34d6\n今天操作Redis的时候出现了MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.这提示及其友好\nRedis问题MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用。请查看Redis日志的详细错误信息。\n原因强制关闭Redis快照导致不能持久化。\n解决方案将stop-writes-on-bgsave-error设置为no\n127.0.0.1:6379&gt;config set stop-writes-on-bgsave-error no#ok\n\n","categories":["Redis"]},{"title":"adb使用指令","url":"/2021/06/21/adb%E4%BD%BF%E7%94%A8%E6%8C%87%E4%BB%A4/","content":"adb使用指令线刷:1.进入f:/adb/platform-tools/,按住shift + 鼠标右键,选择shell\n2.确认设备开启了usb调试,并usb连接了电脑\n3.shell中输入adb devices,等待提示\n* daemon started successfully20080411 device\n4.挂载系统,adb remount 否则不能对文件读写\n5.adb shell,进入手机shell。\n\n如果符号为 $ ,则没有root,输入su获得权限如果符号为 # ,则为root\n\n6.安卓手机shell为linux系统内核,相关操作同Linux\nps:\n\n如果一个目录含有空格如 【./a not run/】则进入该目录要加引号cd &#39;./a not run&#39;或者cd /system/app&#39;/a not run/&#39;\n\n","categories":["adb"],"tags":["adb"]},{"title":"apache 无法读取index.html","url":"/2021/03/07/apache-%E6%97%A0%E6%B3%95%E8%AF%BB%E5%8F%96index-html/","content":"问题在测试一个功能时,建立子站,里面全是静态文件,使用 Apache 链接到该项目目录,访问时,却提示 500 Internal Server Error\n检查 Apache 配置文件,并没有问题,在 URL 链接后加上 index.html 就能正常访问\n解决在 stackoverflow 看到相似的问题.htaccess DirectoryIndex不起作用,其中一位老哥的回答\n\nYou have to check if there is any htaccess rule on parent directory that conflics with this rule, my problem was that, having a RewriteEngine on root directory and “/folder/“ DirectoryIndex won’t work.\n您必须检查在父目录上是否有任何htaccess规则与此规则相冲突,我的问题是,在根目录和“ / folder /” DirectoryIndex上具有RewriteEngine将不起作用。\n\n\n修改父级 .htaccess在 RewriteCond 中添加 子站的目录html添加前:RewriteCond $1 !^(index\\.php|image|robots\\.txt|favicon\\.ico)添加后:RewriteCond $1 !^(index\\.php|image|robots\\.txt|favicon\\.ico|html)\n\n子站根目录下 添加首页访问规则在子站 html 根目录下新建 .htaccess ,输入以下内容DirectoryIndex index.html index.htm\n\n查看 Apache 是否开启重写找到 Apache 软件所在目录\n\n\n\n如果你是单个网站,且没有添加过网站对应的 .conf 文件\n\n编辑 apache/conf/httpd.conf ,修改AllowOverride None 为 AllowOverride All\n\n\n如果有多个网站,且每个网站都有对应的 .conf 文件,如我当前项目的为test,端口为80,则网站配置文件为test_80.conf\n\n编辑 apache/conf/vhosts/test_80.conf ,修改AllowOverride None 为 AllowOverride All,没有则添加\n\n\n\n\n相关资料:\n\n.htaccess DirectoryIndex不起作用 |stackoverflow\nApache Core Features\n\n","categories":["Apache"]},{"title":"apache多版本PHP配置","url":"/2021/03/07/apache%E5%A4%9A%E7%89%88%E6%9C%ACPHP%E9%85%8D%E7%BD%AE/","content":"导言windows 用户见windows - apache 配置多个版本的 php\n因为项目需要,要在 Linux 上使用apache 部署多个 PHP 项目,且 不同项目的要用到不同的 PHP 版本,因此在这里记录下。\n\nLinux:CentOS7\nApache:2.4\nPHP : 5.6 需要安装7.4\n\n步骤服务器使用的是阿里云的,里面已经集成了 Apache &amp; PHP5.6,可以直接使用他们配置的文件,这里只需要安装PHP7即可\n一、安装PHP7.4\n访问php官网下载列表,找到PHP7.4,复制其下载链接。\n阿里默认PHP安装在 /usr/local/ ,进入该目录,并下载PHP7.4到该目录\n\n#下载安装包$ cd /usr/local/$ wget https://www.php.net/distributions/php-7.4.15.tar.gz#解压$ tar -zxvf php-7.4.15.tar.gz#检查当前的环境是否满足要安装软件的依赖关系$ cd php-7.4.15#设置安装目录并编译检查依赖#可用 ./configure --help 查看当前版本的可选项#注意参数中有 多个 php设置路径./configure --prefix=/usr/local/php74 --with-config-file-path=/usr/local/php74 --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype --with-jpeg --with-zlib --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --enable-intl --enable-ftp --enable-gd --with-external-gd --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-soap --with-gettext --disable-fileinfo --enable-opcache --with-sodium --with-webp --enable-fpm\n\n\n注意编译时安装路径的设置上面的参数除了PHP程序的安装路径,还有其配置文件的路径如果路径错误,会导致php无法正常运行,并且难以察觉更多的选项见 ./configure --helpphp编译参数注解(该链接内容仅作参考,以./configure –help为准)\n提示 Package ‘xxxx’, required by ‘virtual:world’, not foundphp 源码安装常见问题汇总Installing Libsodium\n\n当出现下面的界面,则表示安装成功\n#测试编译$ make$ make test#(1)如果检查时出现某些依赖没有安装,则需要单独安装,不然会出现#make: *** No targets specified and no makefile found. Stop#(2)编译成功后出现某某选项无法识别#configure: WARNING: unrecognized options:...#见底部 相关资料#安装make install\n\n\n配置PHP.ini。 在之前编译的源码包中,找到 php.ini-production,复制到/usr/local/php下,并改名为php.inicp php.ini-production /usr/local/php74/php.ini\n\n [cgi]修改配置文件php.ini vim /usr/local/php74/php.ini#修改cgi.fix_pathinfo=0 见 为什么php.ini设置cgi.fix_pathinfo=0\n **[可选项]**设置让PHP错误信息打印在页面上 $ vim /usr/local/php74/php.inidisplay_errors = off 将 Off 改成 On\n\n配置php-fpm#修改php-fpm配置文件:$ cd /usr/local/php74/etc$ cp php-fpm.conf.default php-fpm.conf$ vim php-fpm.conf#去掉 pid = run/php-fpm.pid 前面的分号#开启错误日志,否则无法运行php-fpm#阿里云有配置过日志目录,因此使用 find / -name php-fpm.log 即可找到日志保存目录\n配置www.conf$ cd php-fpm.d$ cp www.conf.default www.conf$ vim www.conf#(1)更改侦听端口为9001(9000 为默认端口)#(2)修改用户和组为当前用户(默认会添加nobody这个用户和用户组)\n\n\n \n\n测试php-fpm是否安装成功 #启动 php74 内的 php-fpm/usr/local/php74/sbin/php-fpm #看是否有报错,没有任何提示,则说明 fpm 安装配置无误\n\n 查看是否启动成功 ps aux|grep php \n\n添加 php-fpm 到系统服务内 #将 fpm 管理程序放入系统 $ cp /usr/local/php-7.4.15/sapi/fpm/init.d.php-fpm /etc/init.d/php74-fpm#添加可执行权限 $ chmod +x /etc/init.d/php74-fpm\n\n 设置开机启动 chkconfig --add /etc/init.d/php74-fpm\n 更多命令 service php74-fpm start #启动service php74-fpm restart #重启service php74-fpm stop #停止\n\nphp-fpm配置文件参数解释见 脚本之家|配置php-fpm参数及配置详解\n\n需要注意的地方\n\n./configure 编译参数时,使用 ./configure --help查看当前版本的编译参数\n编译安装时,设置PHP安装路径有两种方式,见Linux下指定pip install和make install安装路径\n并没有找到一个 fpm 管理多个 php 的办法,因此启动多版本PHP需要多个相应的 fpm\n\n配置apache\n安装mod_fcgid.so,该模块可以支持 apache 运行多版本的 php.\n\n\n请根据apache版本选择对应版本的mod_fcgid.so,这里以apache2.4为例\n\n #下载$cd /usr/local/src$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/mod_fcgid/mod_fcgid-2.3.9.tar.gz#解压安装$ tar -zxvf mod_fcgid-2.3.9.tar.gz$ cd mod_fcgid-2.3.9$ APXS=/usr/local/apache/bin/apxs ./configure.apxs$ make$ make install\n\n\n修改httpd.conf , 安装好该模块后,httpd.conf 会自动添加加载该模块。#备份httpd.conf$ cp /usr/local/apache/httpd.conf /usr/local/apache/httpd.conf.bak#编辑设置 mod_fcgi$ vim /usr/local/apache/conf/httpd.conf#查找是存在mod_fcgid模块/mod_fcgid/#需要其开启,没有则手动添加 LoadModule fcgid_module modules/mod_fcgid.soFcgidMaxProcesses 1000 #php-cgi最大的进程数MaxRequestLen 52428800 #php程序最大文件上传限制50mb 默认为131072(128kb)#读取并运行 php 文件#找到AddType application/x-gzip .gz .tgz#在该行下面添加AddType application/x-httpd-php .php#保存退出:wq! \n\n\napache php fastcgi模式下,默认上传文件大小只有131072字节(128kb),需要在apache的配置文件中修改fastcgi模式下,在php.ini中修改upload_max_filesize等参数无效。\n\n\n配置虚拟机 $ vim /usr/local/apache/conf/httpd.conf #找到 #Include conf/extra/httpd-vhosts.conf,取消注释#保存退出 $ vim /usr/local/apache/conf/extra/httpd-vhost.conf #里面给出了一个虚拟机配置模板按照该模板配置即可\n\n \n 如图,建立了两个虚拟机,并指定了不同的PHP\n 访问一下 \n 再试试另一个 \n成功\n需要注意的地方\n\n需要添加 AddType application/x-httpd-php .php 才能使解析php文件\napache2.4 允许外部访问 参数简化为 Require all granted,之前版本为AllowOverride AllOrder allow,denyAllow from all\n\n\n相关资料:\n\nLinux 安装php7\ncentos6.5 源码安装php7\ncentos7 编译安装 php7.4\nPackage ‘oniguruma’, required by ‘virtual:world’, not found\nlinux安装php遇到的No package ‘sqlite3’ found,解决方法:yum install sqlite-devel\nCentOS 7编译安装PHP 7.4提示No package ‘libzip’ found或者(libzip &gt;= 0.11)\n安装libsodium库解决libsodium not found问题\n编Installing Libsodium and the PHP extension\nmake: *** No targets specified and no makefile found. Stop\nconfigure: error: Package requirements (sqlite3 &gt; 3.7.4) were not met: No package ‘sqlite3’ found\nconfigure: WARNING: unrecognized options: –with-gd\nLinux下指定pip install和make install安装路径\nphpenv - php多版本配置\nLinux 安装多个php版本并配置\nwindows - apache 配置多个版本的 php\nphp的cgi.fix_pathinfo解析\n配置 php-fpm 时出现’/private/etc/php-fpm.conf’: No such file or directory (2)\n为什么php.ini设置cgi.fix_pathinfo=0\nLinux下apache虚拟主机配置多版本php同时运行\n脚本之家|配置php-fpm参数及配置详解\napache 虚拟目录错误:CustomLog takes two or three arguments, a file name, a custom log format string or format name, and an optional “env=” clause\n\n","categories":["Apache"]},{"title":"cannot import name 'imread'","url":"/2022/08/21/cannot-import-name-imread/","content":"在运用wordcloud生成词云时出现如下的错误:\n   from scipy.misc import imread   ImportError: cannot import name &#x27;imread&#x27;\n\n错误的原因一般有两个,\n\n一个原因是“scipy”库的版本过高所导致的,我也不知道为什么会这样。解决版本过高的方法是降低安装的版本。即\npip install scipy&#x3D;&#x3D;1.2.1\n\n如果还是不行(注意辨别报错信息是否与scipy有关)\n\n\n\n另一个原因是两个第三方库的安装位置不一致,导致他们不能互相关联,解决位置不一致的方法是查看安装第三方库的位置,然后重新安装即可\n查看两个库的安装位置即重新安装一次,看两个库的位置是否一致,\npip install scipyRequirement already satisfied: scipy in f:\\python\\python35\\lib\\site-packages (1.3.1)pip install numpyRequirement already satisfied: numpy&gt;&#x3D;1.13.3 in f:\\python\\python35\\lib\\site-packages (from scipy) (1.17.0)pip install pillowRequirement already satisfied: pillow in f:\\python\\python35\\lib\\site-packages (6.1.0)\n\n如果一致(如上),那原因是“scipy”库的版本过高所致。\n\n\n","categories":["Python"]},{"title":"cgi fast-cgi php-fpm区别","url":"/2022/08/21/cgi-fast-cgi-php-fpm%E5%8C%BA%E5%88%AB/","content":"来源:cgi fast-cgi php-fpm区别 - 陈钦 - 博客园\nphp-cli 是php在系统执行的程序,直接执行php文件;\ncgi和fast-cgi的区别\n\ncgi和fast-cgi都是php解析协议,负责解析服务器分发过来的php动态文件;cgi程序就会去解析php.ini文件,初始化执行环境(启动一个进程),执行完请求之后(自动关闭),众所皆知开启进程和关闭进程对系统资源消耗很大\n由于cgi的繁杂重复的操作会消耗过多的系统资源,那么fasst-cgi就是为了解决这不合理的工作而存在的;fast-cgi先是开启一个常驻进程(master),然后当web server分发一个请求过来,就会fork出一个子进程(worker)去处理相对应的操作,这些子进程不会自动关闭,会在进程池里面等待下一个处理。这样就大大的节省 进程的启动和关闭 所消耗的资源;\nphp-fpm是fast-cgi进程管理器上面说的好像cgi和fast-cgi很像个解析器,其实不是的,cgi和fast-cgi仍然只是个协议而已,而上面实现的操作需要php-fpm这样的进程管理器去辅助执行(这是因为Fastcgi是一种协议,表述的时候更多的是从实现的角度出发说明的,就是实现Fastcgi协议的进程管理器基本都是这样运行,是一种抽象和概括性的描述)\n\ncgi,fast-cgi,php-fpm,php-cgi,spawn-fcgi 区别和优缺点 http://www.mike.org.cn/articles/what-is-cgi-fastcgi-php-fpm-spawn-fcgi/\n","categories":["PHP"]},{"title":"curl 错误","url":"/2023/01/12/curl-%E9%94%99%E8%AF%AF/","content":"问题curl_error(): supplied resource is not a valid cURL handle resource使用curl_error($CURL)收集错误时,出现该报错。\n原因:​ 在获取错误信息前,就使用curl_close($CURL)关闭了curl实例。\n​ 导致curl_error()找不到实例而报错。\n​ 将curl_close($CURL)放到curl_error()之后即可\nerror:04091068:rsa routines:int_rsa_verify:bad signature使用curl_error($CURL)收集到该错误,\n原因一:可能是因为composer.json部分依赖和本地php版本不匹配,切换到高版本php即可!起初环境是php7.1.9,切换到php7.4.3就没有报这个错了!\n原因二:见:Laravel_composer遇到问题及解决方案|CSDN\n\n资料:\n\nWarning: curl_error(): 1 is not a valid cURL handle resource错误\nLaravel_composer遇到问题及解决方案|CSDN\n\n","categories":["PHP"],"tags":["PHP"]},{"title":"[err] (10061)错误","url":"/2022/08/21/ere/","content":"windows 连接本地mysql时出现2003-Can’t connect to MySql server on ‘localhost’(10061)错误\n\n摘自 连接本地mysql时出现2003-Cant connect to MySql server on localhost(10061)错误_-CSDN博客\n\n前言这两天打开mysql总是报错,打不开,但是瞎倒腾会又能打开了,上网查大家的解决方案吧,大家的内容有太多了,最后也不知道到底需要怎么做才能解决问题。o(╥﹏╥)o大家放心,问题已经解决了,非常简单,根本没有别人写的那么麻烦,话不多说直接上图。\n第一步Windows+R电脑左下方会出现此窗口,输入services.msc回车,弹出第二个窗口,然后把mysql启动就ok了。\n第二步如果第一步操作,输入services.msc回车,没有找到MySQLWindows+R电脑左下方会出现此窗口,输入cmd回车,输入mysqlld.exe –install回车\n第三步第三步就是重新执行第一步,这样就好了,非常简单吧。其实连接本地mysql会报这种错,都是mysql没启动,如果远程mysql连接不上,报这个错,没准是服务器的mysql没启动。O(∩_∩)O哈哈~我猜测。\n","categories":["MySql"]},{"title":"fastCGI 意外退出","url":"/2021/03/07/fastCGI-%E6%84%8F%E5%A4%96%E9%80%80%E5%87%BA/","content":"问题系 统:Windows server 2008服务器:IIS7php 5.5\n来自anlondon博客\n解决情况一:程序导致的问题查询资料时,iis7自身是集成了php_pdo.dll的,同时查看服务器其他的项目,都运行正常,说明可能是项目本身的原因,加之iis7与fast-cgi是单线程\n于是重启服务器(开关机的那种),访问项目其他页面,发现访问正常,只有首页加载很慢且加载不全,查看页面代码,发现因为客户修改后台数据导致程序中出现了一个死循环;\n修改相应的代码,解决。\n情况二:缺失相关文件在iis服务器除了php_pdo外\n进入服务器,查看资源管理器,右键php-cgi.exe-&gt;所在位置\n来自anlondon博客\n双击php.exe、php-cgi.php,出现下面的提示\n来自anlondon博客\n去下载对应版本的php_xxx.dll即可。\n\n相关资料:\n\nphp_pdo.dll下载并配置|脚本之家\n64位IIS7下的PHP 5.4配置及如何连接SQL Server 2008\n“php-cgi.exe - FastCGI 进程意外退出” 的解决办法 |CSDN ltylove2007\nphp pdo drivers won’t load on Windows Server 2008 using IIS Fast-CGI\nGetting Microsoft PHP PDO for SQL Server working |stackOverflow\n\n","categories":["PHP"]},{"title":"[Err] (1146)Table 'performance_schema.session_status' doesn't exist","url":"/2022/08/21/fdasfd/","content":"来源: Mysql出现Table ‘performance_schema.session_status’ doesn’t exist - 芳缘的个人空间 - OSCHINA\n在查询mysql的B+树大节点存储数据量大小时,出现\n[Err] 1146 - Table &#x27;performance_schema.session_status&#x27; doesn&#x27;t exist\n\n解决办法\nmysql -u &#123;user&#125; -pmysql&gt; set @@global.show_compatibility_56=ON;\n\n","categories":["MySql"]},{"title":"'str' object has no attribute 'dtype'","url":"/2022/08/21/gg/","content":"在使用词云时,突然报这个错&#39;str&#39; object has no attribute &#39;dtype&#39;原因则是直接引用了图片文件,而没有通过imread()函数\nimage_mask = &#x27;alice_mask.png&#x27;w=wordcloud.WordCloud(mask=image_mask)\n\n正确写法为\nimage_mask = imread(&#x27;alice_mask.png&#x27;)w=wordcloud.WordCloud(mask=image_mask)\n\n","categories":["Python"]},{"title":"git-不同版本pull时报错","url":"/2021/03/07/git-%E4%B8%8D%E5%90%8C%E7%89%88%E6%9C%ACpull%E6%97%B6%E6%8A%A5%E9%94%99/","content":"前提我在家里弄ci-demo,修改了之后上传到coding,回到公司后,想覆盖公司电脑文件细节不一样的版本\npull时报错fatal: refusing to merge unrelated histories\nhttp://anlondon.cn:4000/2021/01/27/git-%E4%B8%8D%E5%90%8C%E7%89%88%E6%9C%ACpull%E6%97%B6%E6%8A%A5/pasted-1.png\n通过博客的讲解,使用git pull origin master --allow-unrelated-historieshttp://anlondon.cn:4000/2021/01/27/git-%E4%B8%8D%E5%90%8C%E7%89%88%E6%9C%ACpull%E6%97%B6%E6%8A%A5/pasted-2.png\nhttp://anlondon.cn:4000/2021/01/27/git-%E4%B8%8D%E5%90%8C%E7%89%88%E6%9C%ACpull%E6%97%B6%E6%8A%A5/pasted-3.png\n最后 手动编辑 保留想要的版本即可\nhttp://anlondon.cn:4000/2021/01/27/git-%E4%B8%8D%E5%90%8C%E7%89%88%E6%9C%ACpull%E6%97%B6%E6%8A%A5/pasted-4.png\nhttp://anlondon.cn:4000/2021/01/27/git-%E4%B8%8D%E5%90%8C%E7%89%88%E6%9C%ACpull%E6%97%B6%E6%8A%A5/pasted-5.png\n","categories":["Git"]},{"title":"git 同时推送到多个远程仓库","url":"/2021/08/16/git-%E5%90%8C%E6%97%B6%E6%8E%A8%E9%80%81%E5%88%B0%E5%A4%9A%E4%B8%AA%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93/","content":"\ngit默认远程仓库名为origin\n\ngit remote add oginin xxxx.gitgit remote set-url --add oginin yyyy.git\n\n之后push时,就会自动推送到设置的两个远程仓库上\n–参考资料:\n\ngit 本地仓库同时推送到多个远程仓库\n\n","categories":["Git"],"tags":["Git"]},{"title":"git 远程与本地不一致导致的报错","url":"/2021/05/12/git-%E8%BF%9C%E7%A8%8B%E4%B8%8E%E6%9C%AC%E5%9C%B0%E4%B8%8D%E4%B8%80%E8%87%B4%E5%AF%BC%E8%87%B4%E7%9A%84%E6%8A%A5%E9%94%99/","content":"\n报错信息:error:failed to push some refs to …Dealing with “non-fast-forward” errorsFrom time to time you may encounter this error while pushing:$ git push origin masterTo ../remote/\n! [rejected] master -&gt; master (non-fast forward)\nerror: failed to push some refs to ‘../remote/‘To prevent you from losing history, non-fast-forward updates were rejectedMerge the remote changes before pushing again. See the ‘non-fast forward’section of ‘git push –help’ for details.\n\n原因是因为远程与本地不一致导致的解决步骤:\n\n需要先拉取远程的\n再手动合并冲突文件\n提交修改\n提交到远程\n\n$git pull origin$git merge origin master &#x2F;&#x2F;可能提示需要手动合并的文件,根据路径修改保留需要的内容即可$git add .$git commit -m &#39;dev| merge error file&#39;$git push origin\n\n\n参考资料:\n\ngit 不一致 本地和服务器_git 本地与远程仓库不一致\n\n","categories":["Git"]},{"title":"git账号密码分级与保存机制","url":"/2021/08/13/git%E4%BF%9D%E5%AD%98%E8%B4%A6%E5%8F%B7%E5%AF%86%E7%A0%81/","content":"配置分级git的配置分为三级别优先级是 Local &gt; Global &gt; System。\n\nSystem 即系统级别 (git无全局配置和单仓库配置时,用户名为系统用户名)\nGlobal 为配置的全局 (git无单仓库配置时,全局配置生效)\nLocal 为仓库级别 (设置过单仓库配置时,优先使用单仓库配置)\n\n查看已配置的信息git config --global -lgit config --local -l\n全局配置git config --global user.name &quot;anlondon&quot;git config --global user.email &quot;anlondon@foxmail.com&quot;git config --global user.password &quot;xxxx&quot;\n单仓库配置git config --local user.name &quot;anlondon&quot;git config --local user.email &quot;anlondon@foxmail.com&quot;git config --local user.password &quot;xxxx&quot;\n密码保存机制git默认不保存输入的账号和密码,每次提交拉取都会要求输入账号密码\n缓存账号与密码,默认15分钟git config --global credential.helper cache\n修改缓存时间为1小时git config credential.helper cache -timeout=3600\n永久保存账号密码git config --global credential.helper store\n–参考资料\n\ngit永久保存账号密码,免去git重复输入账号密码操作\n解决git 输入github时每次都要输入用户名和密码问题\nGit 多用户配置\n\n","categories":["Git"],"tags":["Git"]},{"title":"go 指针","url":"/2021/11/25/go-%E6%8C%87%E9%92%88/","content":"前言最近在学习 go 语言,了解到指针,初看有些迷糊,自己仔细梳理了下,算是明白了,在此记录下。\n说明go 语言的指针借鉴了 c,所以很多地方都有共同的地方\n一、内存结构程序内所有的赋值取值,都是在内存中进行写入、读取操作。\n而写入数据时,内存要保存数据的值、数据的类型、数据的名称以及数据的地址;\n\n内存的基本单位\n\n多个单位组成的内存 图像表示\n\n\n二、指针运算符首先看看指针运算所用到的符号\n\n&amp;【取地址】,取地址运算符;获取变量在内存中的地址\n*【取值】,间接运算符/取消引用运算符;获取某个内存地址保存的值\n\n功能介绍//eg 1:var number int = 10fmt.Println(&quot;number内存地址为:&quot;, &amp;number) //number内存地址为:0xc0000160a8fmt.Println(&quot;number在内存的值为:&quot;, *(&amp;number)) //number在内存的值为:10\n\n上面案例就是一个简单明了的运算符使用\n\n&amp;:可以获取变量在内存中的地址\n*:可以根据内存地址,取到该地址保存的值。因此也被称为指针。\n\n使用程序中一般用于将内存地址赋值给其他变量\n//eg 2:var number int= 5var p *int= &amp;number //*int:整形指针类型;用于接收整形变量在内存中的地址fmt.Println(&quot;p在内存的值为:&quot;, p) //p在内存的值为:0xc0000160a8\n\n\ngo 语言中*int表示获取int类型变量在内存中的地址,也还有*string、*float32等等。指针类型变量只能保存同一类型变量的地址\n\n当然,在实际使用中,* 往往与 &amp; 配合使用\n//eg 3:var number int= 5var p *int= &amp;number //*int:指针类型;*p = 100 //将[p指向的地址]的值改为100 即*p=100 =&gt;*(&amp;number)=100 =&gt; number=100fmt.Println(&quot;p在内存的值为:&quot;, p) //p在内存的值为:0xc0000160a8fmt.Println(&quot;*p在内存的值为:&quot;, *p) //*p在内存的值为:100fmt.Println(&quot;number在内存的值为:&quot;, number) //number在内存的值为:100fmt.Println(&quot;number在内存的值为:&quot;, *(&amp;number)) //number在内存的值为:100\n\n\n解析:\nvar p *int= &amp;number,保存的是number在内存中的地址\n*p = 100 则相当于 *(&amp;number)=100;等同于 number=100\n因此*也被称为指针运算符;***不仅可以根据内存地址找到对应的值,还可以对该地址保存的值进行修改**\n\n实际使用上面代码仅作原理展示。实际使用中往往用于不同方法间传递一个不受方法作用域限制的值\n//eg 4:package mainimport &quot;fmt&quot;func changeValue(p int) &#123;\tp = 10&#125;func swap(p *int) &#123;\t*p = 10&#125;func main() &#123;\tvar a int = 1\tchangeValue(a)\tfmt.Println(&quot;a = &quot;, a) // a = 1\tswap(&amp;a)\tfmt.Println(&quot;a = &quot;, a) // a = 10&#125;\n\n扩展*int、*string、*float32…等等这些被称为一级指针类型变量**int、**string、**float32…等等被称为二级指针指针类型可以有多级\n//eg 5package mainimport &quot;fmt&quot;func main() &#123;\tvar number int = 5\tvar p *int = &amp;number //*int:一级指针类型\tvar pp **int = &amp;p //*int:二级指针类型;\tvar ppp ***int = &amp;pp //*int:三级指针类型;\t*p = 100 //将[p指向的地址]的值改为100 即*p=100 =&gt;*(&amp;number)=100 =&gt; number=100\tfmt.Println(&quot;number在内存的值为:&quot;, number) //number在内存的值为: 100\tfmt.Println(&quot;number在内存的地址为:&quot;, &amp;number) //number在内存的地址为: 0xc0000160a8\tfmt.Println(&quot;p在内存的值为:&quot;, p) //p在内存的值为: 0xc0000160a8\tfmt.Println(&quot;*p在内存的值为:&quot;, *p) //*p在内存的值为: 100\tfmt.Println(&quot;p在内存的地址为:&quot;, &amp;p) //p在内存的地址为: 0xc000006028\tfmt.Println(&quot;pp在内存的值为:&quot;, pp) //pp在内存的值为: 0xc000006028\tfmt.Println(&quot;pp在内存的地址为:&quot;, &amp;pp) //pp在内存的地址为: 0xc000006030\tfmt.Println(&quot;ppp在内存的值为:&quot;, ppp) //ppp在内存的值为: 0xc000006030\tfmt.Println(&quot;*ppp在内存的值为:&quot;, *ppp) //*ppp在内存的值为: 0xc000006028\tfmt.Println(&quot;**ppp在内存的值为:&quot;, **ppp) //**ppp在内存的值为: 0xc0000160a8\tfmt.Println(&quot;***ppp在内存的值为:&quot;, ***ppp) //***ppp在内存的值为: 100\t***ppp = 200\tfmt.Println(&quot;number在内存的值为:&quot;, number) //number在内存的值为: 200 即***pppp=200 =&gt;*&amp;*&amp;*&amp;number=100 =&gt; number=200&#125;\n\n\n\n参考资料:\nC 语言的指针,看完这个动画,你就全明白了|bilibili\n10-GoLang 中指针速通\n\n","categories":["GoLang"],"tags":["Go"]},{"title":"Hello World","url":"/2021/03/06/hello-world/","content":"Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.\nQuick StartCreate a new post$ hexo new &quot;My New Post&quot;\n\nMore info: Writing\nRun server$ hexo server\n\nMore info: Server\nGenerate static files$ hexo generate\n\nMore info: Generating\nDeploy to remote sites$ hexo deploy\n\nMore info: Deployment\n"},{"title":"hexo-admin@2.3.0汉化与优化","url":"/2021/03/07/hexo-admin-2-3-0%E6%B1%89%E5%8C%96%E4%B8%8E%E4%BC%98%E5%8C%96/","content":"参考hexo-admin汉化补丁\n与原版的区别\n进行了汉化\n让图片管理更方便,每篇文章都有对应的图片文件夹。\n添加了自动保存和部署的功能\n\n问题\n过于频繁的自动提交,每次键入停顿时间超过一秒,就会自动上传罪最新的文本,并自动更新静态文件;文本过大时,这会影响到使用,也会加重服务器的负担。\n\n","categories":["Hexo"]},{"title":"hexo-admin后台更新静态文件","url":"/2021/03/07/hexo-admin%E5%90%8E%E5%8F%B0%E6%9B%B4%E6%96%B0%E9%9D%99%E6%80%81%E6%96%87%E4%BB%B6/","content":"建立.sh文件因为我服务器为linux,所以这里就以linux下作为演示\n# 1.你的博客根目录下,新建一个存放shell脚本的目录$ mkdir ./script$ vim ./script/hexo-g.sh# 2.按 i 进入编辑# 输入 #!/bin/bash &lt;-表示执行下面命令的程序hexo clean &amp;&amp; hexo g# 3.ESC退出编辑模式,输入 :wq 保存退出# 输出文件内容$ cat ./script/hexo-g.sh#!/bin/bashhexo clean &amp;&amp; hexo g# 4.给文件执行权限$ chmod +x ./script/hexo-g.sh\n\n在_config.yml添加执行command$ vim _config.yml# 输入以下内容 admin: username: xxxxx password_hash: XXXXXXXX secret: XXXXXX deployCommand: &#x27;./script/hexo-g.sh&#x27;\n\n使用写完博客,点击即可\n来自anlondon博客\n因为我不需要推送到git,所以没配置git和hexo d,如有需要可以自行配置\n可能的错误页面报错:\n来自anlondon博客\n命令行报错:\nres Error: spawn ./script/hexo-g.sh EACCE at Process.ChildProcess._handle.onexit (internal/child_process.js:269:19) at onErrorNT (internal/child_process.js:465:16) at processTicksAndRejections (internal/process/task_queues.js:80:21) &#123; errno: -13, code: &#x27;EACCES&#x27;, syscall: &#x27;spawn ./script/hexo-g.sh&#x27;, path: &#x27;./script/hexo-g.sh&#x27;, spawnargs: [ &#x27;&#x27; ]&#125; &#123; stdout: &#x27;&#x27;, stderr: &#x27;&#x27; &#125;\n\n原因:是因为我linux没有安装expect,而spawn是expect的功能之一,yum install expect即可解决\n更多hexo-admin的问答见hexo-admin 开发者问答\n","categories":["Hexo"]},{"title":"hexo 给文章中英文添加空格","url":"/2021/03/07/hexo-%E7%BB%99%E6%96%87%E7%AB%A0%E4%B8%AD%E8%8B%B1%E6%96%87%E6%B7%BB%E5%8A%A0%E7%A9%BA%E6%A0%BC/","content":"来源: 振伟普拉斯 | Hexo 给文章中英文添加空格 \n\n在使用Hexo写文章时,由于写的大都是些技术类的文章,中英文字符经常交错在一起,对于强迫症的我来说看起来着实不舒服了。\n好在 GitHub 上什么大神都有,还真有人开发了给中英文添加空格的工具:https://github.com/vinta/pangu.js\n\n   為什麼你們就是不能加個空格呢?   如果你跟我一樣,每次看到網頁上的中文字和英文、數字、符號擠在一塊,就會坐立難安,忍不住想在它們之間加個空格。這個外掛(支援 Chrome 和 Firefox)正是你在網路世界走跳所需要的東西,它會自動替你在網頁中所有的中文字和半形的英文、數字、符號之間插入空白。\n   漢學家稱這個空白字元為「盤古之白」,因為它劈開了全形字和半形字之間的混沌。另有研究顯示,打字的時候不喜歡在中文和英文之間加空格的人,感情路都走得很辛苦,有七成的比例會在 34 歲的時候跟自己不愛的人結婚,而其餘三成的人最後只能把遺產留給自己的貓。畢竟愛情跟書寫都需要適時地留白。\n\n在 Hexo 中使用也很简单,npm 安装一下就可以了:npm install hexo-pangu-spacing --save\n然后重新 hexo g 看修改后的效果。\n20191201,纠正上面这个插件有些问题,在代码中也会加入空格,代码中应该是不需要的。\n又找到另一个插件,试了下没问题:https://github.com/hexojs/hexo-filter-auto-spacing\n其他问题(anlondon)\nhexo-pangu-spacing会导致 **加粗** 失效\nhexo-filter-auto-spacing会导致脚注插件不能正常运行\n\n相关文章\n\nHexo NexT 主题添加自定义字体(基于 7.1.0 版本)\nHexo 使用 hexo-neat 插件压缩页面资源\nHexo NexT 主题集成 utterance 评论系统\nHexo Next 主题自定义样式\n\n","categories":["Hexo"]},{"title":"html span的幽灵空白节点","url":"/2022/08/21/html-span%E7%9A%84%E5%B9%BD%E7%81%B5%E7%A9%BA%E7%99%BD%E8%8A%82%E7%82%B9/","content":"做一个项目的时候遇到一个特别奇怪的事情,span明明设置css,没有padding和margin,但是在所有的浏览器中都能看到下面这个空白的占位,并且jq和css并不能控制。\n\n通过查询,是因为在代码中 设置了显示模式为inline-block的span间有空格导致的,去除空格即可\n\n源代码\n&lt;div class=&quot;items&quot;&gt; &lt;span class=&quot;id&quot;&gt;1000&lt;/span&gt; &lt;span class=&quot;name&quot;&gt;Name 1000&lt;/span&gt; &lt;span class=&quot;gender&quot;&gt;女&lt;/span&gt; &lt;span class=&quot;address&quot;&gt;中国&lt;/span&gt; &lt;span class=&quot;edu&quot;&gt;未接受教育&lt;/span&gt; &lt;span class=&quot;age&quot;&gt;57&lt;/span&gt; &lt;span class=&quot;phone&quot;&gt;17778917175&lt;/span&gt; &lt;span class=&quot;qq&quot;&gt;886174462&lt;/span&gt; &lt;span class=&quot;email&quot;&gt;886174462@qq.com&lt;/span&gt;&lt;/div&gt;\n\n修改后\n&lt;div class=&quot;items&quot;&gt; &lt;span class=&quot;id&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;name&quot;&gt;Name 1000&lt;/span&gt;&lt;span class=&quot;gender&quot;&gt;女&lt;/span&gt;&lt;span class=&quot;address&quot;&gt;中国&lt;/span&gt;&lt;span class=&quot;edu&quot;&gt;未接受教育&lt;/span&gt;&lt;span class=&quot;age&quot;&gt;57&lt;/span&gt;&lt;span class=&quot;phone&quot;&gt;17778917175&lt;/span&gt;&lt;span class=&quot;qq&quot;&gt;886174462&lt;/span&gt;&lt;span class=&quot;email&quot;&gt;886174462@qq.com&lt;/span&gt;&lt;/div&gt;\n\n参考资料[关于幽灵空白节点检测时:div内span标签为什么要设置一个inline-block的解释\n","categories":["HTML"],"tags":["HTML"]},{"title":"httpd AH00072","url":"/2022/08/21/httpd-AH00072/","content":"最近在测试swoole的时候要用到9500端口,于是在httpd.conf中添加了listen 9500和网站配置重启#systemlctl restart httpd结果报错\n#netstat -anp|grep 9500看下是否有占用如果有可以用#kill -9 pid\n结果依旧\n提示端口9500被占用,但是#netstat -apn|grep 9500却没有任何显示于是想起swoole只能php-cli下运行,猜测该端口不能在httpd下使用\n\n没看到详细的报错,于是在httpd.conf中查找error_log的位置\n\n\n再#locate logs/error_log确定httpd的error_log位置,打开后看到报错信息\n搜索 AH00170: caught SIGWINCH, shutting down gracefully得知是因为某个端口被防火墙拦下造成的\n#/sbin/iptables -I INPUT -p tcp --dport 端口 -j ACCEPT即可\n","categories":["linux"]},{"title":"httpd 服务器配置","url":"/2022/08/21/httpd-%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE/","content":"httpd配置文件:httpd.conf可通过#locate httpd.conf查找\n使用#vim /FilePath/httpd.conf打开文件\n找到Listten ,这是端口监听,只有设置过的端口才能使用,如Listen 80\\8080这样就能访问80/8080端口\n找到单行ServerName xxxxxx,设置域名,这里可以忽略\n\n&lt;VirtualHost ip&gt;可让他人通过ip访问你的网站\n&lt;VirtualHost 127.0.0.1&gt;本地输入网址访问网站\n同时ServerName不同,对应的访问文件路径也不同 及同ip,同端口不同网站\n\n同IP同端口多网站:\n\n&lt;VirtualHost 192.168.0.101:80&gt;#网站目录DocumentRoot &quot;/var/www/website/basic/web&quot;#域名ServerName www.my-mooc.net&lt;/VirtualHost&gt;&lt;VirtualHost 192.168.0.101:80&gt;#网站目录DocumentRoot &gt;&quot;/var/www/website/jiudiantouzi.zhongguo/public&quot; #域名 ServerName www.jiudiantouzi.linux&lt;/VirtualHost&gt;\n\n服务器本地域名(转127.0.0.1)访问 【没啥用】\n\n#可通过ip、网站名访问&lt;VirtualHost 192.168.0.101:80&gt; #网站目录 DocumentRoot &quot;/var/www/website/basic/web&quot; #域名 ServerName www.my-mooc.net&lt;/VirtualHost&gt;#本地访问&lt;VirtualHost 127.0.0.1:80&gt; #网站目录 DocumentRoot &quot;/var/www/website/basic/web&quot; #域名 ServerName www.my-mooc.net &lt;/VirtualHost&gt;\n\n","categories":["linux"]},{"title":"windows2008 R2忘记密码","url":"/2021/03/19/indows2008-R2%E5%BF%98%E8%AE%B0%E5%AF%86%E7%A0%81/","content":"问题服务器:Windows2008 R2远程时一直提示密码错误,于是手动修改远程密码\n解决阿里等第三方虚拟主机\n登录云服务器管理控制台。\n单击左侧导航栏中的实例,在实例列表找到您需要远程登录的目标实例,单击远程连接,在弹出的页面中选择发送远程命令(云助手)的方式。 \n输入重置密码命令,然后单击执行按钮 net user administrator 123456@p 上述命令为重置adminitrator用户密码为123456@p\n之后即可使用重置的账号和密码进行远程连接\n\n本地\nwin+X唤出命令行窗口\nnet user administrator 123456@p 重置密码\n\n\n参考资料:\n\n阿里解答|重置Windows服务器的远程连接密码\n百度经验|Server2008R2系统忘记密码时进行密码重置\n\n"},{"title":"javascript中var,let,const的区别用法","url":"/2021/04/05/javascript%E4%B8%ADvar-let-const%E7%9A%84%E5%8C%BA%E5%88%AB%E7%94%A8%E6%B3%95/","content":"来源:javascript中var,let,const的区别用法 - 简书\n\nvarvar相比let就是管的比较宽,他的值可以被内部修改。\n\nfunction tests()&#123; var n &#x3D; 1; if (true) &#123; var n &#x3D; 2; &#125; console.log(n); &#x2F;&#x2F;值被函数内部修改,输出2&#125;tests();if(1)&#123; var a &#x3D; 100;&#125;console.log( a );&#x2F;&#x2F;输出100,因为var没有块级作用域,这里a会成为全局变量\n\n\nletlet是es6中新增定义,带有块级作用域,只会在所定义块生效。\n\nfunction test()&#123; let n &#x3D; 1; if (true) &#123; let n &#x3D; 2; &#125; console.log(n); &#x2F;&#x2F;值不会被修改,输出1&#125;test();if(1)&#123; let b &#x3D; 100;&#125;console.log( b );&#x2F;&#x2F;错误 ReferenceError: b is not defined&#x2F;&#x2F;因为let的块级作用域,所以b变量只存在与if内部\n\n\nconstconst用来定义常量(可以是字符串,数组,函数,对象等),并且初始值不可为空,但他并不是不可更改的。举个栗子:\nconst c;&#x2F;&#x2F;会产生报错.const d &#x3D; 1;&#x2F;&#x2F;正确const arr &#x3D; [1, 2];arr.push(1);&#x2F;&#x2F;正确 [1, 2, 1]arr[0] &#x3D; 3;&#x2F;&#x2F;正确 [3, 2, 1]arr &#x3D; [];&#x2F;&#x2F;错误TypeError: invalid assignment to const &#96;arr&#39;\n可见,如果有需要,可以改变const里所存储的值,但它的指向空间是无法操作的。\n\n有趣的面试例子面试的时候很经常遇到一个例子:\nfor (var i &#x3D; 0; i &lt; 5; i++) &#123; setTimeout(function() &#123; console.log(i); &#125;, 1000);&#125;&#x2F;&#x2F;这个例子执行完输出什么结果?&#x2F;&#x2F;答案是 5,5,5,5,5&#x2F;&#x2F;如果想要输出0,1,2,3,4改怎么实现?&#x2F;&#x2F;其中一种方案就是把var换成let就可以了。let的块级作用域在这里就体现出来了。for (let i &#x3D; 0; i &lt; 5; i++) &#123; setTimeout(function() &#123; console.log(i); &#125;, 1000);&#125;\n\n","categories":["npm"]},{"title":"md引用base64图片","url":"/2021/03/07/md%E5%BC%95%E7%94%A8base64%E5%9B%BE%E7%89%87/","content":"markdown 引用base64图片使用\n声明[image_name]:data:image/png;base64,..\n调用![图片描述][image_name]\n注意:图片越大,base64代码越多,加载也就会越久前端规范中,一般在2k及以下的图片才能使用 Base64\n\n\n\n图片转 Base64 的网站站长工具\n注意!hexo-admin 测试 Base64 时,会出现加载很慢的情况,是因为 hexo-admin 会一次加载全部的文章数据,而过多的 Base64 会导致数据包过大影响页面加载速度。\n","categories":["MarkDown"]},{"title":"mysqldump ERROR 1064 (42000): You have an error in your SQL syntax","url":"/2021/03/07/mysqldump-ERROR-1064-42000-You-have-an-error-in-your-SQL-syntax/","content":"\n来源mysqldump备份数据库提示ERROR 1064 (42000): You have an error in your SQL syntax作者:sunsineq\n\nERROR 1064 (42000): You have an error in your SQL syntax; check the manual thatcorresponds to your MySQL server version for the right syntax to use near &#x27;mysql -v&#x27; at line 1\n在dos下备份数据库的时候提示上面的错误信息\n通过查资料知道,不需要登录mysql,只需要在命令行下切换到mysql\\bin目录,使用备份命令mysqldump即可\nd:\\phpStudy\\MySQL\\bin&gt;mysqldump -uroot -proot testphp &gt;d:\\testphp.sql d:\\phpStudy\\MySQL\\bin&gt;\n\n【anlondon:】还有一种情况是,备份时用的powershell,还原时用的cmd,也会出现这种情况情况,原因好像是因为两者的输出编码不同导致的,这时统一命令行软件即可\n","categories":["MySql"]},{"title":"mysqldump备份数据库 Couldn't execute 'SHOW VARIABLES LIKE 'gtid\\_mode''","url":"/2021/03/07/mysqldump%E5%A4%87%E4%BB%BD%E6%95%B0%E6%8D%AE%E5%BA%93-Couldn-t-execute-SHOW-VARIABLES-LIKE-gtid-mode/","content":"错误mysqldump: Couldn’t execute ‘SHOW VARIABLES LIKE ‘gtid_mode’’: Table ‘performance_schema.session_variables’ doesn’t exist (1146)\n原因这是mysql升级的结果;因为我本地切换过MySQL版本而导致的错误\n解决\nwin#更新$ mysql_upgrade -u root -p --force#需要停止进程$ net stop mysql#再次开启$ net start mysql\nlinux$ mysql_upgrade -u root -p --force$ systemctl restart mysqld\n\n\n相关资料:\n\nmysqldump备份数据库出现(Couldn’t execute ‘SHOW VARIABLES LIKE ‘gtid_mode’’)错误解决办法\nmysqldump: Couldn’t execute ‘SHOW VARIABLES LIKE ‘gtid_mode’’: Table ‘performance_schema.session_v\n\n","categories":["MySql"]},{"title":"mysql出现“Incorrect key file for table”解决办法","url":"/2021/08/10/mysql%E5%87%BA%E7%8E%B0%E2%80%9CIncorrect-key-file-for-table%E2%80%9D%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/","content":"出现问题\nSQLSTATE[HY000]: General error: 126 Incorrect key file for table ‘.\\voice\\admin_user.MYI’; try to repair it\n\n引擎是:MyISAM数据库:mysql5.7.26\n运行下面的命令修复即可 repair table tables_name;\n mysql&gt; repair table admin_user;+-------------------------------+--------+----------+----------+| Table | Op | Msg_type | Msg_text |+-------------------------------+--------+----------+----------+| .admin_user | repair | status | OK |+-------------------------------+--------+----------+----------+1 row in set (0.02 sec)\n\n\n参考资料:\n\nmysql出现“Incorrect key file for table”解决办法\n\n","categories":["MySql"],"tags":["MySql"]},{"title":"nginx多版本PHP配置","url":"/2021/03/07/nginx%E5%A4%9A%E7%89%88%E6%9C%ACPHP%E9%85%8D%E7%BD%AE/","content":"参考NGINX配置手册 Nginx中文文档|虚拟主机\n有讲解到 UNIX Domain Socket 和 tcp 的区别nginx: fastcgi_pass的配置\n视频讲解:【体验课】NGINX快速学习指南\nnginx多版本PHP配置一位客户服务器配置为\n\nCentOS7\nPHP 7.4\nmysql 5.7\nNGINX 1.15.11\n\n但是因为项目只能使用PHP5.x,因此需要修改相应的服务器配置\n安装 nginxnginx 官网\n\n安装依赖包:# yum -y install pcre pcre-devel openssl openssl-devel gcc gcc-c++ autoconf automake zlib-devel libxml2 libxml2-dev libxslt-devel gd-devel perl-devel perl-ExtUtils-Embed GeoIP GeoIP-devel GeoIP-data make GeoIP-devel GeoIP-update\n\n下载nginx1.15\n$ cd /usr/local/src/$ curl -o nginx-1.15.1.tar.gz http://nginx.org/download/nginx-1.15.1.tar.gz\n创建用户和组\n# groupadd nginx# useradd nginx -g nginx -s /sbin/nologin -M\n解压,配置,编译,安装官网对参数的说明Building nginx from Sources\n$ tar -zxvf nginx-1.15.1.tar.gz$ cd nginx-1.15.1#测试一下$ ./configure#如果没报错则开始设置#设置$ ./configure --prefix=/usr/local/nginx --user=nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_geoip_module --with-http_stub_status_module --with-http_sub_module --with-stream --with-stream=dynamic #编译安装$ make &amp;&amp; make install\n\n\n安装出现的一些错误以及解决办法\n\nLinux Nginx安装以及可能出现错误\nError: xz compression not available的解决办法\n如果不指定 nginx.pid 路径,则运行时可能报错\n\n\n./nginx 启动,重启 nginx 时遇到错误会直接停止 nginx,并删除pid文件,此时解决报错,并启动 nginx 即可。\n解决Nginx: error open() "/usr/local/Nginx/logs/Nginx.pid” failed(2:No such file or directory)\n\n\n\n添加为系统服务,新建一个服务$ vim /usr/lib/systemd/system/nginx.service\n\n复制下面的内容,路径改为自己设置的路径\n[Unit]Description=nginxAfter=network.target[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStartPre=/usr/local/nginx/sbin/nginx -t -q -g &#x27;daemon on; master_process on;&#x27;ExecStart=/usr/local/nginx/sbin/nginx -g &#x27;daemon on; master_process on;&#x27;ExecReload=/usr/local/nginx/sbin/nginx -g &#x27;daemon on; master_process on;&#x27; -s reloadExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /usr/local/nginx/logs/nginx.pidTimeoutStopSec=5KillMode=mixed[Install]WantedBy=multi-user.target\n\n#设置nginx.service文件的权限$ chmod 664 /usr/lib/systemd/system/nginx.service#验证服务$ curl -I 127.0.0.1:80\n\n\nnginx命令行参数:#nginx 原生参数\t-V 查看编译参数。\t-h 查看帮助。\t-g 设置全局配置指令。\t-s 发送信号 信号:\t\t stop 快速关闭\t\t quit 正常关闭,等待工作进程完成当前请求后停止nginx进程\t\t reload 重新加载配置文件\t\t reopen 重新打开日志文件.#使用 ./nginx -s stop/quit/reload/reopen#系统服务指令$ systemctl status nginx.service$ systemctl start nginx.service$ systemctl restart nginx.service$ systemctl stop nginx.service#开启服务启动时执行$ systemctl enable nginx.service\n\n配置 nginx 虚拟机使用指定版本PHP# vim /usr/local/nginx/nginx.conf\nserver&#123;\tlisten 80; server_name localhost; root /usr/local/nginx/html/guoxinan/; location / &#123;\t\tindex index.php index.html; autoindex off; &#125; \tlocation ~ \\.php$ &#123; \t#监听指定php版本的 cgi 端口\t\tfastcgi_pass 127.0.0.1:9074; fastcgi_param SCRIPT FILENAME $document_root$fastcgi_script_name; include fastcgi_params;\t&#125;&#125;\n\n在 http&#123;&#125; 中,一个 server&#123;&#125; 表示一个虚拟机,而虚拟机使用 指定版本 PHP 也只需要设置\nlocation ~ \\.php$ &#123; \t#监听指定php版本的 cgi 端口\tfastcgi_pass 127.0.0.1:9074; fastcgi_param SCRIPT FILENAME $document_root$fastcgi_script_name; include fastcgi_params;&#125;\n\n伪静态nginx常用伪静态设置Nginx针对URL或目录访问控制总结\nnginx多版本PHP配置\n引用项目根目录下的 nginx.htaccess 文件include /xx/WWW/xxx/nginx.htaccess;\n伪静态规则允许某些目录下的文件访问\nif ($request_filename !~* /(index\\.php|htsysadmin|HTSYSADMIN|Bak2010|robots\\.txt|favicon\\.ico|sitemap\\.xml|sitemap\\.html|skin|upload)) &#123; rewrite ^/(.*)$ /index.php/$1 last;&#125;\n\n-e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则为真-L filename 如果 filename为符号链接,则为真-r filename 如果 filename可读,则为真 -w filename 如果 filename可写,则为真 -x filename 如果 filename可执行,则为真-s filename 如果文件长度不为0,则为真-h filename 如果文件是软链接,则为\n\n\n相关资料:\n\nnginx1.15安装(一)\nnginx1.15安装和配置\nError: xz compression not available的解决办法\nRHEL/CentOS 7中Nginx的systemd service\n【部署问题】解决Nginx: [error] open() "/usr/local/Nginx/logs/Nginx.pid” failed(2:No such file or directory)\n解决NGINX PHP “No input file specified”\n$request_filename + nginx内置变量\n\n","categories":["Nginx"]},{"title":"'str' object has no attribute 'dtype'","url":"/2022/08/21/no-attribute-dtype/","content":"在使用词云时,突然报这个错&#39;str&#39; object has no attribute &#39;dtype&#39;原因则是直接引用了图片文件,而没有通过imread()函数\nimage_mask = &#x27;alice_mask.png&#x27;w=wordcloud.WordCloud(mask=image_mask)\n\n正确写法为\nimage_mask = imread(&#x27;alice_mask.png&#x27;)w=wordcloud.WordCloud(mask=image_mask)\n\n","categories":["Python"]},{"title":"node版本导致的错误","url":"/2021/03/07/node%E7%89%88%E6%9C%AC%E5%AF%BC%E8%87%B4%E7%9A%84%E9%94%99%E8%AF%AF/","content":"错误cant not found moudle mybolgPath/...\n说是找不到模块...,这个有点奇怪的报错,让我觉得莫名其妙,于是在网上各种搜索\n原因看到有大佬说如果文件配置和模块都没问题,但提示找不到模块,多半是node版本不适合当前项目导致的\n想了想,我最近在鼓捣自己的博客时,改动最多的就是配置文件,模块什么的就没动过,最大的改动就是为了测试一个功能安装了最新版的node。\n解决最开始我用的是node v11.14.0,之后更新到了 v14.15.0想要快捷简单的管理node版本,可以使用n一个node的版本控制插件\n安装nnpm install -g n\n查看node版本node -v14.15.0\n下载11.14.0n v11.14.0[1]\n完成后查看node版本node -v11.14.0\n之后再次运行博客,就没出现找不到模块的错误了,解决。\n1.可能会提示PATH=$PATH之类的错误,是因为系统还在使用之前版本的node,运行一下PATH=$PATH即可 ↩","categories":["node"]},{"title":"npm 打包项目","url":"/2021/04/05/npm-%E6%89%93%E5%8C%85%E9%A1%B9%E7%9B%AE/","content":"\n来源: vue使用npm run build命令打包 - 西瓜君~ - 博客园\n\n当我们使用vue-cli脚手架完成一个项目的时候,下一步肯定会想要怎么把这个项目放到互联网上或者本地直接打开呢,我们在本地调试的时候只要命令行执行npm run dev就可以把这个项目跑起来,但是现在我们要把他放到服务器上的话用npm run build命令就可以啦。\n首先\n命令行执行npm run build命令,命令需要在项目目录下执行\nC:\\Users\\John\\Desktop\\demo&gt;npm run build 我的是一个在桌面叫demo的项目\n出现以下提示表示打包完成:\n\nvue使用npm run build命令打包项目然后\n我们就可以像打开静态网页一样打开我们完成的项目。\n下图为打包生成的dist文件夹,其中index.html为入口文件:\nvue使用npm run build命令打包项目\n没错,这时你打开了index.html文件,发现网页一片空白,打开F12发现console报了几个错误,状态码为404:\nvue使用npm run build命令打包项目\n这是因为引用资源的路径问题,我们只要在下图的地方修改一下再打包就可以了。\n需要修改的文件在项目目录下的config文件夹里的index.js文件中\nvue使用npm run build命令打包项目\n改完,再次执行npm run build,然后打开index.html发现sucess\ndemo\n完。\n","categories":["npm"]},{"title":"o盘隐藏文件","url":"/2021/03/07/o%E7%9B%98%E9%9A%90%E8%97%8F%E6%96%87%E4%BB%B6/","content":"\n新建文本,输入以下内容,并修改文件后缀为cmd@ECHO OFFMD E:\\RECYCLED\\UDrives.&#123;25336920-03F9-11CF-8FD0-00AA00686F13&#125;&gt;NULIF EXIST O:\\NUL GOTO DELETESUBST O: E:\\RECYCLED\\UDrives.&#123;25336920-03F9-11CF-8FD0-00AA00686F13&#125;STARTO:\\GOTO END:deleteSUBST /D O::END\n双击cmd运行,会自动在 E盘 新建一个 RECYCLED 文件夹。而系统会生成一个o盘,存放完东西后,再次双击,该盘就会消失。\n\n\n在xp下,该文件夹会自动变成回收站,但是win10不会,如果是win10,想要生效则要设置 desktop.ini。\n\n右键 RECYCLED 文件夹-&gt;属性-&gt;高级,取消勾选[除了 文件属性外,还允许索弓此文件夹中文件的内容]\n使用win自带的搜索工具就不能查找到该文件夹内的文件,确认之后,勾选属性中的只读与隐藏。\n\n但是其他更强大的搜索软件能搜索到,毕竟该方法只是隐藏,没有加密\n\n\nRECYCLED 属性设置\n\n win10中,文件夹名并不会影响到文件夹属性,所以需要手动设置文件夹属性\n 在 RECYCLED 文件夹里新建desktop.ini,写入 [.ShellClassInfo]CLSID=&#123;645FF040-5081-101B-9F08-00AA002F954E&#125;\n &#123;645FF040-5081-101B-9F08-00AA002F954E&#125;为回收站保存后,重开文件夹就成了回收站。无法打开,但是右键属性并且因为属于系统性文件夹,只开启 文件夹选项中的 [显示隐藏文件] 也不能查看\n\n不过可以通过cmd/rar查看cmd:#进入该文件夹$ cd RECYCLED#查看文件$ dir#只显示隐藏文件$ dir /a:h\t#使用记事本 编辑desktop.ini\t$ notepad desktop.ini\n\n","categories":["杂谈"]},{"title":"php CLI mode 开启","url":"/2022/08/21/php-CLI-mode/","content":"使用composer安装软件包出现类似报错\n\n Problem 1\n\nInstallation request for doctrine/orm v2.5.6 -&gt; satisfiable by doctrine/orm[v2.5.6].\ndoctrine/orm v2.5.6 requires ext-pdo * -&gt; the requested PHP extension pdo is missing from your system.You can also run php --ini inside terminal to see which files are used by PHP in CLI mode.\n\n\n根据doctrine/orm v2.5.6 requires ext-pdo * -&gt; the requested PHP extension pdo is missing from your system. 提示可知,是因为扩展pdo没有开启。\n命令行输入# php --ini获得php.ini的位置\n取消;extension=php_pdo.dll的注释注:php7^的扩展简写为extension=pdo\n"},{"title":"php-xdebug配置","url":"/2021/04/05/php-xdebug%E9%85%8D%E7%BD%AE/","content":"来源:PhpStorm配置Xdebug调试_司马彰的学习专栏 - SegmentFault 思否\n安装xdebug去官网下载对应版本的xdebug扩展Xdebug: Downloads\n\n历史版本见Github:xdebug.org/html/files at master · derickr/xdebug.org · GitHub\n\n如何选择正确版本1.官网下载\n输出phpinfo()函数的内容\n\n![一座浮岛](/2021/04/05/php-xdebug配/pasted-0.png)\n\n查看输出页面的网页源码\n\n!\n\n全选复制\n\n\n\n到这个页面 Xdebug: Support — Tailored Installation Instructions ,将刚才复制的内容拷贝进去,并分析\n\n\n\n可以得到自己当前版本的php对应哪一个xdebug文件\n\n\n2.GitHub下载历史版本当官网没有时,我们可以去GitHub找它的历史版本xdebug.org/html/files at master · derickr/xdebug.org · GitHub\n\n输出phpinfo()函数的内容根据图中信息,php版本为5.3.29-nts-v9-x86\nphp版本对应的xdebug说明:这是一个xdebug文件php_xdebug-2.1.2-5.3-vc9-nts-x86_64.dll\n\nphp_xdebug-2.1.2表示是2.1.2版本的xdebug\n5.3-vc9表示php是5.3.*版本,并且Compiler 是 MSVC9 (Visual C++ 2008)\nnts则是None-Thread Safe非线程安全,Thread Safe=disabled 则是表示nts\nx86_64则是Architecture=x86!!不一定非要32位的,可以先试64位的!! \n\n\n\n进入页面后按CTRL+f进行搜索\n\n\n下载好的dll配置好后如果phpinfo中没有打印xdebug这一栏,则说明该版本不适合,需要更换版本。不然调试时就会报找不到idekey的提示!(waiting for incoming connection with ide kay’xxx’)吐槽下:如果没有耐心去试,直接搜索支持php5.3-vc9-nts-x86 的xdebug 说不定有惊喜\n\n安装扩展这个windows系统和Linux系统是不一样的(网上很多,不细说)\nwindows放到php ext的目录下配置php.ini\n[XDebug] zend_extension &#x3D; &quot;D:\\你php的ext目录位置\\php\\ext\\php_xdebug.dll&quot;xdebug.remote_autostart&#x3D;1 xdebug.remote_enable &#x3D; Onxdebug.remote_handler &#x3D; &quot;dbgp&quot;xdebug.remote_host &#x3D; &quot;localhost&quot; #本地服务器xdebug.remote_port &#x3D; 9010 #默认为9000,防止与php-fpm冲突,改为9010xdebug.idekey&#x3D;&quot;PHPSTORM&quot; #会话需要的key\n\nLinux这个很多种情况,一般就apt和yum,如果手动编译就需要.so扩展放到正确位置(phpize使用)配置phpStorm先查看xdebug是否安装成功\n配置phpstorm我是基于这个版本的\n打开phpstorm配置文件\n设置本地的php解释器php解释器,就是php的二进制文件,windows下的php安装路径下的php.exe,类unix系统就是bin/php文件\n如果没有上述选项\n填写服务器端的相关信息\nHost指的是服务器对应的项目的访问域名\n本地nginx我用127.0.0.1\n用默认的80端口\n\n\n\n\n配置xdebug选项\n配置DBGp ProxyDBGp Proxy:多人远程调试\n添加一个调试配置\n\n我们这里使用的是PHP Web Page,是需要依赖浏览器,额外的说明我写在本文的后记了,不是现在需要关注的重点\n\n\n配置chrome安装浏览器插件我这里使用的是chrome浏览器,安装的是xdebug helper插件,无法使用应用商店的可以到国内镜像网站去下\n配置插件\n开始调试\n\n后记本文中,我们PhpStorm使用的是PHP Web Page,这是需要依赖浏览器,且浏览器是必须安装插件另一种情况,如果我们使用PHP Remote Debug,就只需要在网址后面加上?XDEBUG_SESSION_START=PHPSTORM,这样可以调试了,和浏览器无关两者各有优劣,使用Remote Debug的坏处在于需要加上参数,但却不依赖浏览器,有利于手机App,微信的调试\n\n配置总结:\n1、不要依靠wamp上php版本对应的xdebug版本,要按照上面描述的方法进行检测,下载匹配的xdebug版本。\n2、这个调试是要在浏览器里安装插件才能进行调试,并且要手动输入调试地址,直接点击下图所示调试图标无效,暂时没弄明白。\n3、google插件下载地址:[http://chromecj.com/web-development/2018-04/980/download.html]\n","categories":["PHP"]},{"title":"php yield理解","url":"/2021/06/20/php-yield%E7%90%86%E8%A7%A3/","content":"\n转载自:PHP中被忽略的性能优化利器:生成器|segmentfault作者:星空幻颖\n \n\n如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生。但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显。但是,生成器功能的确非常有用。\n优点\n直接讲概念估计你听完还是一头雾水,所以我们先来说说优点,也许能勾起你的兴趣。那么生成器有哪些优点,如下:\n\n生成器会对PHP应用的性能有非常大的影响\nPHP代码运行时节省大量的内存\n比较适合计算大量的数据\n\n那么,这些神奇的功能究竟是如何做到的?我们先来举个例子。\n概念引入\n首先,放下生成器概念的包袱,来看一个简单的PHP函数:\nfunction createRange($number)&#123; $data = []; for($i=0;$i&lt;$number;$i++)&#123; $data[] = time(); &#125; return $data;&#125;\n\n这是一个非常常见的PHP函数,我们在处理一些数组的时候经常会使用。这里的代码也非常简单:\n\n我们创建一个函数。\n函数内包含一个for 循环,我们循环的把当前时间放到$data里面\nfor循环执行完毕,把 $data 返回出去。\n\n下面没完,我们继续。我们再写一个函数,把这个函数的返回值循环打印出来:\n$result = createRange(10); // 这里调用上面我们创建的函数foreach($result as $value)&#123; sleep(1);//这里停顿1秒,我们后续有用 echo $value.&#x27;&lt;br /&gt;&#x27;;&#125;\n\n这里非常完美,没有任何问题。(当然 sleep(1) 效果你们看不出来)\n思考一个问题\n我们注意到,在调用函数 createRange 的时候给 $number 的传值是10,一个很小的数字。假设,现在传递一个值10000000(1000万)。\n那么,在函数 createRange 里面,for循环就需要执行1000万次。且有1000万个值被放到 $data 里面,而$data数组在是被放在内存内。所以,在调用函数时候会占用大量内存。\n这里,生成器就可以大显身手了。\n创建生成器\n我们直接修改代码,你们注意观察:\nfunction createRange($number)&#123; for($i=0;$i&lt;$number;$i++)&#123; yield time(); &#125;&#125;\n看下这段和刚刚很像的代码,我们删除了数组 $data ,而且也没有返回任何内容,而是在 time() 之前使用了一个关键字yield。\n使用生成器\n我们再运行一下第二段代码:\n$result = createRange(10); // 这里调用上面我们创建的函数foreach($result as $value)&#123; sleep(1); echo $value.&#x27;&lt;br /&gt;&#x27;;&#125;\n\n我们奇迹般的发现了,输出的值和第一次没有使用生成器的不一样。这里的值(时间戳)中间间隔了1秒。\n这里的间隔一秒其实就是 sleep(1) 造成的后果。但是为什么第一次没有间隔?那是因为:\n\n未使用生成器时: createRange 函数内的 for 循环结果被很快放到 $data 中,并且立即返回。所以, foreach 循环的是一个固定的数组。\n使用生成器时: createRange 的值不是一次性快速生成,而是依赖于 foreach 循环。 foreach 循环一次, for 执行一次。\n\n到这里,你应该对生成器有点儿头绪。\n深入理解生成器\n代码剖析function createRange($number)&#123; for($i=0;$i&lt;$number;$i++)&#123; yield time(); &#125;&#125;$result = createRange(10); // 这里调用上面我们创建的函数foreach($result as $value)&#123; sleep(1); echo $value.&#x27;&lt;br /&gt;&#x27;;&#125;\n我们来还原一下代码执行过程。\n\n首先调用 createRange 函数,传入参数10,但是 for 值执行了一次然后停止了,并且告诉 foreach 第一次循环可以用的值。\nforeach 开始对 $result 循环,进来首先 sleep(1) ,然后开始使用 for给的一个值执行输出。\nforeach 准备第二次循环,开始第二次循环之前,它向 for 循环又请求了一次。\nfor 循环于是又执行了一次,将生成的时间戳告诉 foreach.\nforeach 拿到第二个值,并且输出。由于 foreach 中 sleep(1) ,所以, for 循环延迟了1秒生成当前时间\n\n所以,整个代码执行中,始终只有一个记录值参与循环,内存中也只有一条信息。\n无论开始传入的 $number 有多大,由于并不会立即生成所有结果集,所以内存始终是一条循环的值。\n概念理解到这里,你应该已经大概理解什么是生成器了。下面我们来说下生成器原理。\n首先明确一个概念:生成器yield关键字不是返回值,他的专业术语叫产出值,只是生成一个值\n那么代码中 foreach 循环的是什么?其实是PHP在使用生成器的时候,会返回一个 Generator 类的对象。 foreach 可以对该对象进行迭代,每一次迭代,PHP会通过 Generator 实例计算出下一次需要迭代的值。这样 foreach 就知道下一次需要迭代的值了。\n而且,在运行中 for 循环执行后,会立即停止。等待 foreach 下次循环时候再次和 for 索要下次的值的时候,循环才会再执行一次,然后立即再次停止。直到不满足条件不执行结束。\n实际开发应用很多PHP开发者不了解生成器,其实主要是不了解应用领域。那么,生成器在实际开发中有哪些应用?\n读取超大文件PHP开发很多时候都要读取大文件,比如csv文件、text文件,或者一些日志文件。这些文件如果很大,比如5个G。这时,直接一次性把所有的内容读取到内存中计算不太现实。\n这里生成器就可以派上用场啦。简单看个例子:读取text文件\n\n我们创建一个text文本文档,并在其中输入几行文字,示范读取。\n&lt;?phpheader(&quot;content-type:text/html;charset=utf-8&quot;);function readTxt()&#123; # code... $handle = fopen(&quot;./test.txt&quot;, &#x27;rb&#x27;); while (feof($handle)===false) &#123; # code... yield fgets($handle); &#125; fclose($handle);&#125;foreach (readTxt() as $key =&gt; $value) &#123; # code... echo $value.&#x27;&lt;br /&gt;&#x27;;&#125;\n\n\n通过上图的输出结果我们可以看出代码完全正常。\n但是,背后的代码执行规则却一点儿也不一样。使用生成器读取文件,第一次读取了第一行,第二次读取了第二行,以此类推,每次被加载到内存中的文字只有一行,大大的减小了内存的使用。\n这样,即使读取上G的文本也不用担心,完全可以像读取很小文件一样编写代码。\n\n补充\n百万级别的访问量\nyield生成器是php5.5之后出现的,yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。\nyield生成器允许你 在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组。\n使用示例:\n/** * 计算平方数列 * @param $start * @param $stop * @return Generator */ function squares($start, $stop) &#123; if ($start &lt; $stop) &#123; for ($i = $start; $i &lt;= $stop; $i++) &#123; yield $i =&gt; $i * $i; &#125; &#125; else &#123; for ($i = $start; $i &gt;= $stop; $i--) &#123; yield $i =&gt; $i * $i; //迭代生成数组: 键=》值 &#125; &#125; &#125; foreach (squares(3, 15) as $n =&gt; $square) &#123; echo $n . ‘squared is‘ . $square . ‘&lt;br&gt;‘; &#125; 输出: 3 squared is 9 4 squared is 16 5 squared is 25 ... \n示例2:\n/对某一数组进行加权处理 $numbers = array(‘nike‘ =&gt; 200, ‘jordan‘ =&gt; 500, ‘adiads‘ =&gt; 800); //通常方法,如果是百万级别的访问量,这种方法会占用极大内存 function rand_weight($numbers) &#123; $total = 0; foreach ($numbers as $number =&gt; $weight) &#123; $total += $weight; $distribution[$number] = $total; &#125; $rand = mt_rand(0, $total-1); foreach ($distribution as $num =&gt; $weight) &#123; if ($rand &lt; $weight) return $num; &#125; &#125; //改用yield生成器 function mt_rand_weight($numbers) &#123; $total = 0; foreach ($numbers as $number =&gt; $weight) &#123; $total += $weight; yield $number =&gt; $total; &#125; &#125; function mt_rand_generator($numbers) &#123; $total = array_sum($numbers); $rand = mt_rand(0, $total -1); foreach (mt_rand_weight($numbers) as $num =&gt; $weight) &#123; if ($rand &lt; $weight) return $num; &#125; &#125; ","categories":["PHP"],"tags":["PHP"]},{"title":"php 异或判断 XOR","url":"/2022/08/21/php-%E5%BC%82%E6%88%96%E5%88%A4%E6%96%AD-XOR/","content":"在php 判断语句中,有 与运算(&amp;&amp;、AND) 或运算(||、OR) 以及 异或运算(XOR)\n\n逻辑与: 条件是否都满足的逻辑或: 条件中是否有满足的逻辑异或: 条件中有且只有一个满足的\n\n$num = 3;//同时满足if ($num &lt; 4 XOR $num &lt;10)&#123; echo &#x27;变量小于4异或小于10&#x27;;&#125;//同时不满足if($num &gt; 4 XOR $num &gt;10)&#123; echo &#x27;变量大于4异或大于10&#x27;;&#125;//只满足其一if($num &lt; 4 XOR $num &gt;10)&#123; echo &#x27;变量小于4异或大于10&#x27;;&#125;//输出结果 //变量小于4异或大于10\n\nps:\n\n逻辑与 逻辑或 存在一个短路现象\n当 AND逻辑与 两个条件中的第一个为假时,则会直接跳出而不判断后一个条件\n当 OR逻辑或 两个条件中的第一个为真时,则会直接进入执行而不判断后一个条件\n\n\n\n","categories":["PHP"]},{"title":"php 数组使用unset 以后数组变对象","url":"/2021/05/13/php-%E6%95%B0%E7%BB%84%E4%BD%BF%E7%94%A8unset-%E4%BB%A5%E5%90%8E%E6%95%B0%E7%BB%84%E5%8F%98%E5%AF%B9%E8%B1%A1/","content":"&#x2F;* 隐藏系统奖品优惠券,并重构数据 *&#x2F;foreach ($detail[&#39;coupons&#39;] as $k&#x3D;&gt;$v)&#123; if($v[&#39;type&#39;] &#x3D;&#x3D; &#39;sys&#39;)&#123; unset($detail[&#39;coupons&#39;][$k]); &#125;&#125;\n\nunset后,发现数组变为对象,导致前端数据读取不到\n\n使用 array_value()即可\n&#x2F;&#x2F;unset()会将数组变为对象,因此需要重构数组$detail[&#39;coupons&#39;] &#x3D; array_values($detail[&#39;coupons&#39;]);&#x2F;*输出的数据coupons:[ \t0:&#123; id: 9, name: &quot;其他优惠券&quot;, type: &quot;cash&quot;, … &#125; ]*&#x2F;\n\n参考资料:\n\nphp 数组使用unset 以后数组变对象\n\n"},{"title":"php 生成二维码","url":"/2021/07/30/php-%E7%94%9F%E6%88%90%E4%BA%8C%E7%BB%B4%E7%A0%81/","content":"前言\nphp 7.14\n需开启GD2库\n\n\nphpQRCode 1.1.4\n下载 PHP QR Code\n\n\n\n说明文件里只需要phpqrcode.php文件。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):\npublic static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) &#123;\t$enc = QRencode::factory($level, $size, $margin);\treturn $enc-&gt;encodePNG($text, $outfile, $saveandprint=false);&#125;\n** 参数说明 **\n\n$text:二维码包含的内容,可以是链接、文字、json字符串等等;\n$outfile:默认为false,不生成文件,只返回图片二进制字符串;否则填路径及文件名用以存放图片;\n$level:默认为L,这个参数可传递的值分别是L:(QR_ECLEVEL_L,7%)、M:(QR_ECLEVEL_M,15%)、Q:(QR_ECLEVEL_Q,25%)、H:(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;\n$size:控制生成图片的大小,默认为4;\n$margin:控制生成二维码的空白区域大小;\n$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;\n\n1. 生成二维码(文件流)\n$QR = QRcode::png($url, false, &#x27;L&#x27;, 5, 2);//生成二维码return $QR\n\n2. 生成二维码(文件)\n//生成二维码图片$filename = &#x27;qrcode/&#x27;.microtime().&#x27;.png&#x27;;QRcode::png($url,$filename,&#x27;L&#x27;,5,2); //已经生成的原始二维码图片文件$QR = $filename; $QR = imagecreatefromstring(file_get_contents($QR)); //输出图片imagepng($QR, &#x27;qrcode.png&#x27;); imagedestroy($QR);return &#x27;&lt;img src=&quot;qrcode.png&quot; alt=&quot;&quot;&gt;&#x27;; \n\n3. 二维码中加上logo(文件)\n//生成二维码图片$filename = &#x27;qrcode/&#x27;.microtime().&#x27;.png&#x27;;QRcode::png($url,$filename,&#x27;H&#x27;,6,2);$logo = &#x27;qrcode/logo.jpg&#x27;; // 准备好的logo图片$QR = $filename; // 已经生成的原始二维码图if (file_exists($logo)) &#123; $QR = imagecreatefromstring(file_get_contents($QR)); \t\t//目标图象连接资源。 $logo = imagecreatefromstring(file_get_contents($logo)); \t//源图象连接资源。 $QR_width = imagesx($QR);\t\t\t//二维码图片宽度 $QR_height = imagesy($QR);\t\t\t//二维码图片高度 $logo_width = imagesx($logo);\t\t//logo图片宽度 $logo_height = imagesy($logo);\t\t//logo图片高度 $logo_qr_width = $QR_width / 4; \t//组合之后logo的宽度(占二维码的1/5) $scale = $logo_width/$logo_qr_width; \t//logo的宽度缩放比(本身宽度/组合后的宽度) $logo_qr_height = $logo_height/$scale; //组合之后logo的高度 $from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点 //重新组合图片并调整大小 /* *\timagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中 */ imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);&#125;//输出图片imagepng($QR, &#x27;qrcode.png&#x27;);imagedestroy($QR);imagedestroy($logo);return &#x27;&lt;img src=&quot;qrcode.png&quot; alt=&quot;&quot;&gt;&#x27;;\n\n\n输出 base64 图片流//生成二维码图片 并转为base64ob_start(); //开启缓冲区QRcode::png($url, false, &#x27;L&#x27;, 5, 2);//生成二维码$img = ob_get_contents(); //获取缓冲区内容ob_end_clean(); //清除缓冲区内容$imgInfo = &#x27;data:png;base64,&#x27; . chunk_split(base64_encode($img));//转base64ob_flush();echo $imgInfo;\n\n\n参考资料\n\n(使用phpqrcode生成二维码)[https://blog.csdn.net/sinat_35861727/article/details/73862991]\n( PHP用Qrcode生成二维码base64流\n\n)[https://www.cnblogs.com/wanghaodong/p/11120051.html]\n","categories":["PHP"],"tags":["PHP"]},{"title":"php72w-common conflicts with php-common-5.4.16-46.el7.x86_64","url":"/2022/08/21/php72w-common-conflicts-with-php-common-5-4-16-46-el7-x86-64/","content":"Linux里安装swoole时,需要先安装php-pear,我是centos7,php7.2安装php-pear[^pear]#yum install php-pear然后报尝试添加–skip-broken也没用,遂网上求助\n解决办法为:#yum install php72w-pear\n\n原文:https://www.cnblogs.com/aguncn/p/11129155.html安装PHP的BC扩展时,报的错。使用的命令为#yum install php-bcmath输出错误:\n--&gt; Processing Conflict: php72w-common-7.2.19-1.w7.x86_64 &gt; conflicts php-common &lt; 7.2--&gt; Finished Dependency ResolutionError: php72w-common conflicts with php-common-5.4.16-&gt; 46.el7.x86_64You could try using --skip-broken to work around the problemYou could try running: rpm -Va --nofiles --nodigest\n\n更改命令为:#yum install php72w-bcmath搞定\n\n[^pear]: PEAR(PHP Extension and Application Repository)即PHP扩展和应用仓库。\nPEAR 将PHP程序开发过程中常用的功能编写成类库,涵盖了页面呈现、数据库访问、文件操作、数据结构、缓存操作、网络协议、WebService 等许多方面,用户可以通过下载这些类库并适当的作一些定制以实现自己需要的功能。避免重复发明“车轮”。PEAR 的出现大大提高了PHP 程序的开发效率和开发质量。PECL(PHP Extension Community Library)即PHP 扩展库。PECL 可以看作PEAR 的一个组成部分,提供了与PEAR 类似的功能。不同的是PEAR的所有扩展都是用纯粹的PHP代码编写的,用户在下载到PEAR 扩展以后可以直接使用将扩展的代码包含到自己的PHP 文件中使用。而PECL是使用C 语言开发的,通常用于补充一些用PHP难以完成的底层功能,往往需要重新编译或者在配置文件中设置后才能在用户自己的代码中使用。最直接的表述:PEAR是PHP的上层扩展,PECL是PHP的底层扩展。它们都是为特定的应用提供现成的函数或者类。\n","categories":["linux"]},{"title":"phpstudy mysql启动不了","url":"/2021/03/07/phpstudy-mysql%E5%90%AF%E5%8A%A8%E4%B8%8D%E4%BA%86/","content":"问题手动的将 MySQL 服务开启,使MySQL可以通过命令行控制后,phpstudy 就无法启动 mysql了,只能在命令行中控制。\n解决暂无解决办法\n软件和命令行只能取其一\n开启或关闭MySQL服务见MySQL数据库崩溃\n","categories":["MySql"]},{"title":"php与js时间戳相互转换","url":"/2021/03/12/php%E4%B8%8Ejs%E6%97%B6%E9%97%B4%E6%88%B3%E7%9B%B8%E4%BA%92%E8%BD%AC%E6%8D%A2/","content":"php方法 time(); 获取现在时间得到10位数,单位秒js new Date();Date.getTime(); 获取现在时间得到13位数字,单位毫秒\nphp传到js的时间戳 要*1000可以正确解读;var time = new Date(parseInt(phptime)*1000)\n\n参考资料: \n\nphp与js时间戳相互转换\n\n","categories":["杂谈"]},{"title":"php的ts,nts","url":"/2022/08/21/php%E7%9A%84ts-nts/","content":"来源:php的ts,tns_兔子的博客-CSDN博客\n1. 简介ts(Thread-Safety)即线程安全,多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他\n线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染php以ISAPI方\n式加载的时候选择这个版本,php以ISAPI方式加载的时候选择这个版本.\nnts(None-Thread Safe)即非线程安全,就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的是脏数据php以fast cgi方式运行的时候选择这个版本,具有更好的性能;\nISAPI(Internet Server Application Programming Interface), 通常是指被http服务器所加载,以服务器的模块形式运行,由微 软提出,故只能在win平台上运行,例如win下的apache,iis[据说用fast cgi 方式工作更稳定],而linux上php则以 Apache模块或者php-fpm的方式运行。\ncgi(Common Gateway Interface):HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,说白了,cig就是一种后台语言,其可以和服务器之间进行通讯。此时的php是作为一个独立的程序运行的。特点就是耗费内存。\nfast cgi.是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork.这种方式是与语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。\ncgi和fast cgi的区别找度娘。\n2.选择 通常win下php和apache组合,以isapi的方式运行,而linux下可以是apche+php,php常常作为apache的模块,而nginx+php时,phpfast cgi的方式,即php-fpm的方式跑。\n 据说php-fpm这种方式释放了web服务器,使其仅仅处理请求和并发,而php处理则交php-fpm完成,故 nginx+php现在很受青睐\nTS指Thread Safety,即线程安全,一般在IIS以ISAPI方式加载的时候选择这个版本。NTS即None-Thread Safe,一般以fast cgi方式运行的时候选择这个版本,具有更好的性能。具体:从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方式。如果在IIS下以CGI方式运行PHP会非常慢,这是由于CGI模式是建立在多进程的基础之上的,而非多线程。一般我们会把PHP配置成以ISAPI的方式来运行,ISAPI是多线程的方式,这样就快多了。但存在一个问题,很多常用的PHP扩展是以Linux/Unix的多进程思想来开发的,这些扩展在ISAPI的方式运行时就会出错搞垮IIS。因此在IIS下CGI模式才是 PHP运行的最安全方式,但CGI模式对于每个HTTP请求都需要重新加载和卸载整个PHP环境,其消耗是巨大的。为了兼顾IIS下PHP的效率和安全,微软给出了FastCGI的解决方案。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个进程同时执行。这样既解决了CGI进程模式消耗太大的问题,又利用上了CGI进程模式不存在线程安全问题的优势。因此:如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。\n通过phpinfo();打印环境查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全如果是:enabled,一般来说应该是ts版,否则是nts版。\n","categories":["PHP"]},{"title":"[pillow]ValueError:read of closed file","url":"/2022/08/21/pillow-ValueError-read-of-closed-file/","content":"在使用pillow 7.1.1生成GIF图时出现了\nFile &quot;C:\\Users\\MACHENIKE.DESKTOP-UL15BOR\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages\\PIL\\ImageFile.py&quot;, line 549, in _safe_read return fp.read(size)ValueError: read of closed file\n\npython 源码\npath = os.getcwd() + &#x27;\\\\frames\\\\&#x27; #获取当前路径imgs = []for i in png_list: pic_name = path + i temp = Image.open(pic_name) imgs.append(temp)imgs[0].save(&#x27;output.gif&#x27;,save_all=True,loop=True,append_images=imgs[1:],duration=500)\n\n最后在githun:python-pillow找到了答案\n\n实际上,此问题已由#4528修复,但尚未发布。解决方法是使用frame.copy()。\nfrom PIL import Imageimages = []for i in range(5): frame = Image.open(&#x27;%05d.png&#x27; % i) images.append(frame.copy())images[0].save(&#x27;animation.gif&#x27;, save_all=True, append_images=images[1:], duration=100, loop=0)\n\n算是一个bug吧,希望早点发布新版本\n\n","categories":["Python"]},{"title":"pip No module named 'pip'","url":"/2022/08/21/pip-No-module-named-pip/","content":"情况一:在卸载了python3.6,换成了Anaconda,之后运行pip相关命令时提示ModuleNotFoundError: No module named &#39;pip&#39;\n找到安装目录/script\n查看pip全名(Anaconda默认只有pip3.exe)再在cmd中使用对应指令pip insatllpip3 installpip3.6 install \n情况二来自:解决 ModuleNotFoundError: No module named pip_Python_未来战警-CSDN博客在win10系统下安装wordcloud后提示pip有新版本可以更新,于是按照提示把pip9.0.1更新到最新版,但是出现了一堆报错,再试就提示ModuleNotFoundError: No module named &#39;pip&#39;\n解决办法:python -m ensurepip还原为9.0.1,本地测试再更新也会报错,于是放弃更新\n如果想再尝试更新,输入下面指令即可python -m pip install --upgrade pip \n","categories":["Python"]},{"title":"pip低版本升级到高版本","url":"/2022/08/21/pip%E4%BD%8E%E7%89%88%E6%9C%AC%E5%8D%87%E7%BA%A7%E5%88%B0%E9%AB%98%E7%89%88%E6%9C%AC/","content":"使用pip指令后总是提示版本过低,有新版本可用\nYou are using pip version 9.0.1, however version 20.2.1 is available.You should consider upgrading via the &#x27;python -m pip install --upgrade pip&#x27; command.\n\n不过因为版本过低(9.0.1至20.2),使用指令python -m pip install --upgrade pip会报一个如下的错误FileNotFoundError: [Errno 2] No such file or directory: xxxx/_implementation.cpython-36.pyc该错误是下载的更新包里缺少了该文件,并非本地缺少,就算手动弄一个该文件进更新包里也依旧报错\n只能通过其他指令来实现更新先输入python -m ensurepip还原pip,避免因上一步更新失败导致pip指令失效之后依次尝试以下更新指令:\n\npython -m pip install --upgrade pip \npython -m pip install -U --force-reinstall pip \npip install --user --upgrade pip \n\n","categories":["Python"]},{"title":"pm2项目启动成功,但pm2 list又显示errored的问题","url":"/2021/03/07/pm2%E9%A1%B9%E7%9B%AE%E5%90%AF%E5%8A%A8%E6%88%90%E5%8A%9F%EF%BC%8C%E4%BD%86pm2-list%E5%8F%88%E6%98%BE%E7%A4%BAerrored%E7%9A%84%E9%97%AE%E9%A2%98/","content":"\n首先先判断入口js文件app.js在node上是否能正确运行,确定是否缺少依赖。如若缺少则安装对应的依赖再进行pm2管理。\n\n如若node能正常运行,pm2也能正常启动,但在使用pm2 list命令查看列表时项目出现errored,则尝试以下两行命令\n\n\n来自anlondon博客\nps aux | grep pm2 (查看pm2进程占用情况)kill -9 14360 (这个数值要依据你上面命令返回的进程id进行填写)\n\n杀死pm2进程之后再次重启项目,解决问题。\n\n也可以通过pm2 show id来查看详细的错误信息,进行对应的处理\n\n","categories":["pm2"]},{"title":"pygame窗口全屏超过屏幕大小","url":"/2022/08/21/pygame%E7%AA%97%E5%8F%A3%E5%85%A8%E5%B1%8F%E8%B6%85%E8%BF%87%E5%B1%8F%E5%B9%95%E5%A4%A7%E5%B0%8F/","content":"在win10测试pygame.FULLECREEN全屏显示参数的时候,发现全屏后的窗口大小超过了电脑屏幕的大小\n查看设置的获取屏幕大小的参数,也都是正常的\nvInfo = pygame.display.Info()size = width, height = vInfo.current_w, vInfo.current_hpygame.display.set_mode(size,pygame.FULLSCREEN)print(size) # (1920,1080)\n\n最后在网络上看到说是 win系统(Vista 以上系统),在一些显示环境拥有自动拉伸所有窗口的选项。当该选项被启动时,自动拉伸会扭曲 Pygame 窗口的外观。\n\n\n解决办法:\nimport ctypesctypes.windll.user32.SetProcessDPIAware()# 添加上面两句即可解决true_res = (ctypes.windll.user32.GetSystemMetrics(0), ctypes.windll.user32.GetSystemMetrics(1))pygame.display.set_mode(true_res,pygame.FULLSCREEN)print(true_res) # (1920.,1080)\n\n使用版本win10 1909python :3.6.4pygame : 1.9.6\n","categories":["Python"]},{"title":"python 批量压缩图片","url":"/2021/03/07/python-%E6%89%B9%E9%87%8F%E5%8E%8B%E7%BC%A9%E5%9B%BE%E7%89%87/","content":"\n上源码\nfrom PIL import Imageimport osimport time# 获取图片文件的大小def get_size(file): # 获取文件大小:KB size = os.path.getsize(file) return size / 1024# 拼接输出文件地址def get_outfile(infile, outfile): if outfile: return outfile dir, suffix = os.path.splitext(infile) #outfile = &#x27;&#123;&#125;-out&#123;&#125;&#x27;.format(dir, suffix) outfile = &#x27;&#123;&#125;&#123;&#125;&#x27;.format(dir, suffix) print(outfile) return outfile,suffix# 压缩文件到指定大小,我期望的是150KB,step和quality可以修改到最合适的数值def compress_image(infile, outfile=&#x27;&#x27;, mb=250, step=10, quality=80): &quot;&quot;&quot;不改变图片尺寸压缩到指定大小 :param infile: 压缩源文件 :param outfile: 压缩文件保存地址 :param mb: 压缩目标,KB :param step: 每次调整的压缩比率 :param quality: 初始压缩比率 :return: 压缩文件地址,压缩文件大小 &quot;&quot;&quot; o_size = get_size(infile) if o_size &lt;= mb: return infile outfile,suffix = get_outfile(infile, outfile) #if suffix while o_size &gt; mb: im = Image.open(infile) #im = Image.fromarray(infile) im.save(outfile, quality=quality) #im.convert(&#x27;RGB&#x27;).save(outfile, quality=quality) if quality - step &lt; 0: break quality -= step o_size = get_size(outfile) return outfile, get_size(outfile)# 修改图片尺寸,如果同时有修改尺寸和大小的需要,可以先修改尺寸,再压缩大小#x_s=1376def resize_image(infile, outfile=&#x27;&#x27;, x_s=320): &quot;&quot;&quot;修改图片尺寸 :param infile: 图片源文件 :param outfile: 重设尺寸文件保存地址 :param x_s: 设置的宽度 :return: &quot;&quot;&quot; im = Image.open(infile) x, y = im.size y_s = int(y * x_s / x) out = im.resize((x_s, y_s), Image.ANTIALIAS) outfile = get_outfile(infile, outfile) out.save(outfile)# 获取文件夹下所有文件def listdir(path, list_name): #传入存储的list for file in os.listdir(path): file_path = os.path.join(path, file) if os.path.isdir(file_path): listdir(file_path, list_name) else: list_name.append(file_path)if __name__ == &#x27;__main__&#x27;: list = [] listdir(&#x27;./1/&#x27;,list) for li in list: #print(li) compress_image(li) #resize_image(li) #break\n\n\n相关资料:\n\n总结python处理图片等比例压缩与质量处理的方法\n\n","categories":["Python"]},{"title":"socket TCP 和 UDP","url":"/2022/08/21/socket-TCP-%E5%92%8C-UDP/","content":"简单概述\n在互联网中,不同地区的计算机/设备通过Internet相互联系,但是因为习惯和语言的不同,容易造成双方不能直接沟通,因此加入了一系列协议,规定什么样的通信使用什么样的协议,这些协议称为互联网协议(Internet Protocol Suite),互联网的本质就是一系列协议;TCP协议和UDP协议就是众多协议中的一部分。 \n网络通信原理_网络_梦心之魂的博客-CSDN博客\n\n\n如两个人打电话,双方说着不同的方言,为了沟通顺畅,可以一起使用同一标准的普通话。\n而当广西的A想给某国的C打电话时,双方语言不同,就得依靠翻译,增加了沟通成本。如果大家都能使用同一种语言(标准),这样沟通就方便多了。\n因此就诞生了互联网协议,这些协议定义计算机如何接入internet,以及接入internet的计算机通信的标准。\n\n\n\n\n\n网络编程\n\n网络编程就是Socket编程\nsocket编程: 二进制 + IP + 端口通讯的一种模式\n在任何语言中都有socket编程,因此几乎所有的语言的socket都可以互通;如C可以和PHP、JAVA使用socket通讯\n\n\n网络模型分层\n\n简单的tcp/ip四层\n\n\n\n功能\n协议\n\n\n\n应用层\nHTTP协议\n\n\n传输层\nTCP协议\n\n\n网络层\nIP协议\n\n\n链路层\n以太网协议\n\n\n\n详细介绍:网络通信原理_网络_梦心之魂的博客-CSDN博客互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层\n\n\n\n\n 每层运行常见物理设备\n\n4.区分客户端和服务器端 - 谁发起请求,谁就是客户端(client) - 谁接受请求,谁就是服务器端(server)\n简单概述TCP、UDP\nTCP \n\n点对点的建立链接\n如同两个人写信,你需要知道对方的具体地址(ip)还需要知道对方的姓名(port)^port\n\n\nUDP\n\n一对多单向广播,一次最多64K\n如同学校广播通知,内容需要简短易懂(64k),接收信息的人特别多(一对多单向广播),不是所有人都能听到以及感兴趣\n\n\n\n总结两者区别:UDP面向无链接,不管有没有接收方,都会发出去,但是发送的数据最多只有64kb,这种方式很有效率但是不够安全。而TCP协议则规定了数据传输时要三次握手四次分手的过程,是比较安全的,是点对点面向有链接的。因此在做有链接的数据通讯编程时,TCP是首选,而不那么看中安全性以及面向无链接时,则可以选用UDP。简述TCP的三次握手过程 - 清风木 - 博客园\n\n\n\n总览图\n\n\n\n\n\nTCP三次握手\n\n\n\n\nTCP四次挥手\n\n\n\n\nSYN:同步序列编号(Synchronize Sequence Numbers)\n\n\n\n\nTCP 和 UDP 的优缺点\n\n\n协议\n特点\n优点\n\n\n\nTCP\n点对点,面向链接\n安全性高\n\n\nUDP\n一对多,面向无链接\n效率高\n\n\n\n 注释\n","categories":["网络协议"],"tags":["网络协议"]},{"title":"sort()及<__main__.xx at xxx>对象类型排序","url":"/2022/08/21/sort-%E5%8F%8A-main-xx-at-xxx-%E5%AF%B9%E8%B1%A1%E7%B1%BB%E5%9E%8B%E6%8E%92%E5%BA%8F/","content":"最近在研究python2.x的项目时,遇到下面一串代码\nself.levels.sort(lambda x,y: cmp(x.sequence, y.sequence))print(self.levels)#[&lt;__main__.Level object at 0x0000015D7FAF8BA8&gt;, &lt;__main__.Level object at 0x0000015D7FAF84A8&gt;, &lt;__main__.Level object at 0x0000015D7FAF8780&gt;, &lt;__main__.Level object at 0x0000015D7FAF8A58&gt;, &lt;__main__.Level object at 0x0000015D7FAF8C50&gt;, &lt;__main__.Level object at 0x0000015D7FB04550&gt;, &lt;__main__.Level object at 0x0000015D7FAF8C18&gt;, &lt;__main__.Level object at 0x0000015D7FB04AC8&gt;, &lt;__main__.Level object at 0x0000015D7FAF8898&gt;, &lt;__main__.Level object at 0x0000015D7FB04470&gt;, &lt;__main__.Level object at 0x0000015D7FAF8A90&gt;, &lt;__main__.Level object at 0x0000015D7FB042E8&gt;, &lt;__main__.Level object at 0x0000015D7FAF8630&gt;, &lt;__main__.Level object at 0x0000015D7FB0D550&gt;, &lt;__main__.Level object at 0x0000015D7FB1C320&gt;]# 我不知道对象数据该怎么存,如果直接list = [&lt;__main__xxx]会报错\n\n因为是python2.x的项目加之对对象类型的了解不够,研究了许久才弄明白该怎么改成python3的写法\n最终的写法levels.sort(key=lambda x:id(x), reverse=True)# key=lambda表示 使用自定义的排序方式# x:id(x) x表示levels的各个子项,id(x)表示获取子项的十六进制值(因为子项都是对象类型)# 所以这句函数表示按照各个子项的十六进制值从大到小排序#或者sorted(levels, key=lambda x:id(x), reverse=True)\n\n先说python 2到3 的改动\nsort()如果要使用lambda,则必须添加key=lambda,如果是倒序必须写reverse=True, 而reverse=False 为升序(默认可不写)\n\ncmp(x,y) 比较大小函数 ,在python3被弃用\n\nx.sequence python3中表示list子项的序列号,但此处的目的应该是要获取对象的值,所以应该使用id(obj)\n\n#python3 list=[&#x27;one&#x27;,&#x27;two&#x27;]print( list[0].sequence )# 0# 对象 a = &lt;__main__.Level object at 0x0000015D7FAF8BA8&gt;print(a)#&lt;__main__.Level object at 0x0000015D7FAF8BA8&gt;print(id(a))# 1842045373040print( 0x0000015D7FAF8BA8 )# 1842045373040\n\n\nsort()使用lambda参数要注意的 看下面的实例:\npairs = [(1, &#x27;one&#x27;), (2, &#x27;two&#x27;), (3, &#x27;three&#x27;), (4, &#x27;four&#x27;)]pairs.sort(key=lambda pair: pair[1])print(pairs)# [(4, &#x27;four&#x27;), (1, &#x27;one&#x27;), (3, &#x27;three&#x27;), (2, &#x27;two&#x27;)]# 其中 pair: pair[1] # pair 表示pairs的子项(1,&#x27;one&#x27;)....;# pair[1] 表示pair的第二个参数 ‘four’,‘one’...\n\n","categories":["Python"]},{"title":"fastadmin Summernote 不加载显示","url":"/2021/06/03/stadmin-Summernote-%E4%B8%8D%E5%8A%A0%E8%BD%BD%E6%98%BE%E7%A4%BA/","content":"起因使用fast admin开发时,使用命令管理生成了一个页面,页面中的textarea,也添加了class=&quot;editor&quot;,但始终不显示summernote编辑插件。\n而其他页面的textarea只要添加了class=&quot;editor&quot;就会显示。\n解决根据fastadmin手册|富文本编辑器 这里的说明,加上对其他页面的研究,最终找到了方法。\n\n\n首先找到页面对应的js文件。(一般在public\\assets\\js\\backend\\中)fast admin使用requestjs来控制js插件,其中index:funxtion()&#123;&#125;表示index.html页面的控制器。\n\n修改html文件\n\n再次刷新,页面就加载富文本编辑器了\n\n\n","categories":["fastadmin"]},{"title":"1.1安装swoole","url":"/2021/06/21/swoole/","content":"1.1安装swoolewget方式 centos\n下载#wget https://pecl.php.net/get/swoole-4.2.0.tgz\n解压#tar -zxf swoole-4.2.0.tgz\n进入#cd swoole-4.2.0\n安装依赖#yum -y install gcc gcc-c++ autoconf pcre-devel make当然php也是不可少的\n初始化环境#phpize\n编译#./configure简单编译,后期可以添加参数\n安装#make &amp;&amp; make install\n配置 安装成功后在php.ini中加入extension=swoole.so\n测试 #php -m或#php -r &#39;echo phpinfo();&#39;查看swoole是否可用php-peal方式 centos\n#yum install php-peal[^报错]\n#peal install swoole\n配置 安装成功后在php.ini中加入extension=swoole.so\n测试 #php -m或#php -r &#39;echo phpinfo();&#39;查看swoole是否可用\n\n [^报错]: 如果报 php72w-common conflicts with php-common-5.4.16-46.el7.x86_64 类似的错误,可以查看【linux】 -&gt; 【php72w-common conflicts with php-common-5.4.16-46.el7.x86_64】 这篇文章\n","categories":["swoole","基础了解"],"tags":["swoole"]},{"title":"this.setData is not a function","url":"/2021/06/21/this-setData-is-not-a-function/","content":"ata里设置好一个数据变量,在回调函数里this.setData(&#123;data:xxx&#125;)给该变量赋值,不仅无法赋值还报错误信息TypeError: this.setData is not a function\n表面看是类型错误,可是取到的数据没有错误。原因就是this关键字,不能直接在请求的回调函数里写this,应该在请求外声明一个变量,接收onload函数的this,这样就不会报错了\n\n","categories":["微信"],"tags":["微信"]},{"title":"tp5 事务内多种sql方法错误","url":"/2021/06/09/tp5-%E4%BA%8B%E5%8A%A1%E5%86%85%E5%A4%9A%E7%A7%8Dsql%E6%96%B9%E6%B3%95%E9%94%99%E8%AF%AF/","content":"问题在修改项目时,遇到一个新旧交替的地方,事务内既有sql语句,又有tp的模型对象,\n导致程序虽然能正常运行,sql语句也都是正常的,但是因为修改sql的方式不同,从而使模型修改的数据始终会被回滚\nDb::startTrans(); try&#123; //更新茶碗数据 Db::name(&#x27;user_bowl&#x27;)-&gt;where(&#x27;user_id&#x27;,$user_id)-&gt;update([&#x27;bowl&#x27;=&gt;$after,&#x27;updatetime&#x27;=&gt;$time]); //插入茶碗变更记录 Db::name(&#x27;user_bowl_log&#x27;)-&gt;insert([&#x27;user_id&#x27;=&gt;$user_id,&#x27;before&#x27;=&gt;$before,&#x27;after&#x27;=&gt;$after,&#x27;memo&#x27;=&gt;$memo,&#x27;createtime&#x27;=&gt;$time]); //修改优惠券状态 $Coupons = \\addons\\shopro\\model\\Coupons($id); $Coupons-&gt;status = 1;//已被领取 $Coupons::save(); Db::commit(); &#125; catch (\\Exception $e) &#123; Db::rollback(); //return $e; return false; &#125;\n\n运行上述代码,不会报任何错误,检查数据库,除了Coupons模型对应的数据表,其他的表数据都正常改变了。\n最后不得已,只好修改模型方法为db::name()的方式,才正常。\n具体原因,就不得而知了\n"},{"title":"ftp多用户配置","url":"/2021/03/07/tp%E5%A4%9A%E7%94%A8%E6%88%B7%E9%85%8D%E7%BD%AE/","content":"起因一个客户要求一个文件夹里的不同子目录需要不同的ftp账号进行管理,例如下面,这是一位客户的要求\nFTP1,不绑定域名,有读写权限,预先建立以下目录结构: /bootstrap /bootstrap/resources /bootstrap/resources/attachment /bootstrap/resources/skinFTP2,绑定域名sso.xxx.com、www.xxx.com、data.xxx.com,有读写权限;路径为\t/bootstrapFTP3,绑定域名file.xxx.com,有读写权限;路径为\t/bootstrap/resources/attachment FTP4,绑定域名skin.xxx.com,有读写权限;路径为\t/bootstrap/resources/skinFTP5,绑定域名ress.xxx.com,有读写权限;路径为\t/bootstrap/resources\n\n问题建立多层级目录,和对应的ftp后,发现只有父级目录的ftp账号能链接访问,而子级ftp账号却显示不能链接,\n比如使用 FTP1 连接时,可以访问 /bootstrap ,但是子级目录却只能看不能进入访问\n而使用剩余的账号访问时,直接就拒绝访问了。\n解决这是因为在建立ftp时,对应的目录的所有者会变为对应的ftp账号,而其他账号会因为没有访问权限而被阻止访问。\n例如在建立 FTP1 时,/bootstrap目录的所有者会变为 FTP1 账号。而建立其他账号时,也相应的改变了对应目录的所有者权限,但是父级目录的权限却并没有改变。所以需要给父级目录分别添加上对应的子级账号访问控制权限即可。\n\n在父级目录 给 子级账号访问权限\n同时也要在子级目录 给 FTP1 访问权限\n\n\n注意:只需要在父级目录修改权限即可,子级目录会自动继承父级栏目的权限设定\n\n","categories":["FTP"]},{"title":"ueditor编辑器视频显示问题","url":"/2021/08/24/ueditor%E7%BC%96%E8%BE%91%E5%99%A8%E8%A7%86%E9%A2%91%E6%98%BE%E7%A4%BA%E9%97%AE%E9%A2%98/","content":"src丢失的问题问题描述:使用的是最新的UEditor 1.4.3.3版本,在上传完视频后,编辑的时候出现视频的src丢失的问题解决方式:修改ueditor.config.js文件,将\n\nimg: [‘src’, ‘alt’, ‘title’, ‘width’, ‘height’, ‘id’, ‘_src‘, ‘loadingclass’, ‘class’, ‘data-latex’],\n\n改为\n\nimg: [‘src’, ‘alt’, ‘title’, ‘width’, ‘height’, ‘id’, ‘_url‘, ‘loadingclass’, ‘class’, ‘data-latex’],\n\n插入视频:输入的视频地址有误,请检查后再试!\nueditor.all.js:\n搜索me.commands[&quot;insertvideo&quot;]\n把html.push(creatInsertStr( vi.url, vi.width || 420, vi.height || 280, id + i, null, cl, &#39;image&#39;));修改成html.push(creatInsertStr( vi.url, vi.width || 420, vi.height || 280, id + i, null, cl, &#39;video&#39;));\nueditor.config.js:\n搜索whitList\nimg里面添加&quot;_url&quot;\n\nvideo后面添加\n source: [&#39;src&#39;, &#39;type&#39;],embed: [&#39;type&#39;, &#39;class&#39;, &#39;pluginspage&#39;, &#39;src&#39;, &#39;width&#39;, &#39;height&#39;, &#39;align&#39;, &#39;style&#39;, &#39;wmode&#39;, &#39;play&#39;,&#39;autoplay&#39;,&#39;loop&#39;, &#39;menu&#39;, &#39;allowscriptaccess&#39;, &#39;allowfullscreen&#39;, &#39;controls&#39;, &#39;preload&#39;], iframe: [&#39;src&#39;, &#39;class&#39;, &#39;height&#39;, &#39;width&#39;, &#39;max-width&#39;, &#39;max-height&#39;, &#39;align&#39;, &#39;frameborder&#39;, &#39;allowfullscreen&#39;] \n\n\ndialogs/video/video.js\n搜索function createPreviewVideo\n内容替换为$G(&quot;preview&quot;).innerHTML = &#39;&lt;video class=&quot;previewVideo&quot; controls=&quot;controls&quot; src=&quot;&#39;+conUrl+&#39;&quot; style=&quot;width:420;height:280 &quot;&gt;&lt;/video&gt;&#39;;\n\n参考资料:\n解决百度编辑器在编辑视频时src丢失的问题\n输入的视频地址有误,请检查后再试!\n\n","categories":["HTML"],"tags":["HTML"]},{"title":"vim root用户与普通用户统一配置","url":"/2022/08/21/vim-root%E7%94%A8%E6%88%B7%E4%B8%8E%E6%99%AE%E9%80%9A%E7%94%A8%E6%88%B7%E7%BB%9F%E4%B8%80%E9%85%8D%E7%BD%AE/","content":"以前因为不懂Linux系统的用户分配,所以root和普通用户的vim是不一样的。\n现在一样了\n先卸载本地的vim,提前把vimrc备份下,因为我用的是 vim-plug,插件都是集中管理的,很方便\n卸载安装\n强制删除已安装程序及其关联rpm -qa|grep vim|xargs rpm -ev --allmatches --nodeps\n\n强制删除所有残余文件whereis vim |xargs rm -frv\n\nyum再来一波yum remove vim\n\n然后备份vimrc\n\n手动删除root用户的vim相关文件、普通用户的vim相关文件\n\n\n差不多后就可以安装了使用yum,方便管理\n\nyum intasll vim*\nyum install vimx\n\n因为vim本身不支持系统剪贴板,加上yum的软件都不是最新的,所以要下vimx.下好后vim --version | grep clipboardvimx --version | grep clipboard\n配置\nvimrc配置因为root和普通用户的目录不一样,而之所以root和普通用户的vim不一样就是因为用户目录里的vim配置文件vimrc\n\nvim --version查看vim的系统配置文件在 /etc/vimrcroot用户的vim配置文件在 /root/.vim/vimrc 当前是root,所以~表示的是root的用户目录/root普通用户的vim配置文件 /home/username/vimrc\n\n因为我用的是vim-plug来管理vim插件的,所以我直接把root和普通用户的vimrc删了,然后在/etc/vimrc里配置配置vim-plug:[CentOS 7 安装Vim8 Vim-Plug YouCompleteMe_Python_胖胖的ALEX-CSDN博客的安装、配置vim-plug部分\n\nalias配置root用户 vim ~/.bashrc 然后添加\n\n\n alias vi &#x3D; &#39;vimx&#39;alias vim &#x3D; &#39;vimx&#39;\n\n 普通用户 vim /home/username/.bashrc 然后添加\n alias vi &#x3D; &#39;vimx&#39;alias vim &#x3D; &#39;vimx&#39;\n\n现在root端和用户端的vim的统一啦,不过可能会有一些插件因为权限之类的问题报错。\n","categories":["linux"],"tags":["vim"]},{"title":"vim 特殊字符显示不全","url":"/2021/03/07/vim-%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E6%98%BE%E7%A4%BA%E4%B8%8D%E5%85%A8/","content":"问题电脑系统 : win7putty : Release 0.74\n最近在搞 vim7.4 的时候,遇到特殊字符显示乱码的问题,刚开始以为是系统输出和插件版本的问题,后来在手机上连接的时候发现手机上却没有问题。\n\n电脑上:\n手机上:\n\n解决\n设置输出编码在 ~/.vimrc 中添加以下代码,设置输出编码具体的见 vim 编码设置讲解&quot;设置编码自动识别set termencoding=utf-8set fileencoding=chinese set fileencodings=ucs-bom, utf-8, chinese set langmenu=zh_CN. utf-8\n切换字体;因为 putty 软件默认的字体是 courier New ,而该字体win7上没有,所以切换为 新宋体 即可。\n注意:字符涵盖最多的是 Unicode 的,它包含了全球所有语言的文字和特殊字符,导致 Unicode 字库很庞大,一般字体并不会完全包含,只会选取常用的特殊字符编进字体软件中。初始设置:\n\n\n\n 手动修改为 新宋体 ,并调整光标样式: \n\n选择 粗体,不然字体很细 附上中文翻译 \n\n最后附上调整后的样式\n\n当然并不是所有的特殊字符都能正常显示,这个就只能手动调整了\n\n最后,如果是愿意折腾的小伙伴,可以看看相关资料的第二个链接,里面也有人遇到相似的问题,也有大佬提出了一些建议和办法。\n\n相关资料:\n\nvim 编码设置讲解\n如何配置PuTTY显示这些字符?\n\n","categories":["Vim"]},{"title":"win10-hbuilderx 真机调试 导致神奇的蓝屏","url":"/2022/05/06/win10-hbuilderx-%E7%9C%9F%E6%9C%BA%E8%B0%83%E8%AF%95-%E5%AF%BC%E8%87%B4%E7%A5%9E%E5%A5%87%E7%9A%84%E8%93%9D%E5%B1%8F/","content":"前言最近公司电脑总是蓝屏,最高时一天能蓝屏3-4次,每次蓝屏错误提示都不一样\n&#x2F;&#x2F;出现过的蓝屏终止代码IRQL_NOT_LESS_OR_EQUALKMODE_EXEPTION_NOT_HANDLEDDRIVER IRQL NOT_LESS_OR_EQUAL\n\n也一一试过论坛中的办法,皆无法解决。\n最终尝试让系统蓝屏时生成.dum文件,再使用windbg来分析.dmp文件;发现是hbuilderx下真机调试插件的一个mdb.exe程序,运行时导致的内存错误蓝屏,卸载掉该插件后恢复正常。\n过程1.开启系统崩溃记录按照Windows 创建的小内存转储文件中所说,配置开启系统崩溃记录\n\n2.分析崩溃记录文件按照 How to open and analyze crash dump files on Windows 10 中步骤,分析崩溃文件,并找到导致崩溃的程序,再有针对的处理。\n如我这里就是 hbuilderx3.3.11 中的真机调试插件中的mdb.exe导致的错误直接卸载掉该插件即恢复正常\n\n参考资料:\n\nWindows 创建的小内存转储文件\nHow to open and analyze crash dump files on Windows 10 \nWindows 10 出现蓝屏,报win32kbase.sys ( win32kbase+fcfa0 ) \n认识Dump文件\n\n","categories":["微信"]},{"title":"win10 软件模糊","url":"/2022/08/23/win10-%E8%BD%AF%E4%BB%B6%E6%A8%A1%E7%B3%8A/","content":"最近在用vscode,boostnote, 启动一段时间后界面就开始模糊,刚开始以为是软件优化,但是到后面模糊得字都看不清了。\n网上查说是因为版本的关系,调用了硬件渲染加速导致的,可以在 快捷方式-&gt;右键属性-&gt;目标,里加一段--disable-gpu就可以了。目的是屏蔽硬件加速\n来源:[vs code 启动一段时间字体模糊_开发工具_马达加斯加的企鹅-CSDN博客](\n","categories":["Windows"]},{"title":"win不重启刷新环境变量","url":"/2022/08/23/win%E4%B8%8D%E9%87%8D%E5%90%AF%E5%88%B7%E6%96%B0%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F/","content":"来源:Windows不重启就使环境变量修改生效|简书\n作者:crazytony\n\n在我的电脑-&gt;属性-&gt;高级 / 高级系统设置-&gt;环境变量 中增加或修改环境变量后,需重启系统才能使之生效。\n但很多时候,我们希望不重启系统就能使环境变量生效。\n\n以修改环境变量“PATH”为例,修改完成后,win+R进入 CMD 命令窗口,输入:\nset PATH=C:\n\n关闭 CMD 窗口。再次打开 CMD 窗口,输入:\necho %PATH%\n\n\n\n可以发现“我的电脑”-&gt;“属性”-&gt;“高级”-&gt;“环境变量”中设置的 PATH 值已经生效。\n不用担心 CMD 窗口中的修改会影响环境变量的值,CMD 窗口中的环境变量只是Windows环境变量的一个副本而已。\n但是对副本的修改却会引发Windows环境变量的刷新,这正是我们想要的!\n","categories":["Windows"]},{"title":"xdebug断掉调试经常无故断开","url":"/2021/03/07/xdebug%E6%96%AD%E6%8E%89%E8%B0%83%E8%AF%95%E7%BB%8F%E5%B8%B8%E6%97%A0%E6%95%85%E6%96%AD%E5%BC%80/","content":"需要在vhost.conf中加上两行\nIPCConnectTimeout 3000IPCCommTimeout 3000\n\n&lt;VirtualHost *:80&gt;\tDocumentRoot &quot;D:/phpstudy_pro/WWW/login&quot;\tServerName www.1688.net\tServerAlias FcgidInitialEnv PHPRC &quot;D:/phpstudy_pro/Extensions/php/php-5.6.27-nts&quot; AddHandler fcgid-script .php #加入以下两行 IPCConnectTimeout 3000 IPCCommTimeout 3000#end FcgidWrapper &quot;D:/phpstudy_pro/Extensions/php/php-5.6.27-nts/php-cgi.exe&quot; .php &lt;Directory &quot;D:/phpstudy_pro/WWW/login&quot;&gt; Options FollowSymLinks ExecCGI AllowOverride All Order allow,deny Allow from all Require all granted DirectoryIndex index.php index.html &lt;/Directory&gt;&lt;/VirtualHost&gt;","categories":["PHP"]},{"title":"《以利为利》读后感","url":"/2023/02/08/%E3%80%8A%E4%BB%A5%E5%88%A9%E4%B8%BA%E5%88%A9-%E8%B4%A2%E6%94%BF%E5%85%B3%E7%B3%BB%E4%B8%8E%E5%9C%B0%E6%96%B9%E6%94%BF%E5%BA%9C%E8%A1%8C%E4%B8%BA%E3%80%8B%E8%AF%BB%E5%90%8E%E6%84%9F/","content":"\n《以利为利: 财政关系与地方政府行为》作者:周文舟\n\n摘要\n  ….所以,我们可以看到土地收入银行贷款一城市建设一征地之间形成了一个不断滚动增长的循环过程。这个过程不但为地方政府带来了滚滚财源,也塑造了新世纪繁荣的工业化和城市景象,我将其叫做土地、财政和金融“三位一体”的发展模式。\n  在这种模式下发展出来的轰轰烈烈的城市化实际上是以土地而非以产业和人口为中心的城市化,我将其称为“土地城市化”。这种“土地城市化”的发展模式有以下几个主要特点:\n  第一,土地城市化不以工业化为必然前提。…..各种房地产泡沫的形成正是财政和金融推动的一个结果。支撑城市发展和扩张的基础正在由工业变为城市的房地产开发。……在这个模式中,工业对于城市化的基础地位已经逐渐城市房地产业所替代了。\n  第二,土地城市化不以人口城市化为必要条件。…..城市化发展到目前为止,这些劳动力仍然是没有城市户籍和市民身份的“农民工”,其家庭成员仍然居住在中西部地区的广大农村,这种城市化可以称其为“人口不落地”的“半城市化”,不但造就了收入差别巨大、社会地位悬殊的城市中二元的社会群体(城市居民和“农民工”),产生了上亿的流动人口,也割裂了这些群体的家庭,农民工常年与其父母甚至子女分离长此以往,会出现许多新的社会问题。  第三,土地城市化只需要三大要素的参与即可运转:即土地与财政、金融的结合。….\n  引自 第十四章 土地金融和城市化:“三位一体”的发展模式\n\n思考最近在思考房地产相关的问题:成都房产泡沫会破嘛?成都的支柱产业起来了嘛?成都支柱产业能抵抗房产泡沫嘛?\n偶然间在论坛中看到了这本书。\n书的大意为:以财政的视角讨论国内乡镇、城市的发展变迁。大体可总结为国内城市发展首选土地财政,而偏废工业。\n导致的问题有两个,\n\n农村空心空壳化。(中央采用扶贫的方式缓解了该问题)\n房产泡沫严重,工业发展被忽视;(如昆明之类的城市,没有工业产业支柱,就大肆扩张城市。而外来人口减少导致城市扩张、工业发展停滞)\n\n书中的观点也与我对国内城市的感受很一致:外表光鲜,但底蕴却落后于外表。\n但就成都而言,个人猜测目前成都人口应该是能够支撑到支柱产业发展起来,抵消掉一小部分房产泡沫的影响。\n另外乡村未来不知几何。\n","categories":["杂谈"],"tags":["杂谈"]},{"title":"《公司的力量》 观后感","url":"/2022/08/21/%E3%80%8A%E5%85%AC%E5%8F%B8%E7%9A%84%E5%8A%9B%E9%87%8F%E3%80%8B-%E8%A7%82%E5%90%8E%E6%84%9F/","content":"\n语录\n\n几个年轻人可以依靠一个新奇的想法开一家公司,一个普通人可以为了自己坚信的东西不断努力,最后开创了自己的帝国,被全世界所知;看似是神话,但确实发生了。\n\n\n尽其能事,移山可也,填海可也,驱驾风电,制御水火,亦可也;西洋诸国,所以横绝四海,莫之能御者,岂不以此也哉。\n公司不举,则工商业无一能振;工商业不举,则中国终不能富,不能强。—清欧洲公使,薛福成\n\n\n\n在一股脑的看完这部纪录片后,给我留下了深深的震撼,才发现自己对现在的公司知之甚少,我以前从来没有想过公司的发展和诞生。\n公司的目的公司的目的也是公司股东的目的–赚钱,越来越多的钱。\n为此,公司需要不断得去探索去追求,去试探。虽然也造成了一些悲剧,但是正是欲望的贪婪,造就了现在的世界。\n公司的管理公司的管理者是股东的雇员,他们拿着股东的工资,听命于股东,受命来管理经营公司,为公司的经营和业务负责。\n小股东在公司上市后,公司就可以通过股市进行融资,称为股权融资,而要通过股市融资,需要一些手续和流程,就目前而言,国内的证监会并不适合互联网公司、企业。\n股票是公司的大股东从自己的股权里抽出一部分变做股票,而普通股民通过买该公司发行的股票成为该公司的小股东,小股东不能参与公司的决策,但能在公司赚钱后得到相应的分红,可以说这是一种公司和社会实现双赢的机制。\n公司的人员结构公司分为股东和管理层,股东即在公司开办时投入资金的人,他不需要有管理公司的能力、开发产品的技术;股东按投入资金比例获得分红和对公司债务负责。\n公司在法律上就是一个独立的法人,即打官司时公司即可是原告被告,罚款也是对公司罚款,不对公司个人。\n\n如甲投资了一家公司,这家公司注册资金是100万,他投了30万,那么在公司赚了100块时,他之能分30%,公司赔了100块,他也只需要赔30%;\n\n公司的创造公司的结构决定了公司可以延续上百年,远远超越了人的寿命;而现实中上百年的公司也非常多,他们是依靠的什么?\n个人认为是依靠创造。找到别人的需求,没有需求就创造需求,一边改变着人们的想法、习惯,一边获得利润。\n公司的零件公司苦恼一件事,它只需一双手,一双腿,一个点子,但它却不得不雇佣一个工人,一个销售,一个顾问。\n公司离不开零件,离不开工人销售顾问,但在不断找办法替换零件,希望找到零件更省成本的办法。\n\n公司的未来公司模式的运行逻辑:投入金钱/劳动-&gt;创造价值-&gt;获取报酬。其中的奖励为金钱以及附带的个人成就感。\n公司模式能顺利运行依靠的是:1.人是群居社会动物,能被组织起来 2.人有欲望,金钱能实现大部分欲望。 \n个人脑洞下,当 世界放弃货币交易 / 个体极其独立开始脱离群体 / 欲望很容易满足或者难以满足,公司或许会变成另一种样貌甚至消失;在此之前,公司这种模式则会一直伴随人类文明。\n","categories":["杂谈"]},{"title":"《公司的力量》第一集观后感","url":"/2022/08/21/%E3%80%8A%E5%85%AC%E5%8F%B8%E7%9A%84%E5%8A%9B%E9%87%8F%E3%80%8B%E7%AC%AC%E4%B8%80%E9%9B%86%E8%A7%82%E5%90%8E%E6%84%9F/","content":"在学习《公司金融学》课程时,老师留下了课后学习资料就是《公司的力量》第二集,闲的无事便从第一集开始看,目前也只看了第一集。感觉受益良多,扩展了自己的一些想法,便在这里记录下来。\n最大的想法就是原来欧洲是这样发展起来的!!\n起因很久以前就在思考为啥欧洲在我国还是明朝之前都不是很厉害,可到了明清后就开始变得越来越厉害了,甚至出现了占领全球的地步,还出现了盛极一时的日不落帝国。\n而这一切我认为来自一场疾病–鼠疫(黑死病)\n之前了解了鼠疫对人类的影响,主要是对欧洲的影响。鼠疫在欧洲被称为黑死病,是因为耶尔森病菌(鼠疫的致病菌)通过呼吸道传播后,会在极短的时间内大量繁殖破坏人体器官最终导致败血症,就会在人体皮肤表面留下一个个黑色的圆圈状图案,因此被称为黑死病.\n而黑死病因为人传人的特点,在欧洲贸易盛行的地方,导致了黑死病在好几百年内不断地肆虐着欧洲,甚至有种说法说1347年在西西里群岛爆发后,在3年内横扫欧洲,并在20年间导致2500万即相当于一半欧洲人的死亡。这也间接地影响了欧洲人对世界的看法\n\n当时的欧洲因为贸易盛行,人们往往是毫无规划地聚集在一个地方,随着时间发展这个地方就成了贸易中心,但是人们的卫生意识极差,甚至有记载人们会把大小便从窗户倒往街道,这也导致了老鼠蟑螂盛行,并且跟着人类到处繁衍,而在黑死病肆虐后,因为科技和不知道病因的情况下,黑死病也一直在跟随着逃亡的人群,同时当时的医学和宗教都没能给恐惧的人们带来安慰和救赎,因此宗教受到了人们的质疑,最后也不得不破例开始解剖尸体研究到底是因为什么。\n\n当人们不再坚定地信仰上帝,一些教条也变得不重要起来,人们开始变得享受生活和人生,毕竟谁知道哪天自己就得黑死病死了呢?而在病情肆虐的20年内上帝从来没有拯救过人类,于是文艺开始复兴。这就是欧洲兴荣的开始。\n发展这部分在《公司的力量》第一集中有说明,公司作为一种全新的模式或者说制度在那个时代诞生,上层人士(贵族)能放下身份和底层人士合作共同经营公司,这样的事可以谈的上伟大和划时代的。\n\n公司的结构是股东(出钱开办公司,没有经营公司的专业能力)聘请管理层(有挣钱的能力却没钱)来经营公司,为公司盈利。如爱迪生的电灯,爱迪生只负责研究怎么样让电灯更亮更稳定,并给贵族安装,而他的股东负责出钱提供研究的费用和宣传。可以说正是这样的公司越来越多才使得欧洲的创造力被激发,财富也如滚雪球一般。这也使得越来越多的人开办公司\n\n个人想法正如片中说的,公司代表了人类原始的贪欲,虽然激发了人类的创造力,并且在短短几百年里让我们的世界天翻地覆,可是这台名为‘公司’的机器也无比的冰冷,它生于灾难,我们研究了解它,便是为了防止它再次创造灾难。\n借用片中结语能看到多远的过去,就能看到多远的未来\n\nps:对于鼠疫肆虐欧洲的起因,有学者认为是来自蒙古人为了抢夺卡法良好的贸易,对其围攻了三年却一无所获,而一直都在鼠疫的跟随下,蒙古军队人员死亡严重,最后蒙古军队决定把因鼠疫而死满身黑泡的人的尸体,用投石机抛进了卡法城内。在黑死病肆虐了很久之后却突然消失,有人认为是因为人死得差不多了,加上长期的恐慌,人们都不敢和其他人接触,这样就阻隔了疾病传播的主要渠道,加之耶尔森病菌虽然繁殖快,但是在空气中也存活不了多久,所以这被认为是其突然消失的原因之一\n","categories":["杂谈"],"tags":["公司的力量"]},{"title":"【项目管理的逻辑】","url":"/2022/10/31/%E3%80%90%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86%E7%9A%84%E9%80%BB%E8%BE%91%E3%80%91/","content":"简介来源:【项目管理的逻辑】清华大学(全6讲)杨述 精品课程!|b站\n作者:杨述\n转载:复利的奇迹ETF基金理财|b站\n杨述 老师 \n清华大学国际工程项目管理研究院主任,主编,企业家俱乐部秘书长, 多年来从事项目管理课题开发、培训及PMP试题分析和研究工作,为企业培养了大批项目管理实战人才。 \n不仅剖析PMBOK的知识框架和内容,更能将理论运用于实践。\n\n","categories":["项目管理"],"tags":["项目管理"]},{"title":"一场失眠的胡思乱想","url":"/2021/03/07/%E4%B8%80%E5%9C%BA%E5%A4%B1%E7%9C%A0%E7%9A%84%E8%83%A1%E6%80%9D%E4%B9%B1%E6%83%B3/","content":"失眠了,,,,外面下着小雨,我躲在被窝里,想着星空。\n都说即使在阴沟也要抬头望着星空,就是不知道星空是否也在低头望着我?\n","categories":["生活"]},{"title":"一场梦","url":"/2022/05/16/%E4%B8%80%E5%9C%BA%E6%A2%A6/","content":"近来家人患病,母亲手术,祖父腿疾,幸无大碍。\n正值立夏,阳光明媚,天少有的漂着一片一片的云;\n\n\n \n 孔乙一 五一 家乡随手\n \n\n\n回程途中,工作群不停的喧闹着,伴随着汽车引擎声,被窗外的景色一并化解。\n\n\n\n 回罗马当骡马途中随手\n \n\n\n不知道有多久没安心的享受下午阳光带来的倦意,和树荫下微风带来的清凉,毫无防备的睡一下午了。\n\n回到出租屋外的小巷,斑驳光影落在街道上,卖西瓜的商贩,打牌喝茶,站着闲聊,真真切切的烟火气。\n忙忙碌碌,丢弃了每个人都能享受的下午时光\n得到了些什么?\n","categories":["生活"],"tags":["生活"]},{"title":"为Hexo博客添加脚注插件","url":"/2021/03/07/%E4%B8%BAHexo%E5%8D%9A%E5%AE%A2%E6%B7%BB%E5%8A%A0%E8%84%9A%E6%B3%A8%E6%8F%92%E4%BB%B6/","content":"hexo自带的插件npm install hexo-reference --save\n\n语法[^1][1][^1]:内容\n\n〔如用了pm2来管理hexo server,需要完全关闭进程后再运行,才能生效〕\n其他来源:大专栏|为Hexo博客添加脚注插件\n注意: 文中涉及的markdown插件需要单独安装\nplugins: - markdown-it-abbr - markdown-it-footnote - markdown-it-ins - markdown-it-sub - markdown-it-sup\n上面的所有插件都要安装npm i markdown-it-abbr markdown-it-footnote markdown-it-ins markdown-it-sub markdown-it-sup --save之后重启服务器即可生效\n注:以上的插件,都对base64支持不够,会导致页面不能正确的加载base64图片\n1.该插件为hexo原生的脚注插件,不需要任何配置,安装重启服务器即可用 ↩","categories":["Hexo"]},{"title":"phpstorm配置ftp自动同步到远程服务器","url":"/2021/03/12/%E4%BD%BF%E7%94%A8phpstorm%E5%B0%86%E6%9C%AC%E5%9C%B0%E4%BB%A3%E7%A0%81%E5%AE%9E%E6%97%B6%E8%87%AA%E5%8A%A8%E5%90%8C%E6%AD%A5%E5%88%B0%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8/","content":"\n来源:使用phpstorm将本地代码实时自动同步到远程服务器作者:TXXT|博客园\n\n平常在维护网站的时候,经常遇到网站代码需要修改的地方,一般情况下就是先使用FTP传输传输到本地然后修改完毕再上传,或者你使用宝塔面板或者windows服务器也可以直接在服务器上编辑代码,这样的操作如果是小小的改动一下是没问题很简单,但是如果修改的地方很麻烦,需要不断调试,那么这简直就是一种折磨,所以你就要想一个更省事的办法了,今天主机笔记就为大家介绍使用JetBrains家的phpstorm实现远程编码,本地编辑实时自动同步到远程web服务器。\n本地连接配置web服务器要实现远程编码,首先我们要把我们本地的webstom项目连接到服务器,最好的方法就是使用FTP连接我们的网站或者项目\n在webstom编辑器依次选择 Tools – Deployment – Configuration,添加一个远程主机,这个名字只是备注用,随便写,协议选择FTP(也支持SFTP、本地等)\n\n\n这个时候就是主要就是填写远程主机的FTP信息了,除了基本的FTP信息填写完毕外,其他需要修改的我在图上用箭头标出\nRoot path 这个选项是要打开的路径,这样做主要是为了防止误操作影响项目,填写后上级目录不会展示,当然你可以不写\nAdvanced options 这个选项是设置 Passive mode 设置FTP连接模式为被动模式\nWeb server root URL 这里就是调试的网址\n当所有的信息确认无误后,点击一下 Test FTP connection,测试是否连接成功\n\n最后,我们再调整一下本地和远程主机的映射即可,如果要添加了多个远程主机的话,记得把要使用的项目点击一下 Use this server as default\n远程主机配置好后我们就可以看一下目录结构了,点击 Tools – Deployment – Broswse Remote Host,然后就会看到远程的文件了\n这个时候其实我们本地还没有文件,要把远程的项目下载到本地,在远程主机上右键 – Download from here即可,稍等一会下载完毕,本地项目即可显示\n设置代码自动同步到远程服务器在前面我们已经把本地文件和远程文件对接上了,但是这时候要实现同步还是要手动传输的,距离实现自动化还差一点点\n打开 Tools – Deployment – Options,我们把Upload changed files 一项改为 On explicit save action,意思也就是每次保存都会同步到远程服务器\n\n到这里,基本设置完毕,可以看到我下面的测试,完全是在本地操作,自动在服务器创建新的文件,而且本地每保存一次,就会自动的传输到服务器并记录日志\n\n\n可能遇到的问题测试连接成功,但是却始终无法上传,在配置界面出现如下提示:Automatic upload will not work,because default server&#39;蓝轩小程序”has no valid mappings.\n\n\n参考:Default server mservice has no valid mappings. Automatic upload is not enabled\n","categories":["杂谈"]},{"title":"使用tp/queue::later时的奇妙问题","url":"/2021/06/09/%E4%BD%BF%E7%94%A8tp-queue-later%E9%81%87%E5%88%B0%E7%9A%84%E5%A5%87%E5%A6%99bug/","content":"配置\nphp 7.19\nthinkphp 5\nfastadmin 2.0\ntopthink/think-queue 1.1.6\n\n问题在弄项目时,遇到一个神奇的问题,明明sql语句没有问题,调试运行都没有问题,但是在程序完整执行后,数据库并没有变化。\n解决因为sql语句是写在事务闭包内的,本以为是事务导致的。但是逐句排查后,发现是queque队列执行了【设定的取消程序】导致的。\n$close_minue = 1440;\\think\\Queue::later(($close_minue * 60), &#x27;\\addons\\shopro\\job\\OrderAutoOper@autoClose&#x27;, [&#x27;order&#x27; =&gt; $order], &#x27;shopro&#x27;);\n\n上述代码,目的是一天后用户没有支付,则自动关闭订单,写法没有错误。\n但是因为queue设置里为Sync选项,默认同步执行,\nclass Sync extends Connector&#123; public function later($delay, $job, $data = &#x27;&#x27;, $queue = null) &#123; return $this-&gt;push($job, $data, $queue); &#125;\n\n可见,sync同步队列里并没有使用设定的时间,自然不会延时执行。这可真是同步啊!!\n之后修改队列默认设置,保存,问题解决。\n\n其他资料\n\n官方手册\nthink-queue详细介绍与使用|简书\n\n"},{"title":"念想","url":"/2021/06/30/%E4%BF%A1%E4%BB%B0/","content":"总得有个念想。\n才不至于浑浑噩噩,能靠着这点念想给的安全感睡下。\n","categories":["生活"]},{"title":"利用cmd命令进行ftp文件上传和下载","url":"/2021/03/19/%E5%88%A9%E7%94%A8cmd%E5%91%BD%E4%BB%A4%E8%BF%9B%E8%A1%8Cftp%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E5%92%8C%E4%B8%8B%E8%BD%BD/","content":"\n心血来潮试了下 cmd 下的 ftp,用着难受,确实没有 Linux 中的 pscp 好用。\n\nWin + R 输入cmd,进入命令行\n#连接C:\\&gt; ftp www.xxxx.com [ip也可以]#之后输入用户名和密码即可\n\nftp在cmd下常用命令\n\ncmd下 ftp 不能上传下载文件夹\n\n\n\n\nftp\n服务器地址 登陆ftp\n\n\n\npwd\n检查ftp当前目录\n\n\ndir\n显示远程主机目录\n\n\ncd remote-dir\n进入远程主机目录\n\n\nhelp[cmd]\n显示ftp内部命令cmd的帮助信息,如:help get\n\n\nget remote-file[local-file]\n将远程主机的单个文件remote-file传至本地硬盘的local-file(本地文件夹)\n\n\nmget remote-file[local-file]\n可以通过 * 将远程主机的多个文件remote-file传至本地硬盘的local-file(本地文件夹)如:mget * 下载所有文件和文件夹到本地,mget *.txt 下载以.txt 结尾的文件到本地\n\n\nput local-file[remote-file]\n将本地单个文件local-file传送至远程主机\n\n\nmput remote-file[local-file]\n可以通过 * 将本地单个文件local-file传送至远程主机。如:mget * 上传本地该目录下所有文件和文件夹到远程主机,mput *.txt 上传以.txt 结尾的文件到本地\n\n\ndelete remote-file\n删除远程主机单个文件\n\n\nmdelete remote-file\n可以通过 * 删除远程主机多个文件。如mdelete *.txt 删除空间下所有以.txt 结尾的文件,mdelete * 删除所有文件。\n\n\nclose\n注销\n\n\nquit\n同bye,退出ftp会话\n\n\n\n参考资料:\n\nWindows下利用cmd命令进行ftp文件上传和下载(附常用命令)\n\n","categories":["杂谈"]},{"title":"双屏变单屏后,界面显示问题","url":"/2022/08/23/%E5%8F%8C%E5%B1%8F%E5%8F%98%E5%8D%95%E5%B1%8F%E5%90%8E%EF%BC%8C%E7%95%8C%E9%9D%A2%E6%98%BE%E7%A4%BA%E9%97%AE%E9%A2%98/","content":"电脑连了显示器后,去掉显示器后电脑变成单屏,一些软件不在屏幕中显示。\n解决办法如下:\n方法一:可以获取焦点\n可以获取焦点:任务栏点击软件,会在桌面显示,但是软件顶部超过了窗口,无法点击移动\n\n\n\n点击软件界面\nwin+方向键;\n\n\n方法二:无法获取焦点\n无法获取焦点:任务栏点击软件,不会在桌面显示,即使关闭软件重启后,问题依旧存在多见于win10;\n\n\n启动软件,点击状态栏软件图标,让软件拥有焦点。\n按住 Alt + 空格,然后按 M (移动软件界面)。\n按一下方向键,比如左。\n按住鼠标左键,移动鼠标。\n\n","categories":["Windows"]},{"title":"将commit内容reset到另一个分支提交","url":"/2021/07/23/%E5%B0%86commit%E5%86%85%E5%AE%B9reset%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%88%86%E6%94%AF%E6%8F%90%E4%BA%A4/","content":" 使用的指令 git cherry-pick &lt;commit id&gt;\n git loggit checkout branch-name //切换到需要提交的分支git status //检查项目状态git cherry-pick &lt;commit id&gt; // 对已经存在的commit进行apply (可以理解为再次提交)\n\n更多见git-cherry-pick\n\n","categories":["Git"],"tags":["Git"]},{"title":"小程序统一消息接口遇坑","url":"/2021/04/27/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%BB%9F%E4%B8%80%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E9%81%87%E5%9D%91/","content":"\n参考:微信小程序的统一服务消息 uniformMessage.send微信统一消息接口手册:uniformMessage.send\n\n\n注意:\n\n小程序每次推送消息,都必须获得用户同意才会推送,如果没有弹窗提示让用户同意,则默认用户不同意\n公众号推送消息,需要用户关注过该公众号\n统一消息接口有点坑\n\n\n$list = [ &#x27;touser&#x27;=&gt; $data_2[&#x27;openid&#x27;],//用户openid &#x27;weapp_template_msg&#x27;=&gt;[], //小程序消息模板 为空即可,否则会提示api支持 // &#x27;weapp_template_msg&#x27;=&gt;[//小程序消息模板 // &#x27;template_id&#x27;=&gt;$data[&#x27;template_id&#x27;], // &#x27;page&#x27;=&gt;$data_2[&#x27;page&#x27;], // &#x27;form_id&#x27;=&gt;$data[&#x27;template_id&#x27;], // &#x27;data&#x27;=&gt;$data_2[&#x27;data&#x27;], // ], &#x27;mp_template_msg&#x27;=&gt;[//公众号消息模板 &#x27;appid&#x27;=&gt;&#x27;wxb74bbd0e43f82f&#x27;, &#x27;template_id&#x27;=&gt;$data[&#x27;template_id&#x27;], &#x27;url&#x27;=&gt;&#x27;&#x27;, &#x27;miniprogram&#x27;=&gt;[ //&#x27;appid&#x27;=&gt;&#x27;gh_13c04895&#x27;, //不要填写 appid,否则会报 ‘errcode:40013,errmsg:invalid appid’的错 &#x27;appid&#x27;=&gt;&#x27;&#x27;, &#x27;pagepath&#x27;=&gt;$data_2[&#x27;page&#x27;], ], &#x27;data&#x27;=&gt;[ &#x27;first&#x27;=&gt;[&#x27;value&#x27;=&gt;&#x27;余额变动通知&#x27;], &#x27;keyword2&#x27;=&gt;$data_2[&#x27;data&#x27;][&#x27;amount3&#x27;],//变动金额 &#x27;keyword1&#x27;=&gt;$data_2[&#x27;data&#x27;][&#x27;thing2&#x27;], //资金类型 &#x27;keyword4&#x27;=&gt;$data_2[&#x27;data&#x27;][&#x27;amount4&#x27;],//当前余额 &#x27;keyword3&#x27;=&gt;$data_2[&#x27;data&#x27;][&#x27;time1&#x27;], //变动时间 &#x27;remark&#x27;=&gt;$data_2[&#x27;data&#x27;][&#x27;thing5&#x27;], //备注 ] ], ]; $result = (new \\addons\\shopro\\library\\Wechat(&#x27;wxMiniProgram&#x27;))-&gt;getApp()-&gt;uniform_message-&gt;send($list); //var_dump($result);//var_dump($list);array(3) &#123; [&quot;touser&quot;]=&gt; string(28) &quot;oQJOs5inOXtiLQND5BqSJreM&quot; [&quot;weapp_template_msg&quot;]=&gt; array(0) &#123; &#125; [&quot;mp_template_msg&quot;]=&gt; array(5) &#123; [&quot;appid&quot;]=&gt; string(18) &quot;wxb74bbd0e43f82f&quot; [&quot;template_id&quot;]=&gt; string(43) &quot;wFhwFh0R8I4jGy7jGgWlVtxJvMM59WvE1VahS2c&quot; [&quot;url&quot;]=&gt; string(0) &quot;&quot; [&quot;miniprogram&quot;]=&gt; array(2) &#123; [&quot;appid&quot;]=&gt; string(0) &quot;&quot; [&quot;pagepath&quot;]=&gt; string(53) &quot;pages/index/index?page=%2Fpages%2Fuser%2Fwallet%2Flog&quot; &#125; [&quot;data&quot;]=&gt; array(6) &#123; [&quot;first&quot;]=&gt; array(1) &#123; [&quot;value&quot;]=&gt; string(18) &quot;余额变动通知&quot; &#125; [&quot;keyword2&quot;]=&gt; array(1) &#123; [&quot;value&quot;]=&gt; string(6) &quot;100.00&quot; &#125; [&quot;keyword1&quot;]=&gt; array(1) &#123; [&quot;value&quot;]=&gt; string(12) &quot;后台充值&quot; &#125; [&quot;keyword4&quot;]=&gt; array(1) &#123; [&quot;value&quot;]=&gt; string(8) &quot;11601.00&quot; &#125; [&quot;keyword3&quot;]=&gt; array(1) &#123; [&quot;value&quot;]=&gt; string(19) &quot;2021-04-27 14:19:47&quot; &#125; [&quot;remark&quot;]=&gt; array(1) &#123; [&quot;value&quot;]=&gt; string(1) &quot;-&quot; &#125; &#125; &#125; &#125;\n\n注意:\n\n在官方示例中,$list[&#39;weapp_template_msg&#39;],中填写了信息的,但是测试的时候,$list[&#39;weapp_template_msg&#39;]如果有参数,则会提示\n&#123; [&quot;errcode&quot;]=&gt; int(45103) [&quot;errmsg&quot;]=&gt; string(61) &quot;This API has been unsupported&quot; &#125; 因此,$list[&#39;weapp_template_msg&#39;]=[]即可\n\n\n$list[&#39;mp_template_msg&#39;][&#39;miniprogram&#39;][&#39;appid&#39;],也最好为空,或者不写该参数,否则会返回\n &#123; [&quot;errcode&quot;]=&gt; int(40013) [&quot;errmsg&quot;]=&gt; string(45) &quot;invalid appid&quot; &#125; 说是appid不匹配,不填该参数,依旧能在推送的微信公众号的提示内容中进入小程序。\n\n\n\n","categories":["微信"]},{"title":"缺少 「secure」 cookie 已拒绝 “ci-session”","url":"/2021/03/07/%E5%B0%91-%E3%80%8Csecure%E3%80%8D-cookie-%E5%B7%B2%E6%8B%92%E7%BB%9D-%E2%80%9Cci-session%E2%80%9D/","content":"问题缺少 「secure」属性, cookie 已拒绝 “ci-session”\n最近在做公司的一个抽奖活动项目,由于是手机端,所以没有设置cookie的保存时间,即默认cookie为临时会话,当用户关闭浏览器或者关闭网页cookie就会过期。\n但是在测试时,明明没有关闭网页和浏览器,刚刚登陆过一会就又跳转到登陆页面,查看浏览器控制台,显示上面的信息。ci-session 为后台设置的cookie_name\n解决在 cookie 设置中,将$config[&#39;cookie_secure&#39;]的值改为TRUE,问题解决\n\n相关资料:\n\nCookie 的 SameSite 属性 |CSDN 我依旧满足于那么的不自信\n\n","categories":["cookie"]},{"title":"常用 Git 命令清单","url":"/2021/03/09/%E5%B8%B8%E7%94%A8-Git-%E5%91%BD%E4%BB%A4%E6%B8%85%E5%8D%95/","content":"\n来源:常用 Git 命令清单作者:阮一峰\n\n我每天使用 Git ,但是很多命令记不住。\n一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐怕要记住60~100个命令。\n\n下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。\n\n\nWorkspace:工作区\nIndex / Stage:暂存区\nRepository:仓库区(或本地仓库)\nRemote:远程仓库\n\n\n一、新建代码库# 在当前目录新建一个Git代码库$ git init# 新建一个目录,将其初始化为Git代码库$ git init [project-name]# 下载一个项目和它的整个代码历史$ git clone [url]\n\n二、配置Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。\n# 显示当前的Git配置$ git config --list# 编辑Git配置文件$ git config -e [--global]# 设置提交代码时的用户信息$ git config [--global] user.name &quot;[name]&quot;$ git config [--global] user.email &quot;[email address]&quot;\n\n三、增加/删除文件# 添加指定文件到暂存区$ git add [file1] [file2] ...# 添加指定目录到暂存区,包括子目录$ git add [dir]# 添加当前目录的所有文件到暂存区$ git add .# 添加每个变化前,都会要求确认# 对于同一个文件的多处变化,可以实现分次提交$ git add -p# 删除工作区文件,并且将这次删除放入暂存区$ git rm [file1] [file2] ...# 停止追踪指定文件,但该文件会保留在工作区$ git rm --cached [file]# 改名文件,并且将这个改名放入暂存区$ git mv [file-original] [file-renamed]\n\n四、代码提交# 提交暂存区到仓库区$ git commit -m [message]# 提交暂存区的指定文件到仓库区$ git commit [file1] [file2] ... -m [message]# 提交工作区自上次commit之后的变化,直接到仓库区$ git commit -a# 提交时显示所有diff信息$ git commit -v# 使用一次新的commit,替代上一次提交# 如果代码没有任何新变化,则用来改写上一次commit的提交信息$ git commit --amend -m [message]# 重做上一次commit,并包括指定文件的新变化$ git commit --amend [file1] [file2] ...\n\n五、分支# 列出所有本地分支$ git branch# 列出所有远程分支$ git branch -r# 列出所有本地分支和远程分支$ git branch -a# 新建一个分支,但依然停留在当前分支$ git branch [branch-name]# 新建一个分支,并切换到该分支$ git checkout -b [branch]# 新建一个分支,指向指定commit$ git branch [branch] [commit]# 新建一个分支,与指定的远程分支建立追踪关系$ git branch --track [branch] [remote-branch]# 切换到指定分支,并更新工作区$ git checkout [branch-name]# 切换到上一个分支$ git checkout -# 建立追踪关系,在现有分支与指定的远程分支之间$ git branch --set-upstream [branch] [remote-branch]# 合并指定分支到当前分支$ git merge [branch]# 选择一个commit,合并进当前分支$ git cherry-pick [commit]# 删除分支$ git branch -d [branch-name]# 删除远程分支$ git push origin --delete [branch-name]$ git branch -dr [remote/branch]\n\n六、标签# 列出所有tag$ git tag# 新建一个tag在当前commit$ git tag [tag]# 新建一个tag在指定commit$ git tag [tag] [commit]# 删除本地tag$ git tag -d [tag]# 删除远程tag$ git push origin :refs/tags/[tagName]# 查看tag信息$ git show [tag]# 提交指定tag$ git push [remote] [tag]# 提交所有tag$ git push [remote] --tags# 新建一个分支,指向某个tag$ git checkout -b [branch] [tag]\n\n七、查看信息# 显示有变更的文件$ git status# 显示当前分支的版本历史$ git log# 显示commit历史,以及每次commit发生变更的文件$ git log --stat# 搜索提交历史,根据关键词$ git log -S [keyword]# 显示某个commit之后的所有变动,每个commit占据一行$ git log [tag] HEAD --pretty=format:%s# 显示某个commit之后的所有变动,其&quot;提交说明&quot;必须符合搜索条件$ git log [tag] HEAD --grep feature# 显示某个文件的版本历史,包括文件改名$ git log --follow [file]$ git whatchanged [file]# 显示指定文件相关的每一次diff$ git log -p [file]# 显示过去5次提交$ git log -5 --pretty --oneline# 显示所有提交过的用户,按提交次数排序$ git shortlog -sn# 显示指定文件是什么人在什么时间修改过$ git blame [file]# 显示暂存区和工作区的差异$ git diff# 显示暂存区和上一个commit的差异$ git diff --cached [file]# 显示工作区与当前分支最新commit之间的差异$ git diff HEAD# 显示两次提交之间的差异$ git diff [first-branch]...[second-branch]# 显示今天你写了多少行代码$ git diff --shortstat &quot;@&#123;0 day ago&#125;&quot;# 显示某次提交的元数据和内容变化$ git show [commit]# 显示某次提交发生变化的文件$ git show --name-only [commit]# 显示某次提交时,某个文件的内容$ git show [commit]:[filename]# 显示当前分支的最近几次提交$ git reflog\n\n八、远程同步# 下载远程仓库的所有变动$ git fetch [remote]# 显示所有远程仓库$ git remote -v# 显示某个远程仓库的信息$ git remote show [remote]# 增加一个新的远程仓库,并命名$ git remote add [shortname] [url]# 取回远程仓库的变化,并与本地分支合并$ git pull [remote] [branch]# 上传本地指定分支到远程仓库$ git push [remote] [branch]# 强行推送当前分支到远程仓库,即使有冲突$ git push [remote] --force# 推送所有分支到远程仓库$ git push [remote] --all\n\n九、撤销# 恢复暂存区的指定文件到工作区$ git checkout [file]# 恢复某个commit的指定文件到暂存区和工作区$ git checkout [commit] [file]# 恢复暂存区的所有文件到工作区$ git checkout .# 恢复某个commit到新建分支$ git checkout -b [branchName] [commit]# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变$ git reset [file]# 重置暂存区与工作区,与上一次commit保持一致$ git reset --hard# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变$ git reset [commit]# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致$ git reset --hard [commit]# 重置当前HEAD为指定commit,但保持暂存区和工作区不变$ git reset --keep [commit]# 新建一个commit,用来撤销指定commit# 后者的所有变化都将被前者抵消,并且应用到当前分支$ git revert [commit]# 暂时将未提交的变化移除,稍后再移入$ git stash$ git stash pop\n\n十、其他# 生成一个可供发布的压缩包$ git archive\n\n十一、藏入git栈\n注:stash内容只存于本地,并不会同步到远端\n\n# 将未提交的内容放入存储,并添加备注 # 新增的文件,并不会被存储$ git stash save [message]# 将未提交的内容放入存储,用上一提交信息作为备注,查找时不方便识别# 新增的文件,并不会被存储$ git stash# 查看存储列表$ git stash list# 显示简略改动信息,默认显示第一个存储$ git stash show$ git stash show stash@&#123;num&#125;# 显示详细的文件改动,默认显示第一个存储$ git stash show -p$ git stash show stash@&#123;num&#125; -p# 恢复某个存储,并在列表中删除该条目,默认为第一个stash$ git stash pop$ git stash pop stash@&#123;num&#125;# 恢复某个存储,但不会在列表中删除该条目,默认使用第一个存储$ git stash apply$ git stash apply stash@&#123;num&#125;# 丢弃某个存储,从列表中删除这个存储$ git stash drop stash@&#123;num&#125; # 删除所有的存储$ git stash clear\n\n(完)\n","categories":["Git"]},{"title":"平凡的世界","url":"/2022/04/11/%E5%B9%B3%E5%87%A1%E7%9A%84%E4%B8%96%E7%95%8C/","content":"《平凡的世界》\n还没看完,但心里五味杂陈。\n想起知乎一个提问:早期那些大牛离开知乎去了哪里?其中一个回答:他们哪里也没去,就在你每天路过人群中擦肩而过,只是没再来知乎了。初不解,觉得世事总会变好,总会有最优解。\n现在才慢慢接受你我皆常人俗人庸人;做好自己已属不易,嘴上叫嚷着改变自己改变社会改变世界,最终也不过为了一口饱饭养家糊口而已;\n事情不常按预想发展,总会变成各种模样。\n平凡的世界,平凡的你我。\n","categories":["生活"],"tags":["生活"]},{"title":"建立局域网git仓库","url":"/2021/03/07/%E5%BB%BA%E7%AB%8B%E5%B1%80%E5%9F%9F%E7%BD%91git%E4%BB%93%E5%BA%93/","content":"建立本地git仓库并共享\n新建一个文件夹,路径不要太长,最好是硬盘下的一级文件夹\n使用git init --bare建立一个仓库,该指令表示建立一个 独立的仓库 使用git init –bare建立一个本地裸仓库\n共享该目录,添加guest访客并给予读写权限\n右键该目录-&gt;属性-&gt;共享-&gt;高级共享,勾选共享此文件夹\n点击权限-&gt;给Everyone完全控制的权限-&gt;点击确定-&gt;点击应用来自anlondon博客来自anlondon博客 \n\n\n进入一个本地的项目,并且提交到本地仓库中 来自anlondon博客\n使用ipconfig查看本机的局域网ip,格式为 192.168.0.xxx\n\n在局域网的另一台电脑上拉取项目\n进入网络,可以看到共享的仓库 来自anlondon博客\ngit clone //192.168.0.xxx/test.git或者git pull //192.168.0.xxx来拉取项目 来自anlondon博客\n\n","categories":["Git"]},{"title":"当前页面的URL未注册","url":"/2023/01/10/%E5%BD%93%E5%89%8D%E9%A1%B5%E9%9D%A2%E7%9A%84URL%E6%9C%AA%E6%B3%A8%E5%86%8C/","content":"前言某项目公众号支付时,显示当前页面的URL未注册的提示。\n\n原因根据微信支付社区人员解答,是因为设置的支付地址(支付授权目录)与实际支付地址不一致导致的报错。\n而微信对于支付授权目录校验规则有两种规则\n\n顶级域名\n\n支付授权目录设置为顶级域名(例如:https://www.weixin.com/ ),那么只校验顶级域名,不校验后缀;\n\n\n路径全匹配\n\n支付授权目录设置为多级目录,就会进行全匹配\n例如设置支付授权目录为https://www.weixin.com/abc/123/\n则实际请求页面目录不能为https://www.weixin.com/abc/,也不能为https://www.weixin.com/abc/123/pay/;\n必须为https://www.weixin.com/abc/123/\n\n\n\n解决如上,登录微信商家端,在【微信支付商户平台—&gt;产品中心—&gt;开发配置】中。\n\n看到我是使用的 【顶级域名匹配】,仔细对比,发现是公众号中使用的http\n而支付授权目录设置的https。\n添加一个http的顶级域名后,问题解决。\n\n注:个人测试时,发现两种匹配规则只能选一种。\n我最开始使用的是https://mydomain.com\n而后公众号提示报错时,便又添加了http://mydomain.com/wap/pages/goods/payment/auth/全路径匹配。发现一直不起作用。\n遂改为http://mydomain.com/才生效。\n\n资料:\n\n公众号支付显示当前页面的URL未注册?\n\n","categories":["微信"],"tags":["微信"]},{"title":"微信8.0 浏览器不支持position:fixedFeb","url":"/2021/03/07/%E5%BE%AE%E4%BF%A18-0-%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8D%E6%94%AF%E6%8C%81position-fixedFeb/","content":"问题修改一个页面,需要用到 position:fixed ,但是该属性在 微信8.0 的浏览器中并不能正常生效\n解决有网友说,可以参考 IE6 中处理 position:fixed 不生效的处理方法。\nie6 垂直居中固定定位,代码如下:#center &#123; _position:absolute; _top:expression(eval(document.compatMode &amp;&amp; document.compatMode==&#x27;CSS1Compat&#x27;) ? documentElement.scrollTop + (document.documentElement.clientHeight-this.offsetHeight)/2 :/*IE6*/document.body.scrollTop + (document.body.clientHeight - this.clientHeight)/2);/*IE5 IE5.5*/&#125;*html&#123; background-image:url(about:blank); background-attachment:fixed; &#125;\n\nie6 底部固定定位,代码如下:#bottom &#123; _position: absolute; _bottom: auto; _top: expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)));&#125;*html&#123; background-image:url(about:blank); background-attachment:fixed; &#125;\n\nie6 头部固定定位,代码如下:#top &#123; _position: absolute; _bottom: auto; _top: expression(eval(document.documentElement.scrollTop));&#125;*html&#123; background-image:url(about:blank); background-attachment:fixed; &#125;\n\n\n相关资料:\n\n求助:有谁解决过微信内置浏览器不兼容浮动的\nIE6解决固定定位代码\n\n","categories":["HTML"]},{"title":"微信小程序客服配置","url":"/2021/07/06/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%AE%A2%E6%9C%8D%E9%85%8D%E7%BD%AE/","content":"前言# 建议各位先按底部的参考资料顺序查看,以便充分了解步骤以及设置要点\n配置:\n\nphp7.4\ntp5\neasyWechat\n\n部署一,验证token根据消息推送|token 验证的说明,在配置消息推送时,需要在对应的请求里添加操作\n$signature = $_GET[&quot;signature&quot;]; $timestamp = $_GET[&quot;timestamp&quot;]; $nonce = $_GET[&quot;nonce&quot;]; $tmpArr = array($this-&gt;Token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if($tmpStr == $signature) return true; else return false;\n\n后端完整代码\n&lt;?phpnamespace addons\\shopro\\controller;use addons\\shopro\\library\\Wechat as WechatLibrary;use think\\Request;/** * 微信小程序客服接口 */class WechatKefu extends Base&#123; protected $noNeedLogin = [&#x27;*&#x27;]; protected $noNeedRight = [&#x27;*&#x27;]; protected $app = null; protected $Token = null; protected $EncodingAESKey = null; // https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;appid=wx****&amp;secret=&#x27;***&#x27;; //替换成自己的小程序id和secret protected $get_accessToken_url = &#x27;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&#x27;; // 获取accessToken protected $send_message_url = &#x27;https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=&#x27;; // 发送消息给用户,用于用户联系客服时自动回复,不让微信服务器自动转发 public function __construct(Request $request = null) &#123; parent::__construct($request); $this-&gt;Token = config(&#x27;site.wechatKefuToken&#x27;); $this-&gt;EncodingAESKey = config(&#x27;site.wechatKefuEncodingAESKey&#x27;); $wechat = new WechatLibrary(&#x27;wxMiniProgram&#x27;); $this-&gt;app = $wechat-&gt;getApp(); &#125; /** * 微信小程序客服对接、处理消息回复 */ public function index()&#123; if (isset($_GET[&#x27;echostr&#x27;])) $this-&gt;valid(); else $this-&gt;responseMsg(); &#125; // 验证token时使用 配置小程序后台-&gt;开发-&gt;开发管理-&gt;开发设置-&gt;消息推送 private function valid()&#123; $echoStr = $_GET[&quot;echostr&quot;]; if($this-&gt;checkSignature())&#123; header(&#x27;content-type:text&#x27;); echo $echoStr; // 成功 exit; &#125;else&#123; exit(&#x27;fail! &#x27;.$echoStr.&#x27;+++&#x27;.$this-&gt;Token); // 失败 &#125; &#125; // 配置小程序-&gt;消息推送-&gt;token验证时启用 private function checkSignature()&#123; $signature = $_GET[&quot;signature&quot;]; $timestamp = $_GET[&quot;timestamp&quot;]; $nonce = $_GET[&quot;nonce&quot;]; $tmpArr = array($this-&gt;Token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if($tmpStr == $signature) return true; else return false; &#125; // 发送消息 private function responseMsg()&#123; $postStr = file_get_contents(&#x27;php://input&#x27;); if(empty($postStr) &amp;&amp; !is_string($postStr))&#123; echo &quot;&quot;; exit; &#125; //禁止引用外部xml实体 //libxml_disable_entity_loader(true); //$postObj = simplexml_load_string($postStr, &#x27;SimpleXMLElement&#x27;, LIBXML_NOCDATA); $postArr =json_decode($postStr,true); $fromUsername =$postArr[&#x27;FromUserName&#x27;]; //发送者openid $toUserName =$postArr[&#x27;ToUserName&#x27;]; //小程序id if(!empty($postArr[&#x27;MsgType&#x27;]) &amp;&amp;$postArr[&#x27;MsgType&#x27;] ==&#x27;text&#x27;)&#123;//文本消息 $textTpl =array( &quot;ToUserName&quot;=&gt;$fromUsername, &quot;FromUserName&quot;=&gt;$toUserName, &quot;CreateTime&quot;=&gt;$_SERVER[&#x27;REQUEST_TIME&#x27;], &quot;MsgType&quot;=&gt;&quot;transfer_customer_service&quot;, ); exit(json_encode($textTpl)); &#125;elseif(!empty($postArr[&#x27;MsgType&#x27;]) &amp;&amp;$postArr[&#x27;MsgType&#x27;] ==&#x27;image&#x27;)&#123;//图文消息 $textTpl =array( &quot;ToUserName&quot;=&gt;$fromUsername, &quot;FromUserName&quot;=&gt;$toUserName, &quot;CreateTime&quot;=&gt;$_SERVER[&#x27;REQUEST_TIME&#x27;], &quot;MsgType&quot;=&gt;&quot;transfer_customer_service&quot;, ); exit(json_encode($textTpl)); &#125;elseif($postArr[&#x27;MsgType&#x27;] ==&#x27;event&#x27; &amp;&amp;$postArr[&#x27;Event&#x27;]==&#x27;user_enter_tempsession&#x27;)&#123;//进入客服动作 $content =&#x27;您好,有什么能帮助你?&#x27;; $data=array( &quot;touser&quot;=&gt;$fromUsername, &quot;msgtype&quot;=&gt;&quot;text&quot;, &quot;text&quot;=&gt;array(&quot;content&quot;=&gt;$content) ); $json =json_encode($data,JSON_UNESCAPED_UNICODE); $this-&gt;requestAPI($json); &#125;else exit(&#x27;Error,未知类型会话&#x27;); &#125; // 发送消息到指定 private function requestAPI($json)&#123; $access_token = $this-&gt;get_accessToken(); $this-&gt;send_message_url = $this-&gt;send_message_url.$access_token; // 发送消息 POST发送https请求客服接口api //以&#x27;json&#x27;格式发送post的https请求 $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $this-&gt;send_message_url); curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($json)) curl_setopt($curl, CURLOPT_POSTFIELDS,$json); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //curl_setopt($curl, CURLOPT_HTTPHEADER, $headers ); $output = curl_exec($curl); if (curl_errno($curl)) echo &#x27;Errno&#x27;.curl_error($curl);//捕抓异常 curl_close($curl); if($output == 0) &#123; echo &#x27;success&#x27;; exit; &#125; &#125; // 调用微信api,获取access_token,有效期7200s private function get_accessToken()&#123; $url = $this-&gt;get_accessToken_url.&#x27;&amp;appid=&#x27;.$this-&gt;app-&gt;config[&#x27;app_id&#x27;].&#x27;&amp;secret=&#x27;.$this-&gt;app-&gt;config[&#x27;secret&#x27;]; //替换成自己的小程序id和secret @$weixin = file_get_contents($url); @$jsondecode = json_decode($weixin); @$array = get_object_vars($jsondecode); $token = $array[&#x27;access_token&#x27;]; return $token; &#125;&#125;\n\n\n\n参考资料:\n\n消息推送|token 验证(官方)\nbutton|小程序按钮(官方)\n客服消息使用指南|整体介绍(官方)\n\n\n客服消息|开发文档(官方)\n仅回复模板消息,非在线聊天|csdn 微信小程序【客服消息】功能开发\n前端button设置|简书 微信小程序之在线客服(即时聊天)\n\n","categories":["微信"],"tags":["微信"]},{"title":"数据库索引 为空重复 报错","url":"/2021/03/17/%E6%8D%AE%E5%BA%93%E7%B4%A2%E5%BC%95-%E4%B8%BA%E7%A9%BA%E9%87%8D%E5%A4%8D-%E6%8A%A5%E9%94%99/","content":"框架:ci2.0 集合了cms数据库:mysql用户表引擎为MyISAM,邮箱为唯一索引\n问题:用户注册时,不要求填写邮箱,但是在数据库设计时,将邮箱设计为唯一索引导致第一个用户注册成功后,没有填写邮箱。第二个用户注册时,数据库则因为已经有一个邮箱值为空导致冲突。系统报错: \nuplicate entry &#39;&#39; for key &#39;email&#39;\n解决:导致当有一个用户没填写邮箱信息时,新用户就无法注册 解决办法\n\n将数据库引擎更换为InnoDB,Innodb支持多个唯一值为null的索引,并将邮箱默认值改为null\n【不推荐】取消邮箱的唯一索引\n\n\n参考资料:\n\nmysql唯一索引能为空吗_mysql 允许在唯一索引的字段中出现多个null值\n\n","categories":["MySql"]},{"title":"早睡早起","url":"/2022/08/21/%E6%97%A9%E7%9D%A1%E6%97%A9%E8%B5%B7/","content":"告别瞎忙:实用时间管理术\n\n早起倒逼法: 实现早睡早起,最好先从早起开始,连续三天早起,第三天晚上你就受不了想要早睡了&lt;br&gt;\n晚间二分法: 早睡自然会牺牲难得的晚间时光,但是如果一直玩又会导致第二天精神不振,所以如果想早睡和个人时光兼得,最好将晚间时光规划下:晚饭后休息好后到睡觉前1~1.5小时作为娱乐运动时间,之后就看看书,了解些自己感兴趣又不那么费脑力且能控制住想看就看的东西&lt;br&gt;\n沐浴自控法: 到了睡觉前1~1.5小时,马上洗澡,如果运动得汗流浃背这时洗澡也很舒服,且电子设备不能带入浴室,可以很好打消边洗边玩的念头。而洗澡时的静谧环境可以让你情绪思维都逐渐从活跃变得平静,洗完之后就可以在床上看看书或者准备第二天需要的东西。&lt;br&gt;\n\n这样学习和娱乐都可以兼得。\n另外,开始早睡后,中午午休时间最好控制在30分钟内。\n开始早起后,你就可以顺着身体需要自然的开始提早上床休息,如果想循序渐进,我推荐你十五分钟十五分钟的向前提。比如原来十二点,现在就十一点四十五上床,没问题了就再进一步十一点半上床。十五分钟的时长变化不大,压力比较小,最顺应人性,而且是世界卫生组织建议的入睡时长,会比较科学易行。\n","categories":["杂谈"],"tags":["睡眠"]},{"title":"浏览器报ERR_PROXY_CONNECTION_FAILED","url":"/2021/03/30/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8A%A5ERR-PROXY-CONNECTION-FAILED/","content":"问题使用微信开发工具调试时,突然发现 url 访问报错,复制链接到浏览器却可以正常访问,查看报错信息\n\nERR_PROXY_CONNECTION_FAILED\n\n解决这是因为修改了系统访问代理导致的,只需要修改回来就可以了\n\n因为大多数浏览器都是基于ie的,所以打开IE浏览器,点击internet选项,进入页面。\n\n弹出页面点击连接。\n\n然后打开局域网设置。\n\n使用代理服务器的勾是勾上的,这里将它去掉。\n\n然后重启浏览器,再次打开网页就可以了。\n\n\n","categories":["杂谈"]},{"title":"添加环境变量","url":"/2022/08/21/%E6%B7%BB%E5%8A%A0%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F/","content":"当我们在 Linux下执行一个命令时,报 -bash: XXXX: command not found,这和Windows是相同的道理,都是环境变量惹的祸,\n思路是将 该应用的 bin 目录路径 添加到 profile 文件中就OK了\n\n找到profile文件# find profile 一般该文件在 /etc/profile 这里\n\n查看指令所在目录# which xxxx 即可查看xxx指令所在目录\n\n# vim profile#编辑该文件\n\n添加类似字段\n\n\nexport PATH&#x3D;&quot;$PATH:指令所在目录路径&quot; \n\n\n更新配置# source /etc/profile \n\n","categories":["linux"]},{"title":"火狐浏览器图形验证码刷新不生效的问题(图片src重新赋值不生效的问题)","url":"/2022/08/21/%E7%81%AB%E7%8B%90%E6%B5%8F%E8%A7%88%E5%99%A8%E5%9B%BE%E5%BD%A2%E9%AA%8C%E8%AF%81%E7%A0%81%E5%88%B7%E6%96%B0%E4%B8%8D%E7%94%9F%E6%95%88%E7%9A%84%E9%97%AE%E9%A2%98%EF%BC%88%E5%9B%BE%E7%89%87src%E9%87%8D%E6%96%B0%E8%B5%8B%E5%80%BC%E4%B8%8D%E7%94%9F%E6%95%88%E7%9A%84%E9%97%AE%E9%A2%98%EF%BC%89/","content":"来源: 火狐浏览器图形验证码刷新不生效的问题(图片src重新赋值不生效的问题) - 漫漫前端路 - SegmentFault 思否\n在用tp框架弄验证码的时候,写了一个简单的点击就刷新验证码的代码,但是发现火狐下不行,谷歌下却能正常使用\n//简写//ImageCodeSrc = BASE_URL + &quot;/login/captcha.jpg&quot;&lt;img src=&quot;&#123;:url(&#x27;/admin/verify&#x27;)&#125;&quot; width=&quot;116&quot; height=&quot;36&quot; id=&quot;captcha&quot;onclick=&quot;this.src=&#x27;&#123;:url(\\&#x27;/admin/verify\\&#x27;)&#125;&#x27;;&quot;&gt;\n\n原因【由于指定的src与原来图片的src相同,所以在ie7、火狐浏览器下验证码不会刷新】\n问题就出在上面的赋值方式,导致每次src的路径都是一样。\n解决方法\n加一个时间变量来让每次的src都不一样\n\n修改如下\n// 这种方式,谷歌和火狐都能成功刷新//ImageCodeSrc = BASE_URL + &quot;/login/captcha.jpg?d=&quot; + new Date().getTime()&lt;img src=&quot;&#123;:url(&#x27;/admin/verify&#x27;)&#125;&quot; width=&quot;116&quot; height=&quot;36&quot; id=&quot;captcha&quot; onclick=&quot;this.src=&#x27;&#123;:url(\\&#x27;/admin/verify\\&#x27;)&#125;?d=&#x27;+ new Date().getTime();&quot;&gt; \n\n","categories":["HTML"]},{"title":"火狐账号同步看不到其他设备","url":"/2021/06/30/%E7%81%AB%E7%8B%90%E8%B4%A6%E5%8F%B7%E5%90%8C%E6%AD%A5%E7%9C%8B%E4%B8%8D%E5%88%B0%E5%85%B6%E4%BB%96%E8%AE%BE%E5%A4%87/","content":"问题最近使用另一台电脑办公,发现登录了账号后,怎么也不能同步浏览器书签和设置,就连【登录过的其他设备也看不到】\n解决原因:国内火狐用户账号数据是保存在国内服务器而我的账号数据,不知道为啥保存在了国外服务器\n正是数据存放地不同,导致无法同步数据。\n只需要访问国外服务器即可解决\n\n外服:https://accounts.firefox.com\n国服:https://accounts.firefox.com.cn\n\n\n\n","categories":["杂谈"]},{"title":"睡眠&意志力","url":"/2022/08/21/%E7%9D%A1%E7%9C%A0-%E6%84%8F%E5%BF%97%E5%8A%9B/","content":"Q:明明很困,困得眼皮打架,但是一躺下脑袋就很清醒,翻来覆去睡不着。 A: 这种情况其实是身体困得要死,但是你的思维很很活跃。\n 这时可以一个人到沙发上坐会,不要玩手机,什么也不要想,让身体感受夜晚的安静;\n 20分钟左右你的思维就会因为大脑觉得该睡了,而不再活跃。\n 如果是中午在公司午休,试试丹田呼吸法,让思维逐渐平静,这样就算还是不能睡着,但是大脑也能得到一定的休息。\nQ:玩游戏或是看知乎刷抖音刷b站一段时间后,明明越来越觉得没意思,但却不受控制地想要继续呢? A: 因为诱惑太多了,让人停不下来的事情唾手可得。\n 尤其是电子设备,我们一无聊了,或是做正经事碰到困难了,就总愿意往里面钻去缓解焦虑,忘却烦恼,可一钻进去就出不来。\n 一旦陷入诱惑,我们就会给自己找理由,总会跟自己妥协,于是该睡觉的不睡觉,该做的事一拖再拖,牺牲了时间牺牲了精力甚至牺牲了机会,一天过得又慌又颓,恶性循环。\n\n刷知乎与刷抖音都会上瘾,内在逻辑是什么? - 知乎因为更加高端一点的精神生活没有精力或者财力去享受,平时的工作十分空虚总是需要一些精神生活,知乎抖音快手b站手机游戏等等东西都是廉价快捷的精神生活,我们从里面可以获得一些既得的快感。好一点的人看这些东西能有一些自己的思考,差一点的盯着几个小姐姐或者沙雕视频呵呵傻笑。最终发现自己破碎的空闲时间被填补上,无所事事的一天似乎还有一点充实。说到底,这个上瘾就是因为精神比较空虚。\n\n\n每天花几个小时玩游戏和每天花几个小时刷抖音类的短视频app,两种生活方式哪一个更糟糕? - 知乎糟糕不糟糕,关键在于,你为什么要每天花这些时间去做这么事情,如果单纯只是为了工作后的放松减压,那无可厚非;如果是为了消磨时间,那么能给你带来什么?让你感到放松?让你感到快乐?如果什么都没有获取到,并且无比焦虑自责,那都是糟糕的。\n\n","categories":["杂谈"],"tags":["睡眠"]},{"title":"简洁的summernote富文本编辑器","url":"/2021/03/26/%E7%AE%80%E6%B4%81%E7%9A%84summernote%E5%AF%8C%E6%96%87%E6%9C%AC%E7%BC%96%E8%BE%91%E5%99%A8/","content":"\nsummernote官网\n\nsummernote是我见过最简洁、简单的富文本编辑器,使用也很简单\n&lt;html&gt;&lt;head&gt; &lt;script type=&quot;text/javascript&quot; src=&quot;https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js&quot;&gt;&lt;/script&gt; &lt;link href=&quot;https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.5/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&gt; &lt;script src=&quot;https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.5/js/bootstrap.min.js&quot;&gt;&lt;/script&gt; \t&lt;!-- 样式文件 --&gt; &lt;link href=&quot;https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.css&quot; rel=&quot;stylesheet&quot;&gt; \t&lt;!-- 内核文件 --&gt; &lt;script src=&quot;https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.js&quot;&gt;&lt;/script&gt; \t&lt;!-- 语言文件 --&gt; &lt;script src=&quot;https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/lang/summernote-zh-CN.min.js&quot;&gt;&lt;/script&gt; &lt;/head&gt;&lt;body&gt; &lt;div id=&quot;summernote&quot;&gt;&lt;p&gt;Hello Summernote&lt;/p&gt;&lt;/div&gt; &lt;script&gt; $(document).ready(function() &#123; $(&#x27;#summernote&#x27;).summernote(&#123;\t\t\tlang: &#x27;zh-CN&#x27;,\t\t\theight: 300,\t\t\tcodemirror: &#123;\t\t\t\tmode: &#x27;text/html&#x27;,\t\t\t\thtmlMode: true,\t\t\t\tlineNumbers: true,\t\t\t\ttheme: &#x27;monokai&#x27;\t\t\t&#125; \t&#125;) &#125;); &lt;/script&gt;&lt;/body&gt;&lt;/html&gt;\n\n上面这段代码皆引用自cdn,cdn.jsdelivr.net的也速度不错。\n\n\n\n参考资料:\n\n最简洁的富文本编辑器\nsummernote官网\nsummernote 富文本编辑器上传本地图片\nsummernote禁止图片视频上传\n\n"},{"title":"获取微信公众号配置wxconfig以及签名","url":"/2021/05/28/%E8%8E%B7%E5%8F%96%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7%E9%85%8D%E7%BD%AEwxconfig%E4%BB%A5%E5%8F%8A%E7%AD%BE%E5%90%8Dsignature/","content":"起因某个商城小程序需要一个功能,扫二维码后跳到一个公众号H5页面,再从H5页面唤起小程序并传递参数。\n\n之所以这样做,是因为早期小程序并没有开发完成,但是用户商品的二维码已经出来了,因此采用此折中办法\n\n\n微信公众号H5页面跳转微信小程序\n\n微信公众号签名获取步骤\n使用APPID和APPSecret获取access_token;\n使用access_token获取jsapi_ticket ;\n用时间戳、随机数、jsapi_ticket和要访问的url按照签名算法拼接字符串;\n对第三步的字符串进行SHA1加密,得到签名。\n\n//tp5,easywxchat $wxOfficialAccount = new \\addons\\shopro\\library\\Wechat(&#x27;wxOfficialAccount&#x27;); $app = $wxOfficialAccount-&gt;getApp(); $app-&gt;jssdk-&gt;setUrl($url); $config = $app-&gt;jssdk-&gt;buildConfig(array(&#x27;updateAppMessageShareData&#x27;, &#x27;updateTimelineShareData&#x27;), true,false,false); $this-&gt;success(&#x27;获取配置信息&#x27;,$config);\n\n\n参考资料:\n\n微信公众号H5页面跳转微信小程序\n微信JS-SDK获取signature签名以及config配置\neasyWeChat手册\n微信JS-SDK获取signature签名以及config配置\n众平台ip白名单设置获取access_token\n于微信公众号开发的Token验证失败该如何解决?\n\n","categories":["微信"],"tags":["wxconfig"]},{"title":"解决Firefox显示“已阻止载入混合活动内容”的方法","url":"/2021/03/07/%E8%A7%A3%E5%86%B3Firefox%E6%98%BE%E7%A4%BA%E2%80%9C%E5%B7%B2%E9%98%BB%E6%AD%A2%E8%BD%BD%E5%85%A5%E6%B7%B7%E5%90%88%E6%B4%BB%E5%8A%A8%E5%86%85%E5%AE%B9%E2%80%9D%E7%9A%84%E6%96%B9%E6%B3%95/","content":"\n来源:解决Firefox显示“已阻止载入混合活动内容”的方法作者:Jacey\n\n今天把项目放到服务器上了,调试的时候出现“已阻止载入混合活动内容……”的报错:\n解决方法如下:\n\n方法1:让Firefox暂时不阻止\n打开新标签页,在地址栏输入 about:config,进入配置页面。搜索 security.mixed_content.block_active_content,将true改为false。\n\n\n\n\n方法2:避免在HTTPS页面中包含HTTP的内容。\n\n 第1种方法很不现实,因为我们不能要求所有用户去改这项配置。 我们可以看看是不是从https提交内容到http的原因,如果是的话,把请求的URL改成https的就可以了。\n 经排查,发现访问URL的时候确实是http的,将其改成https,不再报错了。\n\n","categories":["杂谈"]},{"title":"连接远程Linux","url":"/2022/08/21/%E8%BF%9E%E6%8E%A5%E8%BF%9C%E7%A8%8BLinux/","content":"\n进入root权限#su -root\n关闭linux内防火墙(?),将虚拟机网络适配器设置为桥接模式\n在linux终端中输入:#ifconfig查询linux IP,如果en0中没有 inet 参看第二条\nwindows系统下cmd中输入ipconfig查询IP地址\n#ping winIP ping成功即可\nlinux终端中:#ifconfig eth0 winip 记住此IP,不行也无所谓\n打开winscp,输入Linux-&gt;ifconfig-&gt;en0-&gt;inet ip\n进入即可在windows和linux系统之间传输文件\n\n","categories":["linux"]},{"title":"重新安装yum 和 python2.7","url":"/2022/08/21/%E9%87%8D%E6%96%B0%E5%AE%89%E8%A3%85yum-%E5%92%8C-python2-7/","content":"在鼓捣vim的时候,想让vim支持系统剪切版,就更新了python2到python3.6,之后觉得占空间就顺手把python2卸载了,结果centos7的yum软件更新管理是依赖python2的,很多python2的语法到python3不支持,又开始折腾怎么把python装上再装yum\n本人centOS为7.6 1080查看系统版本指令#cat /etc/redhat-release\n步骤一:centos7.6删除重新安装python和yum - ytkah - 博客园\n这位大哥的最后安装yum我不成功,参考步骤二就成功了\n步骤二:CentOS7安装yum(2019-03-14) - 简书\n按照上面两个大神的步骤,目前已恢复,\n其他:CentOS7 重装python与yum_运维_WolfBolin技术博客-CSDN博客Index of /7.6.1810/os/x86_64/Packages安装完python3之后,执行yum出错,bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录_Python_乙壳虫的博客-CSDN博客ImportError: No module named yum错误_运维_肥鸟不飞-CSDN博客[Libpython2.7.so.1.0()(64bit) Download for Linux (rpm)](\n","categories":["linux"]},{"title":"错误:只允许在 C99 模式下使用‘for’循环初始化声明","url":"/2021/08/07/%E9%94%99%E8%AF%AF%EF%BC%9A%E5%8F%AA%E5%85%81%E8%AE%B8%E5%9C%A8-C99-%E6%A8%A1%E5%BC%8F%E4%B8%8B%E4%BD%BF%E7%94%A8%E2%80%98for%E2%80%99%E5%BE%AA%E7%8E%AF%E5%88%9D%E5%A7%8B%E5%8C%96%E5%A3%B0%E6%98%8E/","content":"前言最近在linux里源码编译安装软件时,make后提示错误:只允许在 C99 模式下使用‘for’循环初始化声明\n原因我安装的swoole软件,在Linux下编译器为gcc,而gcc的标准有很多,c99就是其中之一,而这里的错误,就是编译器没有使用c99标准编译导致的。\n解决make CFLAGS=-std=c99使用上述指令编译即可。\n\nCFLAGS 表示用于 C 编译器的选项\n-std=c99 表示使用 c99 标准\n\n如果提示了错误:位置的类型名&#39;xxxx&#39;这时候不要执行nake clean,直接make就好\n\n参考资料:\n\n解决“错误:只允许在 C99 模式下使用‘for’循环初始化声明”问题_qq_31664947的博客-程序员宅基地\n错误:只允许在 C99 模式下使用‘for’循环初始化声明\n\n","categories":["linux"],"tags":["linux"]},{"title":"除非Windows Activation Service(WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。目前,这两项服务均处于停止状态。","url":"/2021/03/07/%E9%99%A4%E9%9D%9EWindows-Activation-Service%EF%BC%88WAS%EF%BC%89%E5%92%8C%E4%B8%87%E7%BB%B4%E7%BD%91%E5%8F%91%E5%B8%83%E6%9C%8D%E5%8A%A1%EF%BC%88W3SVC%EF%BC%89%E5%9D%87%E5%A4%84%E4%BA%8E%E8%BF%90%E8%A1%8C%E7%8A%B6%E6%80%81%EF%BC%8C%E5%90%A6%E5%88%99%E6%97%A0%E6%B3%95%E5%90%AF%E5%8A%A8%E7%BD%91%E7%AB%99%E3%80%82%E7%9B%AE%E5%89%8D%EF%BC%8C%E8%BF%99%E4%B8%A4%E9%A1%B9%E6%9C%8D%E5%8A%A1%E5%9D%87%E5%A4%84%E4%BA%8E%E5%81%9C%E6%AD%A2%E7%8A%B6%E6%80%81%E3%80%82/","content":"问题如题,在本地处理一个iis项目时,遇到\n\n除非Windows Activation Service(WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。目前,这两项服务均处于停止状态。\n\n\n解决在WINDOWS服务管理里 启动 \n\nWindows Process Activation Service\nWorld Wide Web Publishing Service\n\n可能遇到的问题\n没有IIS\n\n见Windows无法启动 Windows Process Activation Service 服务: 系统找不到指定的路径\n\n\n错误1068:依赖服务或组无法启动。\n\n右键 -&gt; 属性 -&gt; 依存关系启动所有列出来的服务\n\n\n错误3:系统找不到指定的路径。\n\n启动 Windows Process Activation Service出现提示:Windows 无法启动Windows Process Activation Service服务(位于本地计算机上)。依次尝试以下方法:\n\n在Windows功能中,找到并开启Windows Process Activation Service内所有功能 重启。\n没有对应的文件夹 手动创建 c:\\inetpub\\temp\\apppools 文件夹\n清理注册表\n\n\n\n\n\n相关资料:\n\n除非 Windows Activation Service (WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。IIS 7- 除非 Windows Activation Service (WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。IIS 7\nWindows无法启动 Windows Process Activation Service 服务: 系统找不到指定的路径\nWindows 10更新后Windows Process Activation Service服务不能启动 \nWindows Process Activation Service启动失败,显示系统找不到指定路径\nWindows无法启动 Windows Process Activation Service 服务: 系统找不到指定的路径\n\n","categories":["IIS"]},{"title":"MySQL 常用指令","url":"/2021/03/15/MySQL-%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4/","content":"\n来源: Mysql常用命令行大全|cnblogs作者: 淡淡的幸福\n\n1、连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码\n\n连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql\\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码。\n如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:mysql&gt;\n\n连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:\nmysql -h110.110.110.110 -u root -p 123;(注:u与root之间可以不用加空格,其它也一样)\n退出MYSQL命令: \nmysql&gt;exit (回车)\n\n2、修改密码格式:mysqladmin -u用户名 -p旧密码 password 新密码\n\n给root加个密码ab12。首先在DOS下进入目录mysql\\bin,然后键入以下命令\nmysqladmin -u root -password ab12\n注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。\n\n再将root的密码改为djg345。\nmysqladmin -u root -p ab12 password djg345\n\n3、增加新用户\n注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符\n\n格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码”\n\n增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用root用户连入MYSQL,然后键入以下命令:\ngrant select,insert,update,delete on *.* to [email&#x3D;test1@”%]test1@”%[&#x2F;email]” Identified by “abc”;\n但增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见2。\n\n增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。\ngrant select,insert,update,delete on mydb.* to [email&#x3D;test2@localhost]test2@localhost[&#x2F;email] identified by “abc”;\n如果你不想test2有密码,可以再打一个命令将密码消掉。\ngrant select,insert,update,delete on mydb.* to [email&#x3D;test2@localhost]test2@localhost[&#x2F;email] identified by “”;\n\n4.1 创建数据库\n注意:创建数据库之前要先连接Mysql服务器\n\n命令:create database &lt;数据库名&gt;\n例1:建立一个名为xhkdb的数据库\nmysql&gt; create database xhkdb;\n\n例2:创建数据库并分配用户\nmysql&gt; CREATE DATABASE 数据库名;mysql&gt; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON 数据库名.* TO 数据库名@localhost IDENTIFIED BY &#39;密码&#39;;mysql&gt; SET PASSWORD FOR &#39;数据库名&#39;@&#39;localhost&#39; &#x3D; OLD_PASSWORD(&#39;密码&#39;);\n依次执行3个命令完成数据库创建。注意:中文 “密码”和“数据库”是户自己需要设置的。\n4.2 显示数据库命令:show databases (注意:最后有个s)\nmysql&gt; show databases;\n\n\n注意:为了不再显示的时候乱码,要修改数据库默认编码。以下以GBK编码页面为例进行说明:\n\n1、修改MYSQL的配置文件:my.ini里面修改default-character-set=gbk2、代码运行时修改:\n①Java代码:jdbc:mysql:&#x2F;&#x2F;localhost:3306&#x2F;test?useUnicode&#x3D;true&amp;characterEncoding&#x3D;gbk②PHP代码:header(&quot;Content-Type:text&#x2F;html;charset&#x3D;gb2312&quot;);③C语言代码:int mysql_set_character_set( MYSQL * mysql, char * csname);\n该函数用于为当前连接设置默认的字符集。字符串csname指定了1个有效的字符集名称。连接校对成为字符集的默认校对。该函数的工作方式与SET NAMES语句类似,但它还能设置mysql-&gt;charset的值,从而影响了由mysql_real_escape_string()设置的字符集。\n4.3 删除数据库命令:drop database &lt;数据库名&gt;例如:删除名为 xhkdb的数据库\nmysql&gt; drop database xhkdb;\n\n例子1:删除一个已经确定存在的数据库\nmysql&gt; drop database drop_database;Query OK, 0 rows affected (0.00 sec)\n\n例子2:删除一个不确定存在的数据库\nmysql&gt; drop database drop_database;ERROR 1008 (HY000): Can&#39;t drop database &#39;drop_database&#39;; database doesn&#39;t exist &#x2F;&#x2F;发生错误,不能删除&#39;drop_database&#39;数据库,该数据库不存在。mysql&gt; drop database if exists drop_database;Query OK, 0 rows affected, 1 warning (0.00 sec)&#x2F;&#x2F;产生一个警告说明此数据库不存在mysql&gt; create database drop_database;Query OK, 1 row affected (0.00 sec)mysql&gt; drop database if exists drop_database;&#x2F;&#x2F;if exists 判断数据库是否存在,不存在也不产生错误Query OK, 0 rows affected (0.00 sec)\n\n4.4 连接数据库命令: use &lt;数据库名&gt;\n例如:如果xhkdb数据库存在,尝试存取它:\nmysql&gt; use xhkdb;屏幕提示:Database changed\n\nuse 语句可以通告MySQL把db_name数据库作为默认(当前)数据库使用,用于后续语句。该数据库保持为默认数据库,直到语段的结尾,或者直到发布一个不同的USE语句:\nmysql&gt; USE db1;mysql&gt; SELECT COUNT(*) FROM mytable; # selects from db1.mytablemysql&gt; USE db2;mysql&gt; SELECT COUNT(*) FROM mytable; # selects from db2.mytable\n使用USE语句为一个特定的当前的数据库做标记,不会阻碍您访问其它数据库中的表。下面的例子可以从db1数据库访问作者表,并从db2数据库访问编辑表:\nmysql&gt; USE db1;mysql&gt; SELECT author_name,editor_name FROM author,db2.editor -&gt; WHERE author.editor_id &#x3D; db2.editor.editor_id;\nUSE语句被设立出来,用于与Sybase相兼容。\n有些网友问到,连接以后怎么退出。其实,不用退出来,use数据库后,使用show databases就能查询所有数据库,如果想跳到其他数据库,用use 其他数据库名字就可以了。\n4.5 当前选择的数据库命令:mysql&gt; select database();\nMySQL中SELECT命令类似于其他编程语言里的print或者write,你可以用它来显示一个字符串、数字、数学表达式的结果等等。如何使用MySQL中SELECT命令的特殊功能?\n\n显示MYSQL的版本\nmysql&gt; select version(); +-----------------------+ | version() | +-----------------------+ | 6.0.4-alpha-community | +-----------------------+ 1 row in set (0.02 sec) \n显示当前时间\nmysql&gt; select now(); +---------------------+ | now() | +---------------------+ | 2009-09-15 22:35:32 | +---------------------+ 1 row in set (0.04 sec) \n显示年月日\nSELECT DAYOFMONTH(CURRENT_DATE); +--------------------------+ | DAYOFMONTH(CURRENT_DATE) | +--------------------------+ | 15 | +--------------------------+ 1 row in set (0.01 sec) SELECT MONTH(CURRENT_DATE); +---------------------+ | MONTH(CURRENT_DATE) | +---------------------+ | 9 | +---------------------+ 1 row in set (0.00 sec) SELECT YEAR(CURRENT_DATE); +--------------------+ | YEAR(CURRENT_DATE) | +--------------------+ | 2009 | +--------------------+ 1 row in set (0.00 sec) \n显示字符串\nmysql&gt; SELECT &quot;welecome to my blog!&quot;; +----------------------+ | welecome to my blog! | +----------------------+ | welecome to my blog! | +----------------------+ 1 row in set (0.00 sec) \n当计算器用\nselect ((4 * 4) &#x2F; 10 ) + 25; +----------------------+ | ((4 * 4) &#x2F; 10 ) + 25 | +----------------------+ | 26.60 | +----------------------+ 1 row in set (0.00 sec) \n串接字符串\nselect CONCAT(f_name, &quot; &quot;, l_name) AS Name from employee_data where title &#x3D; &#39;Marketing Executive&#39;; +---------------+ | Name | +---------------+ | Monica Sehgal | | Hal Simlai | | Joseph Irvine | +---------------+ 3 rows in set (0.00 sec) \n\n注意:这里用到CONCAT()函数,用来把字符串串接起来。另外,我们还用到以前学到的AS给结果列’CONCAT(f_name, “ “, l_name)’起了个假名。\n\n\n\n5.1 创建数据表命令:create table &lt;表名&gt; ( &lt;字段名1&gt; &lt;类型1&gt; [,..&lt;字段名n&gt; &lt;类型n&gt;]);\n例如,建立一个名为MyClass的表,\n\n\n\n字段名\n数字类型\n数据宽度\n是否为空\n是否主键\n自动增加\n默认值\n\n\n\nid\nint\n4\n\nprimary key\nauto_increment\n\n\n\nname\nchar\n20\n\n\n\n\n\n\nsex\nint\n4\n\n\n\n0\n\n\ndegree\ndouble\n16\n\n\n\n\n\n\nmysql&gt; create table MyClass(&gt; id int(4) not null primary key auto_increment,&gt; name char(20) not null,&gt; sex int(4) not null default &#39;0&#39;,&gt; degree double(16,2));\n\n5.3 删除数据表命令:drop table &lt;表名&gt;\n例如:删除表名为 MyClass 的表\nmysql&gt; drop table MyClass;\n\nDROP TABLE用于取消一个或多个表。您必须有每个表的DROP权限。所有的表数据和表定义会被取消,所以使用本语句要小心!\n注意:对于一个带分区的表,DROP TABLE会永久性地取消表定义,取消各分区,并取消储存在这些分区中的所有数据。DROP TABLE还会取消与被取消的表有关联的分区定义(.par)文件。\n对与不存在的表,使用IF EXISTS用于防止错误发生。当使用IF EXISTS时,对于每个不存在的表,会生成一个NOTE。\nESTRICT和CASCADE可以使分区更容易。目前,RESTRICT和CASCADE不起作用。\n5.4 表插入数据命令:insert into &lt;表名&gt; [( &lt;字段名1&gt;[,..&lt;字段名n &gt; ])] values ( 值1 )[, ( 值n )]\n例如:往表 MyClass中插入二条记录, 这二条记录表示:编号为1的名为Tom的成绩为96.45, 编号为2 的名为Joan 的成绩为82.99, 编号为3 的名为Wang 的成绩为96.5。\nmysql&gt; insert into MyClass values(1,&#39;Tom&#39;,96.45),(2,&#39;Joan&#39;,82.99), (2,&#39;Wang&#39;, 96.59);\n\n\n注意:insert into每次只能向表中插入一条记录。\n\n5.5 查询表中的数据\n查询所有行命令: select &lt;字段1,字段2,...&gt; from &lt; 表名 &gt; where &lt; 表达式 &gt;例如:查看表 MyClass 中所有数据\nmysql&gt; select * from MyClass;\n查询前几行数据例如:查看表 MyClass 中前2行数据\nmysql&gt; select * from MyClass order by id limit 0,2;\n\nselect一般配合where使用,以查询更精确更复杂的数据。\n5.6 删除表中数据命令:delete from 表名 where 表达式\n例如:删除表 MyClass中编号为1 的记录\nmysql&gt; delete from MyClass where id&#x3D;1;\n\n下面是一个删除数据前后表的对比。\n\n\n\nFirstName\nLastName\nAge\n\n\n\nPeter\nGriffin\n35\n\n\nGlenn\nQuagmire\n33\n\n\n下面以PHP代码为例删除 “Persons” 表中所有 LastName=’Griffin’ 的记录:\n&lt;?php $con &#x3D; mysql_connect(&quot;localhost&quot;,&quot;peter&quot;,&quot;abc123&quot;); if (!$con) &#123; die(&#39;Could not connect: &#39; . mysql_error()); &#125; mysql_select_db(&quot;my_db&quot;, $con); mysql_query(&quot;DELETE FROM Persons WHERE LastName&#x3D;&#39;Griffin&#39;&quot;); mysql_close($con); ?&gt;\n在这次删除之后,表是这样的:|FirstName|LastName|Age||:—-:|:—-:|:—-:||Glenn|Quagmire|33|\n5.7 修改表中数据语法:update 表名 set 字段=新值,… where 条件\nmysql&gt; update MyClass set name&#x3D;&#39;Mary&#39; where id&#x3D;1;\n\n例子1:单表的MySQL UPDATE语句:\nUPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1&#x3D;expr1 [, col_name2&#x3D;expr2 ...] [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]\n\n例子2:多表的UPDATE语句:UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]\nUPDATE语法可以用新值更新原有表行中的各列。SET子句指示要修改哪些列和要给予哪些值。WHERE子句指定应更新哪些行。如果没有WHERE子句,则更新所有的行。如果指定了ORDER BY子句,则按照被指定的顺序对行进行更新。LIMIT子句用于给定一个限值,限制可以被更新的行的数目。\n5.8 增加字段命令:alter table 表名 add字段 类型 其他;例如:在表MyClass中添加了一个字段passtest,类型为int(4),默认值为0\nmysql&gt; alter table MyClass add passtest int(4) default &#39;0&#39;\n\n加索引mysql&gt; alter table 表名 add index 索引名 (字段名1[,字段名2 …]);\n例子: mysql&gt; alter table employee add index emp_name (name);\n加主关键字的索引 mysql&gt; alter table 表名 add primary key (字段名);例子: mysql&gt; alter table employee add primary key(id);\n\n加唯一限制条件的索引 mysql&gt; alter table 表名 add unique 索引名 (字段名);例子: mysql&gt; alter table employee add unique emp_name2(cardnumber);\n\n删除某个索引 mysql&gt; alter table 表名 drop index 索引名;例子: mysql&gt;alter table employee drop index emp_name;\n\n增加字段:mysql&gt; ALTER TABLE table_name ADD field_name field_type;\n\n修改原字段名称及类型:mysql&gt; ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;\n\n删除字段:MySQL&gt; ALTER TABLE table_name DROP field_name;\n\n5.9 修改表名命令:rename table 原表名 to 新表名;\n例如:在表MyClass名字更改为YouClass\nmysql&gt; rename table MyClass to YouClass;\n\n当你执行RENAME时,你不能有任何锁定的表或活动的事务。你同样也必须有对原初表的ALTER和DROP权限,以及对新表的CREATE和INSERT权限。\n如果在多表更名中,MySQL 遭遇到任何错误,它将对所有被更名的表进行倒退更名,将每件事物退回到最初状态。\n\nRENAME TABLE 在 MySQL 3.23.23 中被加入。\n\n6、备份数据库\n命令在DOS的[url=file://\\mysql\\bin]\\mysql\\bin[/url]目录下执行\n\n\n导出整个数据库导出文件默认是存在mysql\\bin目录下\nmysqldump -u 用户名 -p 数据库名 &gt; 导出的文件名mysqldump -u user_name -p123456 database_name &gt; outfile_name.sql\n导出一个表\nmysqldump -u 用户名 -p 数据库名 表名&gt; 导出的文件名mysqldump -u user_name -p database_name table_name &gt; outfile_name.sql\n导出一个数据库结构\nmysqldump -u user_name -p -d –add-drop-table database_name &gt; outfile_name.sql-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table\n带语言参数导出\nmysqldump -uroot -p –default-character-set&#x3D;latin1 –set-charset&#x3D;gbk –skip-opt database_name &gt; outfile_name.sql\n\n 例如,将aaa库备份到文件back_aaa中:\n  [root@test1 root]# cd &#x2F;home&#x2F;data&#x2F;mysql  [root@test1 mysql]# mysqldump -u root -p --opt aaa &gt; back_aaa\n\n7.1 一个建库和建表的实例1drop database if exists school; &#x2F;&#x2F;如果存在SCHOOL则删除create database school; &#x2F;&#x2F;建立库SCHOOLuse school; &#x2F;&#x2F;打开库SCHOOLcreate table teacher &#x2F;&#x2F;建立表TEACHER( id int(3) auto_increment not null primary key, name char(10) not null, address varchar(50) default ‘深圳’, year date); &#x2F;&#x2F;建表结束&#x2F;&#x2F;以下为插入字段insert into teacher values(”,’allen’,&#39;大连一中’,&#39;1976-10-10′);insert into teacher values(”,’jack’,&#39;大连二中’,&#39;1975-12-23′);\n\n如果你在mysql提示符键入上面的命令也可以,但不方便调试。\n\n你可以将以上命令原样写入一个文本文件中,假设为school.sql,然后复制到c:\\下,并在DOS状态进入目录[url=file://\\\\mysql\\\\bin]\\\\mysql\\\\bin[/url],然后键入以下命令:\nmysql -uroot -p密码 &lt; c:\\\\school.sql\n如果成功,空出一行无任何显示;如有错误,会有提示。(以上命令已经调试,你只要将//的注释去掉即可使用)。\n\n或者进入命令行后使用 mysql&gt; source c:\\\\school.sql; 也可以将school.sql文件导入数据库中。\n\n\n7.2 一个建库和建表的实例2drop database if exists school; &#x2F;&#x2F;如果存在SCHOOL则删除create database school; &#x2F;&#x2F;建立库SCHOOLuse school; &#x2F;&#x2F;打开库SCHOOLcreate table teacher &#x2F;&#x2F;建立表TEACHER( id int(3) auto_increment not null primary key, name char(10) not null, address varchar(50) default &#39;&#39;深圳&#39;&#39;, year date); &#x2F;&#x2F;建表结束&#x2F;&#x2F;以下为插入字段insert into teacher values(&#39;&#39;&#39;&#39;,&#39;&#39;glchengang&#39;&#39;,&#39;&#39;深圳一中&#39;&#39;,&#39;&#39;1976-10-10&#39;&#39;);insert into teacher values(&#39;&#39;&#39;&#39;,&#39;&#39;jack&#39;&#39;,&#39;&#39;深圳一中&#39;&#39;,&#39;&#39;1975-12-23&#39;&#39;);\n\n注:在建表中\n\n将ID设为长度为3的数字字段:int(3);并让它每个记录自动加一:auto_increment;并不能为空:not null;而且让他成为主字段primary key。\n\n将NAME设为长度为10的字符字段\n\n将ADDRESS设为长度50的字符字段,而且缺省值为深圳。\n\n将YEAR设为日期字段。\n\n\n","categories":["MySql"],"tags":["MySql"]}]
JavaScript
1
https://gitee.com/anlondon/anlondon.git
git@gitee.com:anlondon/anlondon.git
anlondon
anlondon
anlondon
master

搜索帮助