php技术博客

记录php相关学习知识及开发示例、疑难问题等,欢迎大家与我联系交流相关技术

mysql中索引类型Btree和Hash的区别以及使用场景

mysql中支持两种索引类型,一种是btree类型,一种是hash类型。为什么我们添加索引的时候没有要求设置索引类型了,因为有默认值。Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引。1、BTree类型BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量,例如:select * from user where name like ‘jack%’;2、Hash类型Hash索引只能用于对等比较,例如=,<=>(相当于=)操作符。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问,所以检索效率远高于BTree索引。但为什么我们使用BTree比使用Hash多呢?主要Hash本身由于其特殊性,也带来了很多限制和弊端:Hash索引仅仅能满足“=”,“IN”,“<=>”查询,不能使用范围查询。联合索引中,Hash索引不

selenium在Centos服务器下环境搭建

之前很早就用过selenium来模拟抓取些网页,之前在windows电脑上配置的,一直以为selenium需要在图形界面才能使用。最近有个项目需要用到selenium,服务器用的centos,所以研究了下。发现linux命令行模式下也可以安装及使用selenium,并不需要图形相关软件安装。1、安装python3及包管理工具pip32、安装seleniumpip3 install selenium3、下载安装 chrome浏览器yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm安装后,通过执行命令 google-chrome --version 来查看当前chrome浏览器的版本4、安装ChromeDriverhttp://npm.taobao.org/mirrors/chromedriver,注意版本需与浏览器版本对应,然后下对应平台的版本即可。下载后与chrome安装目录放在一起,然后配置至环境变量即可,配置好后shell输入:chromed

线上服务器搭建git服务,本地代码上传实现自动同步到线上服务器指定web目录

最新公司有个项目代码需要规范化,可以查看历史记录及··可以·回滚操作,所以考虑使用在服务器上搭建git服务器,并设置钩子,当我们上传代码后自动同步到服务器代码目录下。下面为具体步骤1、服务器上安装git程序yum install git2、在服务器上创建 裸版本库git init --bare demo.git//参数 --bare 是代表创建裸仓库3、本地Clone远程的代码仓库到本地git clone git@39.99.204.74:/home/git/demo.git本地更新代码后,推送到远端git push origin master4、之前步骤实现了本地推送到服务器仓库中,如何实现自动同步到服务器代码目录里面了?自动同步功能用到的是 git 的钩子功能。服务器端,进入 对应仓库,如cd /home/git/demo.git创建post-receive文件cd hooksvi post-receive在里面添加文件#!/bin/bashgit --work-tree=/www/wwwroot/demoroot checkout -fPS:1、其中 /www

记一次crontab定时任务不执行问题分析与解决

之前用python+selenium写了一个抓取网页的脚本,直接执行脚本都是正常的,放到crontab下,利用任务计划来执行,但是没有正确执行到脚本内容。通过查看任务计划日志 /var/log/cron,发现对应时间点有执行脚本。这种情况只能是脚本执行过程中有异常情况中断了,然后记录 脚本执行的日志及错误日志。通过查看错误日志,提示“'chromedriver' executable needs to be in PATH.”。命令行下 whereis chromedriver,能找到对应命令。看来 crontab中环境变量 配置的值不一致造成的。通过网页搜索,定时任务执行时环境变量 加载 /etc/crontab里面 PATH 的值。所以有两种方法解决(1)、修改 /etc/crontab文件文件末尾添加 source /etc/bashrc(2)、修改任务计划脚本,添加对应环境变量配置* * * * * source /etc/bashrc;/usr/bin/python3 /tmp/caiji.py或* * * * * export PATH=&quot

命令环境变量PATH设置方法

经常遇到执行命令找不到的问题,这是因为没有加入到PATH中的问题,如 chrome命令地址为 /opt/google/chrome/chrome,临时性可以执行下面命令export PATH="$PATH":/opt/google/chrome/如果需要永久有效,即重启后还有效,需要在配置文件里面修改。在文件 /etc/bashrc 文件末尾添加export PATH=$PATH:/opt/google/chrome保存即可。立即生效,也可以在修改后执行命令source /etc/bashrc

详解mysql中的严格模式和非严格模式

今天在排查一个程序bug中发现,有一个sql写入的数据跟数据库中记录的不一致。通过排查,突然想起来可能是数值类型的问题,果真如此。字段设置的为tinyint(4),当写入超过127的数值后,数据库中都为记录为127。帮这个字段改为int(10)类型。改为之后,我思考,超过数值范围的提示错误或记录错误就可以避免这种问题了。通过搜索知道了mysql中有严格模式与非严格模式。下面详细介绍。何为MySQL的严格模式,简单来说就是MySQL自身对数据进行严格的校验(格式、长度、类型等),比如一个整型字段我们写入一个字符串类型的数据,在非严格模式下MySQL不会报错,同样如果定义了char或varchar类型的字段,当写入或更新的数据超过了定义的长度也不会报错。我认为这个对于编程来说没有任何好处,虽然我们尽量在代码中做数据校验。MySQL开启了严格模式从一定程序上来讲是对我们代码的一种测试,如果我们的开发环境没有开启严格模式在开发过程中也没有遇到错误,那么在上线或代码移植的时候将有可能出现不兼容的情况,因此在开发过程做最好开启MySQL的严格模式。1、如何查看当前使用的模式可以执行sql语句sel

linux查看添加删除swap分区详解

一般情况为内存不够,或者临时部分情况下,内存不足。可以设置虚拟内存,一般设置不超过真实内存的2倍。对于内存很充裕的情况下,设置虚拟内存作用不大。虚拟内存与真实内存性能上还是存在一定的差距,如果内存确实缺的比较多,建议还是升级硬件的好。1、查看当前swap情况free -m 或 swapon -s 命令2、添加swap分区步骤(1)、使用dd命令创建swap交换文件dd if=/dev/zero of=/var/swapfile bs=1M count=2048if(即输入文件,input file),of(即输出文件,output file)。dev/zero是Linux的一种特殊字符设备(输入设备),可以用来创建一个指定长度用于初始化的空文件,如临时交换文件,该设备无穷尽地提供0,可以提供任何你需要的数目。 bs=1024 :单位数据块(block)同时读入/输出的块字节大小为1024 个字节即1KB,bs(即block size)。count=2048000 :数据块(block)数量为2048000 ,即2048000个1KB。可以计算swap分区的容量为:1KB 2097152

解决php中each函数在7.2版本提示deprecated错误问题

今天有个thinkphp5.0版本的项目切换到php7.2版本,有个页面一直报错,打开调试代码。发现错误提示“The each() function is deprecated. This message will be suppressed on further calls”。说明php不建议继续使用each函数了,那如何修改代码了,下面介绍两种方法:1、改成 key()、current()函数来组装 $arr=['name'=>'phper163','year'=>2020]; list($a,$b) = [key($arr),current($arr)]; var_dump($a,$b);//string(4) "name" string(8) "phper163"2、使用foreach语法来实现 $arr=['name'=>'phper163','year'=>2020]; foreach($arr a

使用php代码导出表格方法(四)PhpSpreadsheet库使用

由于PHPExcel已经不再维护,PhpSpreadsheet是PHPExcel的下一个版本。PhpSpreadsheet是一个用纯PHP编写的库,并引入了命名空间,PSR规范等。这里使用PhpSpreadsheet库来实现导出表格的方法。这里表格导出实现了 单元格合并,居中、单元格宽度等设置。

使用php代码读取表格方法(二)PhpSpreadsheet库使用

由于PHPExcel已经不再维护,PhpSpreadsheet是PHPExcel的下一个版本。PhpSpreadsheet是一个用纯PHP编写的库,并引入了命名空间,PSR规范等。这里简单介绍下PhpSpreadsheet库的表格读取数据功能。

使用php代码读取表格方法(一)PHPExcel类使用

读取表格这个开发中经常遇到的事情,下面来介绍下使用PHPExcel来读取表格数据的例子,这里主要写下php处理表格那块的代码

php面试题之按照指定数量从尾部开始分割字符串

这个面试题要求从尾部开始安装指定位数分割字符串,如“1234567”,按3位长度分割,转换为“1,234,567”。对php函数比较熟悉的,知道可以用 number_format('1234567') 来生产结果。但是我们要知道 number_format只能对数值型字符串进行处理,并且只能按照3位长度分割。如何使用通用的解决方案了。下面是用两种方法来实现上面的方法function str_format1($str,$sep_number=3,$sep=','){     if($sep_number 

php面试题之如何判断域名是否为拼音域名

之前面试一个搞域名相关服务的公司,有一道笔试题是如何判断一个域名是否为拼音域名,即域名是拼音组成的,如baidu.com,可以是“百度”、“拜读”、“摆渡”的拼音。可以是一个字拼音、两个字拼音、三个等等。解决思路如下,我们收集出所有汉字的拼音的集合,然后循环判断域名是否在这个集合中。具体代码如下:$pinyinArr=array("a","ai","an","ang","ao", "ba","bai","ban","bang","bao","be","bei","ben","beng","bi","bian","biao","bie","bin","bing","bo","bu", "ca","cai","can","cang","cao","ce","cen","ceng","cha","chai","chan","chang","chao","che","chen","cheng","chi","chong","chou","chu","chua","chuai","chuan","chuang","chui","chun","chuo","ci","cong","cou","

php基础之Trait

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。 多个 trait 通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。多个trait间有方法名重复解决方法:使用insteadof 来指定使用哪个trait下对应的方法。class Base{     public function sayHello(){         echo 'Hello';     } } trait SayWorld{ &nbs

如何通过php判断一个文件哪个平台编辑的

我们知道文件在win\linux\mac平台下换行对应的字符是不一样的,我们通过这个来判断一个文件通过那个平台编辑的。虽然不一定准确,但可以分析出文件对应的换行符$file="demo.txt"; $cc=file_get_contents($file); if(strpos($cc,"\r\n")){ echo ' windows (CR LF)'; }elseif(strpos($cc,"\n")){ echo ' unix/linux (LF)'; }elseif(strpos($cc,"\r")){ echo ' mac (CR)'; }else{     echo PHP_OS; }为什么我们要知道,属于哪个平台了,因为部分函数对这块没有考虑完全。如 openssl_pkey_get_public 函数,mac下密钥文件解析就有问题,解析错误返回