首页
Search
1
解决 docker run 报错 oci runtime error
49,608 阅读
2
WebStorm2025最新激活码
28,204 阅读
3
互点群、互助群、微信互助群
23,060 阅读
4
常用正则表达式
21,664 阅读
5
罗技鼠标logic g102驱动程序lghub_installer百度云下载windows LIGHTSYNC
20,036 阅读
自习室
互通有无
搞钱日记
养生记
包罗万象
Search
标签搜索
职场副业
职业发展
副业赚钱
后端开发
内容创作
微服务
分布式系统
效率提升
DevOps
技能提升
流量变现
性能优化
云原生
高并发
编程学习
深度学习
人工智能
架构设计
机器学习
前端开发
loong
累计撰写
3,206
篇文章
累计收到
4
条评论
首页
栏目
自习室
互通有无
搞钱日记
养生记
包罗万象
页面
搜索到
3206
篇与
的结果
2020-01-12
wordpress十个配置技巧
WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。以下分享十个wordpress十个实用配置技巧!1.WordPress基本配置在默认的情况下,只需要安装好wordpress后填写数据库内容就可以了,如果没有wp-config.php文件,只要将wp-config-sample.php文件重命名为wp-config.php,通过FTP上传WordPress进入站点后,您需要通过更改以下代码来添加数据库信息:define('DB_NAME', 'database-name');define('DB_USER', 'database-username');define('DB_PASSWORD', 'database-password');define('DB_HOST', 'localhost');2.添加安全密钥WordPress安全密匙是一串随机变量,它可以改善用户cookie保存的信息的加密性。使用WordPress安全密钥可以提高WordPress支持的博客或网站的安全性。在配置文件中添加以下代码:define( 'AUTH_KEY', 'put your unique phrase here' );define( 'SECURE_AUTH_KEY', 'put your unique phrase here' );define( 'LOGGED_IN_KEY', 'put your unique phrase here' );define( 'NONCE_KEY', 'put your unique phrase here' );define( 'AUTH_SALT', 'put your unique phrase here' );define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );define( 'LOGGED_IN_SALT', 'put your unique phrase here' );define( 'NONCE_SALT', 'put your unique phrase here' );3.更改WordPress表前缀在WordPress安装完成后,默认的表前缀”wp_”,自然没有问题,不过很多人认为使用默认的表前缀,安全性比较低,更改表前缀可以使您的WordPress数据库更安全。可以防止一定的SQL注入攻击的风险。修改表前缀,最简单方法就是重装,不过,如果WordPress中已经有了一定的数据,重装就比较麻烦,于是直接在线修改。通过修改下面配置修改表前缀。$table_prefix = ‘wp_’;4.WordPress调试通过wordpress调试功能,可以查找错误。默认情况下设置为false,在使用时才启用。define(‘WP_DEBUG’, false); // 默认情况下禁用调试define(‘WP_DEBUG’, true); // 启用调试模式5、更改站点或WordPress地址在wordpress后台的设置中改了wordpress地址和站点地址后导致网站无法打开,您可以通过添加以下行来通过wp-config.php文件更改您的站点和WordPress URL:define('WP_HOME', 'http://www.example.com');define('WP_SITEURL', 'http://www.example.com');6.覆盖文件权限如果你的主机商对用户有严格的文件限制的话,你可以覆盖文件权限。虽然大多数人可能不需要用到,但是如果你需要用到,也可以设置。define('FS_CHMOD_FILE', 0755);define('FS_CHMOD_DIR', 0644);7.使用自定义用户表默认情况下,WordPress会将所有用户数据保存在表wp_users和wp_usermeta中。通过下面的代码可以指定要存储用户信息的表。define('CUSTOM_USER_TABLE', $table_prefix.'my_users');define('CUSTOM_USER_META_TABLE', $table_prefix.'my_usermeta');8.增加PHP内存限制在用户使用中经常出现wordpress内存耗尽的问题,可以通过代码增加PHP内存限制:define('WP_MEMORY_LIMIT', '64M');注:不是所有主机都适合这个功能,有时候需要联系主机服务商进行调整。9.允许数据库自动修复WordPress内置自动优化和修复数据库功能,不过默认状态为关闭,需要在配置文件中添加以下代码才能开启:define('WP_ALLOW_REPAIR', true);然后访问网址“http://example.com/wp-admin/maint/repair.php”优化数据库。10.WordPress错误记录错误记录对开发人员来说挺有用处的,通过配置wp-config.php可以为网站创建一个错误记录,创建一个叫 “php_error.log”的文件,将它设为服务器可写,然后上传到你选择的目录下:@ini_set('log_errors','On');@ini_set('display_errors','Off');@ini_set('error_log','/home/path/domain/logs/php_error.log');
2020年01月12日
11,121 阅读
0 评论
17 点赞
2020-01-12
为什么网站需要改版
网站为什么要改版?当有seo优化人员向老板提出网站要改版,可能老板会有点不解,网站为什么要改版?1.网站功能不适应现有需求企业随着时间的发展,规模不断改变,或者经营目标有了改变,所以久的网站也要跟着改变,要让网站的版面和功能跟着企业的发展一起改变。当小规模网站不断发展壮大,可能旧网站的营销方面的需求已经不再是中心,要转而体现公司形象和文化,塑造品牌形象。2.网站样式跟不上时代发展需要旧网站的设计排版已经不适用于当今的审美标准,用户视觉体验不佳可能会造成访问量低,增加跳出率的等问题。3.网站页面更加友好搜索引擎。旧的网站在设计师,往往在代码上会使用很多不主流的代码,这样的话,对于搜索引擎的友好度页不是很好,网站改版之后,能够从最基本的代码对网站做出优化。4.网站页面可以适应手机端的查看近几年,随着移动互联网的发展,传统的PC网站已经无法适应手机用户的查看,因此在网站改版时,也可以做成响应式的网站,方便企业的未来的移动端布局。
2020年01月12日
9,687 阅读
0 评论
13 点赞
2020-01-11
微信公众号吸粉的六个方法
如今,微信显然已经成为一种非常普及的通讯手段。微信公众号推广也是一种非常不错的品牌宣传模式。微信公众号推广是目前见效快、成本低的营销模式之一。也正是因为如此,很多人都建立起自己的微信公众号,并且通过多种方式大量吸粉。以下介绍六种微信公众号吸粉的六种方法。1.投其所好首先公众号自身定位很重要,只有内容精准了你吸引过来的粉丝才足够精准而不至于流失,它就像你给自己定的小目标一样,有了目标你才能知道自己接下来的方向,按照方向走的时候不仅要学会“做自己”,也要想着如何去讨好粉丝,文章不仅要有原创性还要有趣味性,让大家喜欢期待你的作品,而不是你去找人看你的作品,化主动为被动,让粉丝喜欢你,你的才能走的长久。2.软文推广写文章,或者引用好文章,里面巧妙地加入自己的微信号和二维码,然后发布到自己的微信公众平台和各大与产品相关论坛和贴吧。文章标题是关键一定要达到消费者主动转发的效果。利用软文推广微信公众号大家是做什么行业的,就可以写这方面的一些文章,最好是图文并茂的。大家可以写一些经验,知识,技巧类的文章吸引用户观看。然后就可以在文章中引导用户关注公众号的信息。写好文章后,发布在各大和自己行业相关的网站,也可以到一些平台去投稿。如今日头条、搜狐头条等。3.公众号活动吸粉微信公号举办活动有几类,其中一类是发红包。举一个例子:在微信公号里发一篇文章,内容是随机为网友发红包,要求是网友将本公号推荐到自己的朋友圈,同时进行截图,发送到本公号里,再进行随机抽取,且红包金额不限。3.互推互推就是相互推广,相信很多人都用过互推的方法,其实就是找粉丝量、阅读量相当的微信,相互推广实现资源互换,目前有专业的微信互推平台,如WeMedia、vmeti、微媒体等。也有很多互推的QQ群和微信群。找一个跟自己微信公众号相当的做互推不难,那么一个1万用户数的账号,怎么让拥有10万用户数的账号帮我推呢?这就需要你能给到等价值的交换,比如微博、PC端或APP等。只要能搞定一些大号帮你推广,那你就可以看着粉丝数蹭蹭的涨。4.地推吸粉地推是运营中比较久的一种推广方式。就是通过扫码关注公众号换取礼品等简单方法,一般选择人流量大的地方,比如会展中心、小区、商场、超市等地方。如果资金雄厚也可以考虑和一些有关的实体店合作。虽然看起来有点笨拙,但是也是直接接触到客户的一种途径,可能能获取到一些比较重要的客户信息。5.事件话题事件话题推广就需要去借势,比如xxx的事件,就可以撰写相关的文章,在文章中提醒用户视频在微信公众号里分享,所以想要视频就得先关注我的微信才会分享。这只是一个案例,这种形式的推广还有很多。这里也给大家分享几个寻找热门话题的小技巧。⑴新浪微博的热门话题⑵百度、搜狗风云榜⑶各种头条软件看热门话题⑷微信搜狗找类目排名文章6.资源分享每个行业的从业者都有一些独有的经验和资源可分享,也有需要其他领域资源。这时候如果你有这些资源就可以发挥作用了,你就能救人于水火,把你的资源告诉别人,但必须要关注微信公众号才能获得。这样你不但能留住老用户,而且更能吸引新用户。上述都是一些常见的微信公众号的常见的吸粉方法,其实其他方法还有很多,无论那一种方法只要你专注去做,做精,做细,都是可以吸引到很多粉丝的。但关键还是在于两点,一是内容为王。没有优质的内容作为支撑一切都是徒劳。二是坚持不懈。前半年甚至一年你注定要付出很多的时间,你只有很努力,才能看起来很轻松。
2020年01月11日
10,073 阅读
0 评论
9 点赞
2020-01-10
如何将字符串转化为数字
在JavaScript中,表示数字的方式有两种,一种是是实际数字(例如42),或是字符串(例如'42')。如果使用严格的比较(===)来比较两者,这两者是不相等的,因为它们是两种不同类型的数据。var num1 = 42;var num2 = '42';if (num1 === num2) { console.log(true);} else { console.log(false);} 让我们看看将字符串转换为数字的三种不同方法。parseInt() #parseInt()方法将字符串转换为整数(整数)。它接受两个参数。第一个参数是要转换的字符串。第二个参数叫做radix(基数)。这是数学系统中使用的基数。对于我们的使用,它永远是10,实际上第二个参数常常可以省略。parseFloat() #parseFloat()方法将字符串转换为浮点型数值(带小数点的数字)。您甚至可以传入包含随机文本的字符串。var text = '3.14someRandomStuff';var pointNum = parseFloat(text);// returns 3.14Number() #Number()方法将字符串转换为数字。有时它是一个整数。有它是一个浮点数。如果你传入一个带有随机文本的字符串,你会得到NaN一个“Not a Number”的首字母缩写词。由于这种不一致,它是一个不太安全的选择。建议使用parseInt()和parseFloat()。如果您知道所需数字的格式,请使用用它们。如果你希望当判断的字符串中含有其它非数字字符时,返回的是NaN,Number()则实际上可能是更好的选择。// Convert stringsNumber('123'); // returns 123Number('12.3'); // returns 12.3Number('3.14someRandomStuff'); // returns NaNNumber('42px'); // returns NaN
2020年01月10日
11,473 阅读
0 评论
10 点赞
2020-01-09
seo优化网站图片技巧
seo优化网站图片做SEO网站优化我们一直都是在做网站关键词,网站内页关键词和网站标签等优化,除了这些很多人都会忽略对网站图片的优化。近年来百度图片识别、360图片识别等等大型平台都不断在升级图片识别多功能,所以对网站图片的优化也要加强重视。那图片优化如何做呢?一、网站图片的Alt标签优化 SEO优化中搜索引擎对于图片的认识主要来源于Alt标签,这是搜索引擎对图片的第一印象。网站有大量图片时极客思维小编建议要为每张图片加上独一无二的Alt标签,围绕文章的核心意思去写,再适当融入网页的关键词,来增加网页的相关性。极客思维小编提醒不要把图片的SEO优化Alt属性都写成一样的,这样会被搜索引擎认为是在作弊。二、网站图片的清晰度优化 在特定的情况下清晰度高的图片对于文章也起很重要的作用,比如像一些介绍产品的文章,当用户来访问网站的时候,就是想通过图片来看清楚产品的一些外观细节,那如果配图不清晰,哪怕文字再好,内容再丰富,对用户的价值也会大打折扣。所以清晰的配图对文章质量的提升也是有帮助的。三、网站图片的原创度 建议大家选取的图片最好不是去“百度图片”中寻找,因为百度图片中的图片是百度已经收录的图片,稀缺性并不高,大家可以尝试去千图网,淘宝等各大图片平台寻找,而且寻找最新刚发布不久的图片,原创度也就高得多了,大家都知道,搜索引擎喜欢新鲜的东西,图片也不例外。四、定制图片的格式与大小 众所周知,网站图片的格式有jpg、gif、png常见的三种格式。那么到底何种网站的图片是百度最喜欢的呢?很简单,我们可以看看百度官方发布的一些带图的文章,就不难发现png的格式就是最佳的格式。 其次、网站图片的大小也应重视。这里说的大小并非尺寸大小,而是质量大小,所以在做网站之前,尽量在不影响正常观看的情况下降低网站图片质量的大小。这样做的好处是你的网站会获得更快的打开速度五、网站图片前后的文字 SEO优化中在保证ALT和Title都齐全的前提下,图片的周围需要配一些文字描述,极客思维小编提醒这段文字要重复Alt与Title里的关键词,这能加强网页本身和图片本身的相关性,极客思维小编提醒在用户搜索的时候会很有好处的。六.图片与文章的相关性 保证图片与文章的相关性尤为关键,如果想要搜索结果以图文并茂的形式展现,必须为该页面配备符合主题的相关图片才能给予展现。除了这方面外,从网站内容而言,如果网站图片和网站内容毫无关联性,试问你又能否给予网站访客一个好的用户体验呢?所以网站图片优化也要注重相关性。七、用网站图片去建设内链 在过去我们为网站建设内链的时候,往往喜欢在文章下部,添加一下相关文章推荐,如图A。那么在这个图文并茂的时代,我们又为何不常识下用图片去减少内链呢?如图B,,在图B中我们就可以看出,为用户推荐的相关文章,皆是以图文的形式所展现,并且该图为文章内容中配图的缩略图。这样做岂不是能更好的迎合搜索引擎,并且也给予网站访客一个更棒的用户体验呢?八、图片本地化或本地储存 虽然原创图片对排名和用户有很大的好处,但花费的时间很多,有时候借用别人的图片也是不错的选择。但我建议在盗用图片的时候最好下载到本地再上传到自己的网站。如果直接以链接的方式调用的话等于给别人做了一个外链啦,自己网站权重就分散了。 在站内的图片优化主要是针对搜索引擎,因为搜索引擎对于图片的抓取是不要太灵活的。所以极客思维小编提醒这一点必须要注意。图片优化影响着用户的体验感以及搜索引擎对网站的好感度,一定要做好图片SEO优化。
2020年01月09日
7,440 阅读
0 评论
20 点赞
2020-01-09
十小时大数据入门
十小时大数据入门
2020年01月09日
7,625 阅读
0 评论
68 点赞
2020-01-09
Docker环境下的前后端分离项目部署与运维
Docker环境下的前后端分离项目部署与运维
2020年01月09日
8,111 阅读
0 评论
39 点赞
2020-01-09
大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分布式电商项目视频教程
大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分布式电商项目视频教程
2020年01月09日
6,325 阅读
0 评论
40 点赞
2020-01-08
WordPress如何快速移除所有文章的特色图片
说到 WordPress 的特色图像功能,相信大家都比较熟悉了,今天分享 批量删除所有文章的特色图像 的方法,或许有些朋友会用得上。WordPress 文章相关字段其实都存放在 WordPress 数据库中的 postmeta 这个数据表中,而特色图片就是存放在字段 _thumbnail_id 中,所以最直接的办法就是直接通过 SQL 删除该表中的所有 _thumbnail_id 字段就可以搞定,除了这个方法还有另外一种方法,就是利用 WordPress 官方提供的函数,教程代码如下:需要编辑主题根目录下的 functions.php 这个敏感的文件,将下面的代码添加入 functions.php 文件中:global $wpdb;$wpdb->query( " DELETE FROM $wpdb->postmeta WHERE meta_key = '_thumbnail_id'" );然后刷新下网站页面,就会执行删除。注意:确认删除后,务必删除该行代码,否则你以后就没有办法正常设置文章的特色图片啦。 注:点击图片获取视频教程!
2020年01月08日
6,334 阅读
0 评论
7 点赞
2019-12-31
SEO面试技巧
SEO职业化为很多人提供了就业的机会,很多企业慢慢的都设置了网络推广部门,设置了SEO岗位;每一个找工作的人都少不了面试这一关。对于一些老手来说,面试已经不是什么问题了,不过对于一些刚步入职场的新手的seo来说,刚开始没什么经验,失败的机率还是挺高的。所以新手seo如何面对面试官呢?一、SEO面试自我介绍一般情况,自我介绍这一步是不可少的,不少面试官一开始就要你作一个自我介绍;关于自我介绍,一定要简洁清晰、捡重点说。面试官不可能喜欢一个废话连篇的面试者,自我介绍就相当于给面试官的第一印象,在面试中第一印象是十分重要的,如果能够在初次见面时给面试官留下良好的印象,那么你成功的可能性就大大的增加了。面试的时间很短,如果想要博得面试官的亲睐,那么一场精彩的自我介绍至关重要。重点:1、从事SEO的年限;2、分别任职过什么岗位;3、岗位供作内容是什么:4、操作过什么项目,结果如何;注:新手如果不是很了解,可以网上查找一些相关资料二、SEO面试之问卷答题企业不一样,面试的方式也是千奇百怪,有的企业喜欢在网上找一篇SEO考试试卷,让你解答;这个没有什么太好的办法,只要你基础过硬,问题都不大;三,SEO面试之为什么离职面试官问你这个问题的目的,是想知道你对于上一家公司的看法。记住,不要说上一家公司的坏话中肯一点就好,在面试过程中说上一家公司的坏话是职场大忌。对于一些新手来说,没有工作经验,也可以适当自己添加工作经验,遇到这种提问可以随机应变回复面试官。四、SEO面试之做过什么项目很多比较大点的公司,更在意的是SEO经验和结果,这时你就把自己做过的SEO项目告诉他就行,可以稍微夸张一点,但不要过于夸张;新手可以网上找一些项目资料事先了解学习一下。五、SEO面试之简历的写法SEO的简历不要太复杂,不要填写太多无用的信息;把姓名、年龄、学历、联系方式、自我介绍、案例这几个维度写好就行,其他的不重要;在SEO面试的过程中,你会接触到各种面试官,他们或温和、或严厉、或高傲、或迫切等等,这都是表象,不要太在意,面试是一个双向选择的过程,不要觉得自己低人一等,不卑不亢的把该说的说完就好,凡事不要强求,做好自己就好。 注:点击图片获取视频教程
2019年12月31日
5,846 阅读
0 评论
15 点赞
2019-12-31
移动端优化中最容易忽略的问题
不要不耐烦,当听到移动台的优化时,每个人似乎都不知所措。完成以上几点后,移动站和个人电脑站应该尽他们所能。(1)域名应尽可能短,并能在搜索列表中完整显示;(2)注意机器人文件的打开,不要担心为什么移动台没有排名。查看机器人文件时,搜索引擎禁止爬行。这种低级错误的情况太多了。(3)主要TKD标题标签和几个重要元标签的书写;(4)对于一些不能忽略的非常小的细节,你可以在网站上线前检查必须做的检查。 注:点击图片获取视频教程!
2019年12月31日
5,629 阅读
0 评论
10 点赞
2019-12-30
如何优化移动端网站?
随着近年来智能手机的普及,移动侧的流量越来越多。许多站长搜索引擎优化人员已经开始重视网站的流量运动。然而,有些人不太清楚网站移动终端的优化。今天一起来讨论如何优化移动终端网站和移动终端的优化技巧。手机网站优化技巧!一、域名和机器人设置1.域名应该尽可能短并且容易记住。手机网站的大多数域名都是个人电脑网站的二级域名。当然,这也很好。它与传统网站一致,让用户更加关注他们的信任。然而,如果它是一个特殊的手机网站,最好有一个简短且易于记忆的域名。例如,百度建议使用以m开头的二级域名2.最好没有任何限制地设置机器人,让所有搜索引擎抓取它们。此外,许多网站管理员犯的一个错误在这里得到了纠正。百度官员称,百度蜘蛛的爬虫UA是百度百科(www与M一致)。一些站长经常把百度移动爬虫的用户界面误认为是百度手机,事实并非如此。推荐阅读(搜索引擎优化签约技术的原则)第二,做好移动和个人电脑网站的改编和转换工作1.确保手机网站或个人电脑网站的每一页都有相应的导航或提示链接,以便用户可以在手机版本和个人电脑版本之间切换,并且可以更好地包含搜索引擎。2.百度官方声明:对于移动网站,当百度百科ua或其他来源无法确定的ua访问时,默认情况下建议直接返回html5或xhtml移动页面的类型,不要重定向到电脑页面。三、移动站和PC机站数据同步移动站和个人电脑站使用相同的顶级域名,前缀为M和www,这是最常见的方式。通常我们需要在优化这种移动台之前同步数据。移动站和个人计算机站共享同一个数据库,并且每个页面相互对应。然后我们需要做好移动适应工作。这种移动台不需要单独优化。只要完成了个人电脑站的排名,移动站的排名也将得到提升。四.适应性或响应性网站如今,适应性强或反应灵敏的网站越来越受欢迎。使用相同的域名和css来控制个人电脑和移动终端的显示方式可以被视为移动站和个人电脑站的组合。这种网站的优化既不需要移动适应也不需要移动终端的个体优化,而只需要根据个人计算机站的常规优化方法来维护该网站。 。五、手机网站尽可能简洁1.手机网站下载页面的速度比个人电脑网站慢。尽量将页数和尺寸保持在最小。2.此外,作为手机用户,用户浏览网页的时间是零碎的。不可能耐心地点击许多页面并直接向访问者展示页面的主要内容。因此,移动网站的设计应该尽可能简化。3.指导页面或购买过程应该尽可能简单,提供从访问者进入网站到购买的最简单步骤,直接丢弃那些多余的内容,并向访问者展示他们想要的东西。如果一个购买过程需要在购买时注册6或7个项目并填写更多的项目,恐怕下次不会再来了。六.优化网址:和电脑的原理一样七.各种html标签的优化:如“<strong\u\u”、“em”、“h”和“em”,它们与电脑端网站具有相同的含义。请记住:alt属性优化。移动终端中的位置比个人电脑终端中的位置高得多,因为许多移动电话用户不支持图片来节省流量,alt中的文本将被显示。推荐阅读(如何在网页上布局关键词)八、尽量避免使用弹出窗口、flash、java等行为:同理,flash和弹出窗口等行为会占据很大一部分流量,这无疑会浪费手机用户的时间和流量。九、遵循白皮书中百度移动搜索登陆页面体验规则十.优化页面标题标题和移动搜索引擎优化或个人电脑搜索引擎优化一样重要。十一.页面细节的优化1.独家手机网站标题标签。对于移动电话网站的第一页或频道的第一页的网络页面代码关键字和描述应该添加不同于电脑端的元标签和关键字。每一页上的关键词和描述都和传统个人电脑网站上的相似样本,做好有针对性的填写工作。这对搜索结果的显示(总结)和优化工作有很大帮助。2.减少死链。如果没有内容,最好用状态代码来指定,如404、403等。如果内容死亡链想要重定向到主页,最好跳过302而不是javascript。跳。十二.网站交换连接这是电脑端优化和移动端优化的重要组成部分。十三.确保搜索引擎蜘蛛找到你的内容不要犯404个错误。去每个网站管理员后台提交你的移动网站。移动电话网站修改或更改时执行301重定向。百度官员指出,对于手机网站的修改或域名的更改,新旧内容的映射应该尽可能简单。如果在域名变更过程中路径保持不变,负面影响会更小,影响时间也会更短。什么行业最需要成为移动网站这个问题,我可以明确告诉你,到目前为止,没有不需要移动站的行业网站,你可以去百度索引(Baidu Index)搜索你网站的关键词,看看移动网站的搜索比例。然而,这里有一个非常重要的一点要注意:成为一个本地服务行业的网站是移动台最需要的。从用户需求的角度来看,用户需要找到本地服务的相关需求。他肯定需要地址、电话号码、价格、地图指南和其他要求。至于用户需求,我已经详细解释了通过分析用户需求来确定网站名称的三个步骤。这种情况也是当地的服务需求,装饰行业也是如此。
2019年12月30日
5,787 阅读
0 评论
3 点赞
2019-12-28
如何减少网站的跳出率
网站跳出率是评判一个网站性能的重要指标,也一定程度说明网站是否对用户有吸引力。网站跳出率高说明网站对用户没有吸引力,反之说明网站对用户有吸引力。网站跳出率也是搜索引擎给网站评级的一个重要因素。对于网站跳出率的高低合适,不同网站类型、不同行业再或者同一个网站的不同网页跳出率都不同,这个没有统一标准。网站跳出率参考数据是:1%~35%用户体验度高,35%~80%用户体验度中等,80%~100%用户体验度低。降低网站跳出率的方法1.提高网站打开速度网站的打开速度是提高用户体验的前提,一般打开速度超过3秒,用户就有可能离开网站,所以对网站的跳出率有很大影响。这除了要有更好的服务器,网站本身的优化也是很重要的,如网站是否有做压缩,页面上的JS代码、CSS样式是否有采用外部调用形式、是否有精简代码,减少冗余代码、单个网页大小是否小于200KB等。2.页面设计清晰简单用户访问你的网站是想获取他想要的东西,不是来玩迷宫的,过于复杂的结构会让用户直接溜走。所以要求网站设计一定要一目了然,让用户快速直接查找自己想要的内容。3.信息新颖度娶媳妇都都还要年轻漂亮的呢,阅读一个网站,满屏的过时信息,你愿意去点击吗?在条件允许的状况下,尽量的多做更新。这样做的目的,不只仅是现有的排名,更是留住你的忠实客户!4.合理的站内链接就拿资讯网站来说,给相关的文字加上网站内相关的网页链接,展示相关文章等,另外有个实用的小技巧是,文章内容中的分页对于提交网站跳出率是挺有效的,当然要在合理的情况下。5.清晰的导航用户从搜索引擎搜索相关关键词进来,可能他需要了解更多与本文相关的内容,哪一个清晰的导航对于用户是很需要的,除了网站主导航,面包屑导航能让用户知道是在网站的哪个目录下,他还可以去哪个页面。6.搜索功能放在醒目的地方网站可以通过搜索功能方便用户查找想要的内容,从而留住用户。方法其实有很多,希望大家能慢慢探索! 注:点击图片获取视频教程
2019年12月28日
5,356 阅读
0 评论
22 点赞
2019-12-27
网站被降权了怎么办?
网站被降权这是一个seo不想面对的问题,因为网站被降权后会给网站带来一系列的问题。 那么如何发现自己的网站被降权呢,网站被降权后有哪些表现呢?又该怎样解决呢?网站被降权,最为明显的几大表现:1.site自己的网站时,发现网站首页不在第一位。2.网站收录大量下降。3.关键词排名下降。4.网站快照更新。5.流量暴跌网站被降权的原因1.服务器不稳定或者被攻击。服务器稳不稳定对网站来说很重要,如果搜索引擎来访时,你的网页却三天两头打不开,这样就无法获取网站信息,很容易导致降权。2.网站改版这里的改版包括:整站源码修改、首页TDK标签修改等。但这种情况,若是一次性改版完成,降权的几率会比较小。3.网站被黑。站内出现大量的垃圾页面等等。4.外链原因如果友链有被降权或k站,你和对方是友链关系,那就会被牵连降权;如果有垃圾外链,也会殃及你的网站。5.原创文章少假如你的网站的文章大部分是网络上采集的文章,原创的文章占比少,搜索引擎会认为你的网站不是一个优质的网站,没有优质的内容,网站就有被降权的风险。6.优化过度优化的时候一定要把握好度,大量堆积关键字、隐藏关键字等,这些投机取巧的优化方法百度早已可以识别了。7.百度算法异常误判整改方法1.选择正规稳定的服务器;排查网站服务器是否被攻击。2.网站被黑,就需要去找出被黑的文件,挖出病毒,清理被黑的内容。3.稳定更新高质量的原创内容。4.排查友情链接,是否有的友情链接打不开,或者有的友情链接被强权,在或者有的网站已经被黑,都需要去排查。5.注重各个细节的seo优化,切勿优化过度。网站被降权会给我们的网站带来很大的麻烦,所以一定要注意自己的优化工作,注意关注网站上的数据,然后避免出现网站被降权的情况。 注:点击图片获取视频教程。
2019年12月27日
5,787 阅读
0 评论
29 点赞
2019-12-24
微信小程序商城构建全栈应用
暂无简介
2019年12月24日
83 阅读
0 评论
0 点赞
2019-12-20
CentOS7.2 安装MySQL、PHP报错 Killed signal terminated program cc1
CentOS7.2 安装MySQL、PHP报错 Killed signal terminated program cc1,这个原因是由于内存不足导致的,可以通过增加交换分区来解决。 对于make编译,如果是阿里云centos主机内存小于2G的,可能会在make编译到45%、63%时报错;如果是腾讯云centos主机内存为1G时,可能会在make编译到64%时报错。===============阿里云测试结果(引用)================== c++: Internal error: Killed (program cc1plus) Please submit a full bug report. See <http://bugzilla.redhat.com/bugzilla> for instructions. make[2]: *** [sql/CMakeFiles/sql.dir/item_geofunc.cc.o] Error 1 make[1]: *** [sql/CMakeFiles/sql.dir/all] Error 2 make: *** [all] Error 2 ================腾讯云测试结果(实测)================= g++: fatal error: Killed signal terminated program cc1plus compilation terminated. make[2]: *** [sql/CMakeFiles/sql_gis.dir/gis/crosses.cc.o] Error 1 make[1]: *** [sql/CMakeFiles/sql_gis.dir/all] Error 2 make: *** [all] Error 2以上均为内存不足所致,可通过设置2G交换分区来解决该问题。解决方案:#获取要增加的2G的SWAP文件块 dd if=/dev/zero of=/swapfile bs=1k count=2048000 #创建SWAP文件 mkswap /swapfile #激活SWAP文件 swapon /swapfile #查看SWAP信息是否正确 swapon -s #添加到fstab文件中让系统引导时自动启动 echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstabswapfile文件的路径在/var/下,编译完后, 如果不想要交换分区了, 可以删除。删除交换分区:swapoff /swapfile rm -rf /swapfile至此,问题解决。
2019年12月20日
10,092 阅读
0 评论
66 点赞
2019-12-19
seo
网站地图是根据网站地图的结构,框架,内容生成的导航文件。网站地图对提高用户体验和网页收录很有帮助。什么是网站地图:在制作和提交网站地图前,先要了解什么是网站地图。网站地图也就是sitemap, 简单来说就是装着一个网站里面所有链接的的容器。它的作用就是为搜索引擎蜘蛛引路,方便引擎蜘蛛清晰了解网站结构和抓取网站页面,增加网站内容页面的收录。网站地图的作用:方便搜索引擎蜘蛛浏览网站的链接。向搜索引擎蜘蛛提供一些网站内的链接,指向一些动态页面和比较难到达的页面。便于用户查找网站的主要栏目,便于浏览。html网站地图对于小型站html网站地图可以列出网站所有的页面的链接,但是对于一个有一定规模的网站来说不可能列出所有连接,所以对于大站可以使用两种方法:第一.网站地图只列出最主要链接。第二.将网站地图分成几个文件,主网站地图列出通向次级网站地图,次级网站地图再列出部分页面链接。XML网站地图XML版本的网站地图是由goole首先提出的,怎么区分呢?上面所说的HTML版本中的sitemap首字母s是小字写的,XML版本中的S则是大写的。XML版本的网站地图是由XML标签组成的,文件本身必须UTF-8编码,网站地图文件实际上就是列出网站需要被收录的页面的URL。最简单的网站地图可以是一个纯文本文件,文件只要列出页面的URL,一行一个URL,搜索引擎就能抓取并理解文件内容。网站地图制作网站地图生成方法网上有很多,例如:小爬虫、网站地图爬虫在线工具、爱站工具包等。输入网站域名,选择合适的编码,然后点击生成。下载sitemap.xml文件和sitemap.html文件,上传到网站根目录,并且在首页做链接注:sitemap.xml作用是方便抓取页面,sitemap.html作用是方便用户浏览。登陆百度站长平台,提交sitemap.xml的链接。友情提醒:虽然网站地图网站收录速度和收录量,但是前提条件是保证网站内容质量要好,如果网站内容太差,使用网站地图也是没用!
2019年12月19日
60 阅读
0 评论
0 点赞
2019-12-19
新站做seo
网站地图是根据网站地图的结构,框架,内容生成的导航文件。网站地图对提高用户体验和网页收录很有帮助。什么是网站地图:在制作和提交网站地图前,先要了解什么是网站地图。网站地图也就是sitemap, 简单来说就是装着一个网站里面所有链接的的容器。它的作用就是为搜索引擎蜘蛛引路,方便引擎蜘蛛清晰了解网站结构和抓取网站页面,增加网站内容页面的收录。网站地图的作用:方便搜索引擎蜘蛛浏览网站的链接。向搜索引擎蜘蛛提供一些网站内的链接,指向一些动态页面和比较难到达的页面。便于用户查找网站的主要栏目,便于浏览。html网站地图对于小型站html网站地图可以列出网站所有的页面的链接,但是对于一个有一定规模的网站来说不可能列出所有连接,所以对于大站可以使用两种方法:第一.网站地图只列出最主要链接。第二.将网站地图分成几个文件,主网站地图列出通向次级网站地图,次级网站地图再列出部分页面链接。XML网站地图XML版本的网站地图是由goole首先提出的,怎么区分呢?上面所说的HTML版本中的sitemap首字母s是小字写的,XML版本中的S则是大写的。XML版本的网站地图是由XML标签组成的,文件本身必须UTF-8编码,网站地图文件实际上就是列出网站需要被收录的页面的URL。最简单的网站地图可以是一个纯文本文件,文件只要列出页面的URL,一行一个URL,搜索引擎就能抓取并理解文件内容。网站地图制作网站地图生成方法网上有很多,例如:小爬虫、网站地图爬虫在线工具、爱站工具包等。输入网站域名,选择合适的编码,然后点击生成。下载sitemap.xml文件和sitemap.html文件,上传到网站根目录,并且在首页做链接注:sitemap.xml作用是方便抓取页面,sitemap.html作用是方便用户浏览。登陆百度站长平台,提交sitemap.xml的链接。友情提醒:虽然网站地图网站收录速度和收录量,但是前提条件是保证网站内容质量要好,如果网站内容太差,使用网站地图也是没用!
2019年12月19日
93 阅读
0 评论
0 点赞
2019-12-19
如何制作和提交网站地图
网站地图是根据网站地图的结构,框架,内容生成的导航文件。网站地图对提高用户体验和网页收录很有帮助。什么是网站地图:在制作和提交网站地图前,先要了解什么是网站地图。网站地图也就是sitemap, 简单来说就是装着一个网站里面所有链接的的容器。它的作用就是为搜索引擎蜘蛛引路,方便引擎蜘蛛清晰了解网站结构和抓取网站页面,增加网站内容页面的收录。网站地图的作用:方便搜索引擎蜘蛛浏览网站的链接。向搜索引擎蜘蛛提供一些网站内的链接,指向一些动态页面和比较难到达的页面。便于用户查找网站的主要栏目,便于浏览。html网站地图对于小型站html网站地图可以列出网站所有的页面的链接,但是对于一个有一定规模的网站来说不可能列出所有连接,所以对于大站可以使用两种方法:第一.网站地图只列出最主要链接。第二.将网站地图分成几个文件,主网站地图列出通向次级网站地图,次级网站地图再列出部分页面链接。XML网站地图XML版本的网站地图是由goole首先提出的,怎么区分呢?上面所说的HTML版本中的sitemap首字母s是小字写的,XML版本中的S则是大写的。XML版本的网站地图是由XML标签组成的,文件本身必须UTF-8编码,网站地图文件实际上就是列出网站需要被收录的页面的URL。最简单的网站地图可以是一个纯文本文件,文件只要列出页面的URL,一行一个URL,搜索引擎就能抓取并理解文件内容。网站地图制作网站地图生成方法网上有很多,例如:小爬虫、网站地图爬虫在线工具、爱站工具包等。输入网站域名,选择合适的编码,然后点击生成。下载sitemap.xml文件和sitemap.html文件,上传到网站根目录,并且在首页做链接。注:sitemap.xml作用是方便搜索引擎抓取,抓取到的链接后放入robort.txt中。sitemap.html作用是方便用户浏览。登陆百度站长平台,提交sitemap.xml的链接。友情提醒:虽然网站地图网站收录速度和收录量,但是前提条件是保证网站内容质量要好,如果网站内容太差,使用网站地图也是没用!
2019年12月19日
5,930 阅读
0 评论
16 点赞
2019-12-17
视频制作AE模板婚庆婚礼片头模板抖音同款结婚纪念相册MV视频快闪
暂无简介
2019年12月17日
3,065 阅读
0 评论
65 点赞
2019-12-17
AE模板婚庆婚礼结婚纪念视频表白恋爱时尚大气璀璨电子相册照片
AE模板婚庆婚礼结婚纪念视频表白恋爱时尚大气璀璨电子相册照片
2019年12月17日
2,970 阅读
0 评论
20 点赞
2019-12-15
AE模板 简约唯美 爱情回忆记录婚礼迎宾开场电子相册婚纱照视频
暂无简介
2019年12月15日
3,095 阅读
0 评论
32 点赞
2019-12-01
wordpress如何在首页和分页中只显示标题不显示内容
安装好wordpress后,会发现文章标题和内容都会显示在首页,这不方便查找和阅读。最好的显示方式是只显示标题不显示内容。步骤如下——在/wp_conten/themes/twentyseventeen中找到index,php,用专门的编程软件打开(两个)将get_template_part( ‘template-parts/post/content’, get_post_format );改为get_template_part( ‘template-parts/post/content’, ‘excerpt’ );保存后刷新页面,查看效果。同理,分类目录也一样,找到archive.php.用同样的手法修改。
2019年12月01日
7,293 阅读
0 评论
14 点赞
2019-11-28
B2B网站优化技巧
b2b网站是什么 b2b是指Business to Business,而b2b网站是指提供企业对企业间电子商务活动平台的网站。 b2b网站的主要模式可分为三类:大型企业的b2b网站、第三方经营的b2b网站、行业生态型的b2b网站(B2B Web,Directindustry B2B)。不同类别的b2b网站有自己本身的特点和运作方式。 b2b电子商务中应用比较广泛的模式有:电子市场中心,电子分销商,B2B服务提供商,以及信息中介等。 b2b网站优化技巧 1、网站结构优化 网站的首页最好简洁明了。合理设置网站内部链接。尽量把用户关注程度很高的一些信息放在首页的明显的位置上面。制作好各个页面的返回和前进的按钮链接,方便用户选择访问,这有利于提高用户体验度。 首页在设计方面不要过于花哨复杂,也不要广告和弹窗太多,否则会显得不专业。这样的话就会影响网站的打开速度和影响用户体验;另外b2b网站比较重要的版块就是采购和供应信息,因此这一类的信息要实时的更新在网站的首页上面,而不是把自己公司的一些广告放在显眼位置。网站的服务器要选择一个比较较大空间而且打开速度比较快的服务器最好。 2、定期检查页面链接的有效性 无论内部链接还是外部链接,都需要定期检査,特别是外部链接,以及本公司网站在其他网站的友情链接,都要避免错误链接,定期检查所有链接是否有效,并关注链接页面与本页 面内容的相关度。 3、网站内容的更新 网站运营中,网站内容定期更新非常重要,需要长期坚持。更新内容的引入工作一般包括:企业信息的更新、产品供 需信息的更新、行业资讯信息的更新、人才招聘信息的更新、 社区、微博等娱乐平台的搭建等。 4、网站地图的优化b2b网站优化技巧 制作与优化简洁方便、易操作的网站模块列表、注册与登录界面、用户中心、帮助页面 等,站在用户角度考虑简化用户在网站的操作步骤,让用户能很方便快捷的熟悉B2B平台的主要功能和模块框架,能很便捷的找到自己关注的内容,并建立用户档案记录, 关注用户偏好,提供个性化的服务。网站地图还可以方便搜索 引擎蜘蛛程序抓取页面,找到一个便捷的路径来收录网站的各 级页面。 网站地图优化的内容主要有:为导航、栏目、功能和其他关键内容页面,以及网站内容关联性较大的网站制作网站地图 索引;为网站的内外部链接设计出一些关键词描述,并形成有价值的内容页面;考虑到一般搜索引擎蜘蛛只抓前三级页面,网站地图优化的内容重点在前三级页面。 b2b网站的推广策略 1、首先肯定还是需要保证网站被正常收录了,而且快照正常。 2、在一些b2b导航网站上发布外链,这样可以为网站带来流量提高网站知名度。 3、利用博客、分类信息、论坛、贴吧推广等途径,发布网站信息吸引用户流量。最好可以选择在一些比较活跃的行业论坛、贴吧等发布信息,这样效果更加好。 4、邮件群发和QQ群推广 尽管这种方法都被大家鄙视,不过很多时候最简单的方法也会起到很好的效果,采集企业网站上面的那些QQ号进行群发邮件来推荐我们的网站,另外就是加入一些行业QQ群进行发布广告,宣传我们的网站可以发布信息而且百度收录情况良好。 5、宣传活动策划 可以定期的策划一些活动,比如说定期赠送一些免费的VIP会员或者是VIP会员价格优惠等等,再或者是定期抽奖活动,获奖的企业可以将他们的广告放在我们的B2B网站首页一个比较明显的广告位上,这些都会激发用户的积极性和互动性,这也是网站在前期没有名气的时候可以采用的一些方法和技巧。 6、投放联盟广告 这个就需要投资了,不过在投放的前期资金量也不会很大,在百度联盟投放广告,有展示量但是不一定别人就会点击进去,不过时间长了,用户在各个网站上都会看到我们投放的信息,慢慢的就会点击进去注册,不过这个时候消费的资金就会多起来了,但是也是一个必须要的先期投入吧。
2019年11月28日
6,243 阅读
0 评论
10 点赞
2019-11-26
SEO优化过程中需要分析哪些数据
网站优化程度与否,有很多因素导致。俗话说,网站优化离不开数据分析。那么,在SEO优化过程中需要分析哪些数据呢?让我们深入研究一下。 SEO优化过程中需要分析哪些数据: 1、关键字排名 网站关键字排名是优化网站的核心,通过搜索引擎检索关键词,给网站带来更多流量。 所以,SEO优化,根据关键词排名,有针对性的对关键词进行优化。 2、网站收录量 虽然,网站收录页数与排名没有直接关系,但是网站收录页数越多,参与排名的网页就越多。 后期,网站可以利用内容页面做大量的长尾关键词排名,从而带来准确的流量。 3、网站浏览量 位于该地址的计算机访问该网站的次数。 网站流量是核心,通过流量统计分析客户从哪个平台来访问优化的网站,根据入口平台,针对性做排名。 4、外链 高质量的外部链对于关键词排名起着重要的作用. 分析外部链和平台数量,总结和收集质量更高的外链平台,有针对性发布外部链。 5、uv(独立访客) 网站通过访问计算机的cookie来判断访问计算机的身份。 如果改变了IP,但是cookie没有清除,然后访问了相同的网站,那么网站统计的uv数量不变。 6、PV(浏览页数) PV反映访问页面的数量,所以每次刷新也要计算,这意味着PV与访问者的数量成正比,但PV不是页面的访问者数量,而是网站访问的页面数量。 7、跳出率(只访问了入口页面就离开的访问量与所产生总访问量的百分比) 跳出率,可以从侧面评估用户对这个网站或这个页面的偏好,跳出率高低也可以从侧面反映这个网站或这个页面内容丰富性和用户需求。 当谈到seo网站优化时,数据分析是重中之重。以上就是seo小编为中小企业提供的优化技术指导。如果您需要了解更多关于SEO优化的信息,工具和优化技术,成功案例 注:点击图片获取视频教程
2019年11月26日
5,973 阅读
0 评论
30 点赞
2019-11-24
新站做seo要注意八大问题
新站做seo要注意八大问题1、 网站被收录后不要频繁更换网站的关键词、标题、描述等。这样容易造成网站页面和百度收录的页面产生差异造成快照异常,还会降低用户体验。最终会影响网站排名,严重会造成网站被k掉。2、 维护网站空间稳定性。百度一向不喜欢稳定性差、经常打不开、运行慢的网站,稳定性差的网站蜘蛛会减少对网站网页的抓取或者不抓取。3、 分析竞争对手。竞争对手也是我们seo中的最好老师。俗话说:知己知彼,才能百战百胜,我们可以通过对竞争对手做一些从构架到关键词布局方面的分析,文章内部链接和文章内容质量,以及快照和收录、相关域总数的概况统计,来提升自身能力。4、 原创内容、高质量外链、高质量友链交换是关键词排名出现的前提。所以请告别内容采集、大量内容复制、所谓的伪原创软件生成的内容。5、 使用友好的网站结构和框架。网站中不要过多使用flash,尽量使用DIV+CSS,导航栏设计的栏目要具有更好的相关性,提高用户的体验性。路径URL最好使用静态,可以提高访问速度。6、 合理选取关键词。关键词选取是我们工作中重点,要懂得辨别哪些关键词有流量转化率不高,哪些关键词排名搜索量小但是针对性专业性很强,不要盲目追求。7、 不要将多个域名绑定一个网站,或者使用重复内容复制成多个网站,这是作弊行为。8、 不要购买外链和友链。 注:点击图片获取视频教程。
2019年11月24日
5,926 阅读
0 评论
13 点赞
2019-11-24
如何做好seo搜索引擎引擎优化?
作为一名新手seo或者想走seo方向的萌新要如何做好seo搜索引擎优化呢?请记住以下五点,关键词挖掘、结构的优化、数据的分析、原创内容、增加外链。想要做好这五点还是不容易,还是需要新手们要好好学习理解,想做好seo可不是一件容易的事,要保持耐心。一、关键词挖掘 关键词挖掘是网站发展壮大中非常关键的一点,也是一个网站的灵魂核心。在网站开发前期就应该选择一个好的关键词,好的关键词决定一个网站的走向。在网站确定走向后接下来就要丰富网站内容,那就要对长尾关键词进行挖掘了,这对增加网站流量扩展潜在客户起重要作用。 想要做好关键词挖掘工作,那就要了解挖掘工具有哪些,网上常用的有站长之家、百度站长,还有内部搜索引擎也是不错选择哦!二、结构优化 结构的优化这个很关键,关键词是网站的灵魂核心,那么网站结构就是网站的骨骼。要想优化好结构首先你得会简单的前端代码和CSS样式,这是一个做seo的前期基本功,有了这些基础就可以去做一个符合搜索引擎结构的网站。1.TDK优化(title、description、keywords)T是title即网站标题,标题是蜘蛛过来第一个看的东西,即第一印象,标题必须包含关键词,即网站的功能,网站是做什么产品或是服务的,语句通顺,不要堆砌关键词。D即description,网站描述,是对标题的进一步补充。K即keywords,关键词。2、制作301重定向和404报错页面的制作。3、 层级目录:即打开一个页面要多少层级,这个很多网站都忽略,建议在一个网站的层级目录不要太多,保持在三个左右。层数太多增加蜘蛛爬取需要的时间,这不符合蜘蛛喜好。4、关键词布局及密度:根据用户点击热力图分析用户的需求,进而将关键词部署到最佳的地方,通过不断地对关键词进行优化,提高用户体验度。关键词的密度不要过多密集,关键词密度过多会造成关键词堆砌,很容易造成网站权重降低。关键词密度最好保持在2%-8%之内。 三、数据统计分析数据分析是指使用适当的统计分析方法收集大量数据进行分析,提取有用的信息和数据进行研究总结,它对于百度排名来说非常关键。通过数据分析可以获取用户的需求,根据用户的需求改进网站内容,这不仅提高用户体验还符合搜索引擎规则。四、增加原创内容 搜索引擎喜欢原创内容,搜索引擎会优先收录原创内容,补充其数据库。原创内容不仅对新建的网站起重要作用,对于老站也非常重要。所以一个网站想提高权重就一定要提高原创内容的比重!五、增加外链增加外链会对网站排名起明显作用。1、 提高网站权重。2、 吸引蜘蛛来抓取网站。3、 可以提高关键词排名。4、 可以提高网站或品牌知名度。5、 可以带来更多流量。友情提醒:外链的增加也需要循环渐进,不能操之过急。 注:点击图片获取视频教程。
2019年11月24日
6,286 阅读
0 评论
52 点赞
2019-11-17
极客学院Java视频教程
暂无简介
2019年11月17日
5,969 阅读
0 评论
38 点赞
2019-11-13
seo优化视频教程
SEO的主要工作是通过了解各类搜索引擎如何抓取互联网页面、如何进行索引以及如何确定其对某一特定关键词的搜索结果排名等技术,来对网页进行相关的优化,使其提高搜索引擎排名,从而提高网站访问量。
2019年11月13日
12,156 阅读
0 评论
12 点赞
2019-11-12
PHP常见面试题
1. 问题:经常浏览那些技术性网站? v2ex,csdn2. 问题:写出五个与数组相关的函数。array_chunk 、array_unique、sort、array_column、array_merg3. 问题:“===”是什么?与“==”有什么区别?试举一个例子?=== 是全等 要求值和类型相等== 要求值相等,不判断类型4. 写出PHP序列化与JOSN相关的函数?如果要保存到数据库,你选择哪一种,为什么?JSON序列化和反序列化json_encode($arr)、json_encode($arr, true)json_encode($arr)5. 用过的PHP框架,博客/CMS系统,及商城系统有哪些?哪个最熟悉?用过的框架ThinkPHP5,cms:dedecms、fastadmin,商城:EcShop 6. MYSQL中常用的表类型(存储引擎)有哪些? Mysql存储引擎,myisam、innodb7. Composer是什么?PSR(PHP Standards Recommendations)是什么意识/大概包含什么内容?Composer是PHP包依赖管理工具 8. Session与Cookie的区别?如何设置一个严格30分钟过期的Session?Session严格30分钟过期1. 设置Cookie过期时间30分钟, 并设置Session的lifetime也为30分钟.2. 自己为每一个Session值增加Time stamp.3. 每次访问之前, 判断时间戳. 1,冒泡排序很实用要记得 functionmaopao($arr){ $len=count($arr); $n=count($arr)-1; for($i=0;$i<$len;$i++){ for($j=0;$j<$n;$j++){ if($arr[$j]<$arr[$j+1]){ $temp=$arr[$j+1]; $arr[$j+1] =$arr[$j]; $arr[$j] =$temp; } } } return $arr;}2,快速排序functionquick_sort($array) { if(count($array) <= 1)return $array; $key=$array[0]; $left_arr=array(); $right_arr=array(); for($i=1;$i<count($array);$i++){ if($array[$i] <=$key) $left_arr[] =$array[$i]; else $right_arr[] =$array[$i]; } $left_arr= quick_sort($left_arr); $right_arr= quick_sort($right_arr); return array_merge($left_arr,array($key),$right_arr); }
2019年11月12日
5,643 阅读
0 评论
17 点赞
2019-10-26
数据库表字段类型与合理的选择字段类型
字段类型数值MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或者用零填补(ZEROFILL)。INT在 MySQL 中支持的 5 个主要整数类型是 TINYINT,SMALLINT,MEDIUMINT,INT 和 BIGINT。这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展(如 INT(6),6即是其宽度指示器,该宽度指示器并不会影响int列存储字段的大小,也就是说,超过6位它不会自动截取,依然会存储,只有超过它本身的存储范围才会截取;此处宽度指示器的作用在于该字段是否有zerofill,如果有就未满足6位的部分就会用0来填充),这样当从数据库检索一个值时,可以把这个值加长到指定的长度。例如,指定一个字段的类型为 INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。万一我们需要对一个字段存储一个超出许可范围的数字,MySQL 会根据允许范围最接近它的一端截短后再进行存储。还有一个比较特别的地方是,MySQL 会在不合规定的值插入表前自动修改为 0。unsigned 和 zerofillUNSIGNED 修饰符规定字段只保存正值,即无符号,而mysql字段默认是有符号的。因为不需要保存数字的正、负符号,可以在储时节约一个"位"的空间(即翻一倍)。从而增大这个字段可以存储的值的范围。注意这个修饰符要紧跟在数值类型后面;ZEROFILL 修饰符规定 0(不是空格)可以用来真补输出的值。使用这个修饰符可以阻止 MySQL 数据库存储负值,如果某列设置为zerofill,那它自动就unsigned。这个值要配合int,tinyint,smallint,midiumint等字段的宽度指示器来用;XXint(M),如果没有zerofill,这个M的宽度指示器是没有意义的.(注意,测试前导0的时候,还是去黑窗口测试;)为什么mysql存储的值要分有符号和无符号呢?因为一个字节,占8bit;也就1个bit有0和1两种可能,8个bit就是2^8 = 256种可能,也就是0~255;但如果是有符号的话,就得拿一个1bit来存储这个负号,本来8bit只剩7bit,2^7 = 128,也就是-128~127(正数部分包含一个0);FLOAT、DOUBLE 和 DECIMAL 类型MySQL 支持的三个浮点类型是 FLOAT、DOUBLE 和 DECIMAL 类型。FLOAT 数值类型用于表示单精度浮点数值,而 DOUBLE 数值类型用于表示双精度浮点数值。与整数一样,这些类型也带有附加参数:一个显示宽度指示器和一个小数点指示器(必须要带有指示器,要不然会查不到结果,并且宽度指示器和XXint类型的宽度指示器不同,这里是有实际限制宽度的)。比如语句 FLOAT(7,3) 规定显示的值不会超过 7 位数字(包括小数位),小数点后面带有 3 位数字。对于小数点后面的位数超过允许范围的值,MySQL 会自动将它四舍五入为最接近它的值,再插入它。DECIMAL 数据类型用于精度要求非常高的计算中,这种类型允许指定数值的精度和计数方法作为选择参数。精度在这里指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的位数。比如语句 DECIMAL(7,3) 规定了存储的值不会超过 7 位数字,并且小数点后不超过 3 位。FLOAT 类型在长度比较高比如 float(10,2)和 decimal(10,2)同时插入一个符合(10,2)宽度的数值,float 就会出现最后小数点出现一些出入;UNSIGNED 和 ZEROFILL 修饰符也可以被 FLOAT、DOUBLE 和 DECIMAL 数据类型使用。并且效果与 INT 数据类型相同。关于flaot和double在这里我建议,干脆忘记mysql有double这个数据类型。至于why?就不要管它了字符串类型MySQL 提供了 8 个基本的字符串类型,可以存储的范围从简单的一个字符到巨大的文本块或二进制字符串数据。BINARYBINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写SELECT BINARY 'ABCD' = 'abcd' as COM1,'ABCD' = 'abcd' as COM2; -- COM1输出为0,COM2输出为1;CHAR 和 VARCHAR 类型CHAR 类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。这个大小修饰符的范围从 0-255。比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补。CHAR 类型可以使用 BINARY 修饰符。当用于比较运算时,这个修饰符使 CHAR 以二进制方式参于运算,而不是以传统的区分大小写的方式。CHAR 类型的一个变体是 VARCHAR 类型。它是一种可变长度的字符串类型,并且也必须带有一个范围在 0-255 之间的指示器。CHAR 和 VARCHGAR 不同之处在于 MYSQL 数据库处理这个指示器的方式:CHAR 把这个大小视为值的大小,不长度不足的情况下就用空格补足。而 VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度(增加一个额外字节来存储字符串本身的长度)来存储值。所以短于指示器长度的 VARCHAR 类型不会被空格填补,但长于指示器的值仍然会被截短。因为 VARCHAR 类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率。但如果确切知道字符串长度,比如就在50~55之间,那就用 CHAR 因为 CHAR 类型由于本身定长的特性使其性能要高于 VARCHAR;VARCHAR 类型在使用 BINARY 修饰符时与 CHAR 类型完全相同。TEXT 和 BLOB 类型对于字段长度要求超过 255 个的情况下,MySQL 提供了 TEXT 和 BLOB 两种类型。根据存储数据的大小,它们都有不同的子类型。这些大型的数据用于存储文本块或图像、声音文件等二进制数据类型。TEXT 和 BLOB 类型在分类和比较上存在区别。BLOB 类型区分大小写,而 TEXT 不区分大小写。大小修饰符不用于各种 BLOB 和 TEXT 子类型。比指定类型支持的最大范围大的值将被自动截短。时间类型在处理日期和时间类型的值时,MySQL 带有 5 个不同的数据类型可供选择。DATE、TIME 和 YEAR 类型MySQL 用 DATE 和 YEAR 类型存储简单的日期值,使用 TIME 类型存储时间值。这些类型可以描述为字符串或不带分隔符的整数序列。如果描述为字符串,DATE 类型的值应该使用连字号作为分隔符分开,而 TIME 类型的值应该使用冒号作为分隔符分开。需要注意的是,没有冒号分隔符的 TIME 类型值,将会被 MySQL 理解为持续的时间,而不是时间戳。MySQL 还对日期的年份中的两个数字的值,或是 SQL 语句中为 YEAR 类型输入的两个数字进行最大限度的通译。因为所有 YEAR 类型的值必须用 4 个数字存储。MySQL 试图将 2 个数字的年份转换为 4 个数字的值。把在 00-69 范围内的值转换到 2000-2069 范围内。把 70-99 范围内的值转换到 1970-1979 之内。如果 MySQL 自动转换后的值并不符合我们的需要,请输入 4 个数字表示的年份。DATETIME 和 TIMESTAMP 类型除了日期和时间数据类型,MySQL 还支持 DATETIME 和 TIMESTAMP 这两种混合类型。它们可以把日期和时间作为单个的值进行存储。这两种类型通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。如果我们对 TIMESTAMP 类型的字段没有明确赋值,或是被赋与了 null 值。MySQL 会自动使用系统当前的日期和时间来填充它。复合类型MySQL 还支持两种复合数据类型 ENUM 和 SET,它们扩展了 SQL 规范。虽然这些类型在技术上是字符串类型,但是可以被视为不同的数据类型。一个 ENUM 类型只允许从一个集合中取得一个值;而 SET 类型允许从一个集合中取得任意多个值。ENUM 类型ENUM 类型因为只允许在集合中取得一个值,有点类似于单选项。在处理相互排拆的数据时容易让人理解,比如人类的性别。ENUM 类型字段可以从集合中取得一个值或使用 null 值,除此之外的输入将会使 MySQL 在这个字段中插入一个空字符串。另外如果插入值的大小写与集合中值的大小写不匹配,MySQL 会自动使用插入值的大小写转换成与集合中大小写一致的值。ENUM 类型在系统内部可以存储为数字,并且从 1 开始用数字做索引。一个 ENUM 类型最多可以包含 65536 个元素,其中一个元素被 MySQL 保留,用来存储错误信息,这个错误值用索引 0 或者一个空字符串表示。MySQL 认为 ENUM 类型集合中出现的值是合法输入,除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为 0 的行就可以很容易地找到错误记录的位置。SET 类型SET 类型与 ENUM 类型相似但不相同。SET 类型可以从预定义的集合中取得任意数量的值。并且与 ENUM 类型相同的是任何试图在 SET 类型字段中插入非预定义的值都会使 MySQL 插入一个空字符串。如果插入一个即有合法的元素又有非法的元素的记录,MySQL 将会保留合法的元素,除去非法的元素。一个 SET 类型最多可以包含 64 项元素。还去除了重复的元素,所以 SET 类型中不可能包含两个相同的元素。希望从 SET 类型字段中找出非法的记录只需查找包含空字符串或二进制值为 0 的行。字段类型总结虽然上面列出了很多字段类型,但最常用也就是 varchar(255),char(255),text,tinyint(4),smallint(6),mediumint,int(11)几种。复合类型我们一般用tinyint,更快的时间更省的空间以及更容易扩展关于手机号,推荐用char(11),char(11)在查询上更有效率,因为手机号是一个活跃字段参与逻辑会很多。一些常用字段举例姓名:char(20)价格:DECIMAL(7, 3)产品序列号:SMALLINT(5) unsigned文章内容: TEXTMD5: CHAR(32)ip: char(15)time: int(10)email char(32)合理的选择数据类型选择合理范围内最小的我们应该选择最小的数据范围,因为这样可以大大减少磁盘空间及磁盘I/0读写开销,减少内存占用,减少CPU的占用率。选择相对简单的数据类型数字类型相对字符串类型要简单的多,尤其是在比较运算时,所以我们应该选择最简单的数据类型,比如说在保存时间时,因为PHP可以良好的处理LINUX时间戳所以我们可以将日期存为int(10)要方便、合适、快速的多。但是,工作中随着项目越做越多,业务逻辑的处理越来越难以后,我发现时间类型还是用时间类型本身的字段类型要好一些,因为mysql有着丰富的时间函数供我使用,方便我完成很多与时间相关的逻辑,比如月排行榜,周排行榜,当日热门,生日多少天等等逻辑不要使用null为什么这么说呢,因为MYSQL对NULL字段索引优化不佳,增加更多的计算难度,同时在保存与处理NULL类形时,也会做更多的工作,所以从效率上来说,不建议用过多的NULL。有些值他确实有可能没有值,怎么办呢?解决方法是数值弄用整数0,字符串用空来定义默认值即可。字符串类型的使用字符串数据类型是一个万能数据类型,可以储存数值、字符串、日期等。保存数值类型最好不要用字符串数据类型,这样存储的空间显然是会更大,而且在排序时字符串的9是大于22的,其实如果进行运算时mysql会将字符串转换为数值类型,大大降低效果,而且这种转换是不会走原有的索引的。如果明确数据在一个完整的集合中如男,女,那么可以使用set或enum数据类型,这种数据类型在运算及储存时以数值方式操作,所以效率要比字符串更好,同时空间占用更少。VARCHAR与CHARVARCHAR是可变长度字符串类型,那么即然长度是可变的就会使用1,2个字节来保存字符的长度,如果长度在255内使用1个字节来保存字符长度,否则使用2个字符来保存长度。由于varchar是根据储存的值来保存数据,所以可以大大节约磁盘空间。如果数据经常被执行更新操作,由于VARCHAR是根据内容来进行储存的,所以mysql将做更多的工作来完成更新操作,如果新数据长度大于老数据长度一些存储引擎会进行拆分操作处理。同时varchar会完全保留内部所有数据,最典型的说明就是尾部的空格。CHAR固定长度的字符串保存类型,CHAR会去掉尾部的空格。在数据长度相近时使用char类型比较合适,比如md5加密的密码用户名等。如果数据经常进行更新修改操作,那么CHAR更好些,因为char长度固定,性能上要快。数值类型的选择数值数据类型要比字符串执行更快,区间小的数据类型占用空间更少,处理速度更快,如tinyint可比bigint要快的多选择数据类型时要考虑内容长度,比如是保存毫米单位还是米而选择不同的数值类型整数整数类型很多比如tinyint、int、smallint、bigint等,那么我们要根据自己需要存储的数据长度决定使用的类型,同时tinyint(10)与tinyint(100)在储存与计算上并无任何差别,区别只是显示层面上,但是我们也要选择适合合适的数据类型长度。可以通过指定zerofill属性查看显示时区别。浮点数与精度数值浮点数float在储存空间及运行效率上要优于精度数值类型decimal,但float与double会有舍入错误而decimal则可以提供更加准确的小数级精确运算不会有错误产生计算更精确,适用于金融类型数据的存储。
2019年10月26日
5,549 阅读
0 评论
24 点赞
2019-10-26
centos7搭建lnmp开发环境
centos7搭建lnmp开发环境一、安装axel1. 在shell中运行 yum install axel进行安装用yum安装如果没有的话需要安装EPEL源(Extra Packages for Enterprise Linux),为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS等,里面有1万多个软件安装 epel-releasewget https://mirrors.ustc.edu.cn/epel//7/x86\_64/Packages/e/epel-release-7-11.noarch.rpm rpm -ivh epel-release-7-11.noarch.rpm##更新yum源yum clean all yum update2. 安装后可以用axel --version查看版本。检测是否安装成功。二、安装nginx1. 安装依赖包nginx依赖ssl,rewrite,gzip 3个包,如果没有c++编译环境需要用下面命令安装。yum install gcc-c++2. 建立目录先在home目录下建一个nginx文件夹。然后进入文件。(nginx、openssl、zlib、pcre直接下载到这个文件夹,解压也是解压到这个文件夹,都安装好后直接删除即可。)cd home mkdir nginx cd nginx3. openssl库安装ssl功能需要安装openssl库 ,官网:https://www.openssl.org。建立文件夹/alidata/library/做为这3个库的安装目录。统一放一个文件夹,日后如果想卸载,直接删除就可以。在library下面再建立openssl、zlib、pcre三个文件夹。做为那3个库的安装目录。参考:https://blacksaildivision.com/how-to-install-openssl-on-centoswget https://www.openssl.org/source/openssl-1.1.1a.tar.gz yum install libtool perl-core zlib-devel -y #安装响应的组件 tar -zxvf openssl-1.1.1a.tar.gz cd openssl-1.1.1a ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib make && make install vi /etc/profile.d/openssl.sh # /etc/profile.d/openssl.sh pathmunge /usr/local/openssl/bin vi /etc/ld.so.conf.d/openssl-1.1.0g.conf # /etc/ld.so/conf.d/openssl-1.1.0g.conf /usr/local/openssl/lib #执行命令使openssl新版本lib路径生效 ldconfig -v #重开shell4. 安装zlib库gzip模块需要安装zlib库,官网:http://www.zlib.net。(axel -n 后面的10是一次性建立10个连接下载)axel -n 10 http://www.zlib.net/zlib-1.2.11.tar.gz tar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./configure --prefix=/alidata/library/zlib && make && make install5. 安装pcre库rewrite模块需要pcre库,官网:http://www.pcre.org。axel -n 10 https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz tar -zxvf pcre-8.41.tar.gz cd pcre-8.41 ./configure --prefix=/alidata/library/pcre && make && make install6. nginx的编译安装下载nginx,nginx的官网是http://nginx.org/。我们直接下载最新版本的nginx-1.14.2。在/alidata下建立server,然后在server下面分别建立nginx、mysql、php。后面会分别把对应的软件安装到这几个文件夹里。(--prefix:nginx的安装目录 ,--with-pcre:pcre的源码目录,--with-zlib和--with-openssl同理)axel -n 10 http://nginx.org/download/nginx-1.14.2.tar.gz tar -zxvf nginx-1.14.2.tar.gz cd nginx-1.14.2 ./configure \ --prefix=/alidata/server/nginx \ --with-http_realip_module \ --with-http_sub_module \ --with-http_flv_module \ --with-http_dav_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-http_addition_module \ --with-pcre=/home/nginx/pcre-8.41 \ --with-openssl=/home/nginx/openssl-1.1.1a \ --with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers' \ --with-http_ssl_module \ --with-http_v2_module \ --with-zlib=/home/nginx/zlib-1.2.11 && make && make install7. 检查nginx是否安装成功检查nginx是否安装成功,如果出现下图信息,表示安装成功。cd /alidata/server/nginx/sbin ./nginx -t8. 常用命令nginx的几个常用命令:查看Nginx的版本号:./nginx -v启动Nginx:./nginx快速停止或关闭Nginx:./nginx -s stop正常停止或关闭Nginx:./nginx -s quit配置文件修改重装载命令:./nginx -s reload9. 将nginx加入系统命令vi /etc/init.d/nginx加入下面代码#!/bin/bash #nginx Startup script for the Nginx HTTP Server # it is v.0.0.2 version. # chkconfig: - 85 15 # description: Nginx is a high-performance web and proxy server. # It has a lot of features, but it's not for everyone. # processname: nginx # pidfile: /var/run/nginx.pid # config: /usr/local/nginx/conf/nginx.conf nginxd=/alidata/server/nginx/sbin/nginx nginx_config=/alidata/server/nginx/conf/nginx.conf nginx_pid=/alidata/server/nginx/run/nginx.pid RETVAL=0 prog="nginx" # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ [${NETWORKING} = "no"] ] && exit 0 [ -x $nginxd ] || exit 0 # Start nginx daemons functions. start() { if [ -e $nginx_pid ];then echo "nginx already running...." exit 1 fi echo -n $"Starting $prog: " daemon $nginxd -c ${nginx_config} RETVAL=$? echo [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx return $RETVAL } # Stop nginx daemons functions. stop() { echo -n $"Stopping $prog: " killproc $nginxd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /alidata/server/nginx/run/nginx.pid } # reload nginx service functions. reload() { echo -n $"Reloading $prog: " #kill -HUP `cat ${nginx_pid}` killproc $nginxd -HUP RETVAL=$? echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) stop start ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|reload|status|help}" exit 1 esac exit $RETVAL保存上面的代码。然后添加到系统服务中。chmod 755 /etc/init.d/nginx chkconfig --add nginx10. 在系统服务目录中创建nginx.service文件vi /lib/systemd/system/nginx.service加入下面的代码[Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/alidata/server/nginx/sbin/nginx ExecReload=/alidata/server/nginx/sbin/nginx -s reload ExecStop=/alidata/server/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target保存。再执行重加载systemctl daemon-reload设置开机启动systemctl enable nginx.service10. nginx服务命令配置好之后nginx就可以用系统服务的方式操作了。service nginx start 启动nginxservice nginx stop 关闭nginxservice nginx restart 重启nginxservice nginx reload 重新加载nginx三、安装php1. 下载php安装包新建一个文件夹/home/php文件夹存放php的安装文件。php的官网:http://www.php.net/下载php的最新版本php-7.3.1axel -n 10 http://cn2.php.net/distributions/php-7.3.1.tar.gz2. 解压压缩包tar -zxvf php-7.3.1.tar.gz cd php-7.3.13. 安装依赖库先安装php需要的依赖库(直接复制进去一次性安装好)yum -y install libxml2 yum -y install libxml2-devel yum -y install openssl yum -y install openssl-devel yum -y install curl-devel yum -y install libjpeg-devel yum -y install libpng-devel yum -y install freetype-devel yum -y install bzip2-devel yum -y install libmcrypt libmcrypt-devel yum -y install postgresql-devel yum -y install aspell-devel yum -y install readline-devel yum -y install libxslt-devel yum -y install net-snmp-devel yum -y install unixODBC-devel yum -y install libicu-devel yum -y install libc-client-devel yum -y install libXpm-devel yum -y install libvpx-devel yum -y install enchant-devel yum -y install openldap yum -y install openldap-devel yum -y install db4-devel yum -y install gmp-devel yum -y install sqlite-devel yum -y install mysql-devel如果cmake版本低于3.0.2需要升级wget https://cmake.org/files/v3.13/cmake-3.13.0.tar.gz tar -zxvf cmake-3.13.0.tar.gz cd cmake-3.13.0 ./bootstrap --prefix=/usr/ make && make install cmake --versionlibzip安装wget https://libzip.org/download/libzip-1.5.1.tar.gz tar -zxvf libzip-1.5.1.tar.gz cd libzip-1.5.1 mkdir build && cd build && cmake .. && make && make install echo '/usr/local/lib64 /usr/local/lib /usr/lib /usr/lib64'>>/etc/ld.so.conf&&ldconfig -v4. 添加用户和组groupadd -r www && adduser -r -g www -s /bin/false -d /alidata/www -M www查看用户cat /etc/passwd查看组cat /etc/group5. 对php7进行配置下面代码按需求修改后全部复制进去一次性执行(php7.3去掉 --with-mcrypt, --enable-gd-native-ttf, --with-libmbfl)./configure \ --prefix=/alidata/server/php \ --with-config-file-path=/alidata/server/php/etc \ --enable-fpm \ --with-fpm-user=www \ --with-fpm-group=www \ --enable-inline-optimization \ --disable-debug \ --disable-rpath \ --enable-shared \ --enable-soap \ --with-xmlrpc \ --with-openssl \ --with-pcre-regex \ --with-sqlite3 \ --with-zlib \ --enable-bcmath \ --with-iconv \ --with-bz2 \ --enable-calendar \ --with-curl \ --with-cdb \ --enable-dom \ --enable-exif \ --enable-fileinfo \ --enable-filter \ --with-pcre-dir \ --enable-ftp \ --with-gd \ --with-openssl-dir \ --with-jpeg-dir \ --with-png-dir \ --with-freetype-dir \ --with-gettext \ --with-gmp \ --with-mhash \ --enable-json \ --enable-mbstring \ --enable-mbregex \ --enable-mbregex-backtrack \ --with-onig \ --enable-pdo \ --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-zlib-dir \ --with-pdo-sqlite \ --with-readline \ --enable-session \ --enable-shmop \ --enable-simplexml \ --enable-sockets \ --enable-sysvmsg \ --enable-sysvsem \ --enable-sysvshm \ --enable-wddx \ --with-libxml-dir \ --with-xsl \ --enable-zip \ --enable-mysqlnd-compression-support \ --with-pear \ --enable-opcache \ --enable-pcntl \ --enable-posix6. 编译安装php7make && make install看到下图信息说明安装成功 (如果重新编译需要先make clean清理之前的已经编译的可执行文件)7. 查看php版本/alidata/server/php/bin/php -v8. 创建配置文件创建www.conf配置文件cd /alidata/server/php/etc/php-fpm.d cp www.conf.default www.conf创建php-fpm.conf配置文件cd /alidata/server/php/etc cp php-fpm.conf.default php-fpm.conf创建php.ini配置文件将安装源文件目录里的php.ini-production或者php.ini-development修改后缀拷贝到php安装目录的etc文件夹内cd /home/php/php-7.3.1 cp php.ini-production /alidata/server/php/etc/php.ini9. 将bin和sbin路径加入到path变量中。配置环境变量vim /etc/profile加入下面内容PATH=/user/local/cmake/bin:$PATH PATH=/alidata/server/mysql/bin:$PATH PATH=/alidata/server/php/bin:$PATH export PATH保存后执行source命令使配置立即生效source /etc/profile10. 配置php-fpm到系统服务cp /home/php/php-7.3.1/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm chmod 755 /etc/init.d/php-fpm配置php-fpm.confvim /alidata/server/php/etc/php-fpm.conf将pid(;pid = run/php-fpm.pid)前的;去掉。12. 配置开机自动启动chkconfig --add /etc/init.d/php-fpm chkconfig php-fpm on13. 配置nginx解析php文件cd /alidata/server/nginx/conf vim nginx.conf将php解析前的#都去掉,如下图。然后保存修改。 location ~ .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; }nginx重新加载配置文件service nginx reload14. 创建一个php文件如果设置了根目录,在根目录里面新建vi /alidata/server/nginx/html/phpinfo.php输入如下代码<?php phpinfo(); ?>保存配置没问题就会看到下面的页面四、安装mysq1. 下载mysql下载mysql,官网地址:https://www.mysql.com/axel -n 10 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.13.tar.gzyum localinstall https://repo.mysql.com//mysql80-community-release-el7-2.noarch.rpmyum -c /etc/yum.conf --installroot=/alidata/server/mysql -y install mysql-community-server2. 解压压缩包tar -zxvf mysql-8.0.13.tar.gz3. 安装编译需要的软件包yum -y install make bison-devel ncurses-devel libaio libaio-devel perl-Data-Dumper net-tools4. 编译配置重新cmake需要删除CMakeCache.txt文件cd mysql-8.0.13 cmake . \ -DCMAKE_INSTALL_PREFIX=/alidata/server/mysql \ -DMYSQL_DATADIR=/alidata/server/mysql/data \ -DSYSCONFDIR=/etc \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \ -DMYSQL_TCP_PORT=3306 \ -DENABLED_LOCAL_INFILE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DEXTRA_CHARSETS=all \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DDOWNLOAD_BOOST=1 \ -DWITH_BOOST=/alidata/server/boost(注:如果boost已经安装过在配置里面去掉-DDOWNLOAD_BOOST=1,这个配置是用来下载boost。另外配置boost的安装目录 -DWITH_BOOST。其他的按需要配置即可。)5. 编译安装make && make install6. 创建mysql用户和组groupadd -r mysql && adduser -r -g mysql -s /bin/false -M mysql7. 修改mysql的权限chown -R mysql:mysql /alidata/server/mysql8. 数据库初始化cd /alidata/server/mysql/bin ./mysqld --initialize --basedir=/alidata/server/mysql --datadir=/alidata/server/mysql/data --user=mysql9. 加入到系统服务cp /alidata/server/mysql/support-files/mysql.server /etc/init.d/mysql chmod 755 /etc/init.d/mysql chkconfig --add mysql10. 配置my.cnfvim /etc/my.cnf修改对应的配置[mysqld] datadir=/alidata/server/mysql/data socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd [mysqld_safe] log-error=/alidata/server/mysql/log/mariadb.log pid-file=/alidata/server/mysql/log/run/mariadb.pid # # include all files from the config directory # !includedir /etc/my.cnf.d保存文件后建立mysql.sock的存放目录,并分配给mysql用户和组mkdir /var/lib/mysql chown -R mysql:mysql /var/lib/mysql创建日志文件mariadb.logtouch /alidata/server/mysql/log/mariadb.log cd /alidata/server/mysql/log chown -R mysql:mysql mariadb.log11. 启动mysqlservice mysql start如果启动有问题可以查看mariadb.log日志里面的[ERROR]部分。12. 修改初始密码,mysql登录查看mysql的初始密码???用初始密码登录mysql???cd /alidata/server/mysql/bin ./mysql -uroot -p登录后修改密码alter user user() identified by "你的新密码";修改用户的MySQL的密码认证插件是“mysql_native_password”alter user 'root'@'localhost' identified with mysql_native_password by '密码'; flush privileges;查询用户的密码插件信息use mysql select plugin,authentication_string,host,user from user;允许远程访问my.cnf添加下面参数重启数据库 default_authentication_plugin=mysql_native_password 创建用户 create user 'root'@'%' identified by 'mysql的密码'; grant all on *.* to 'root'@'%'; flush privileges;13. 配置环境变量vim /etc/profile加入下面内容export PATH=$JAVA_HOME/bin:$PATH:/alidata/server/php/bin:/alidata/server/php/sbin:/alidata/server/mysql/bin保存后执行source命令使配置立即生效source /etc/profile到这为止,lnmp的环境就配置完成了。五、安装redis下载redisaxel -n 10 http://download.redis.io/releases/redis-5.0.3.tar.gz tar -zxvf redis-5.0.3.tar.gz cd redis-5.0.3安装redismake PREFIX=/alidata/server/redis/ install配置redis新建数据目录和日志目录mkdir /alidata/server/redis/data mkdir /alidata/server/redis/log cp ./redis.conf /alidata/server/redis/ vim /alidata/server/redis/redis.conf编辑内容# IP绑定 bind 127.0.0.1 192.168.0.111 # 保护模式(开启条件为各redis之间可以互相通信,做集群不可开启) protected-mode yes # 访问端口 port 6379 # 连接超时,单位S,0为不启用超时 timeout 0 # 以守护进程运行 daemonize yes # 数据文件路径 dir /alidata/server/redis/data # 进程ID文件的路径 pidfile /alidata/server/redis/log/redis.pid # 日志文件路径 logfile /alidata/server/redis/log/redis.log # 设置登陆密码 requirepass [redis的密码] # 禁用部分危险命令 rename-command FLUSHALL "" rename-command CONFIG "" rename-command EVAL "" # 开启键过期删除通知 notify-keyspace-events Ex性能优化# 编辑/etc/rc.local vim /etc/rc.local echo never > /sys/kernel/mm/transparent_hugepage/enabled # 添加/etc/rc.local执行权限 chmod +x /etc/rc.d/rc.local # 编辑/etc/sysctl.conf vim /etc/sysctl.conf vm.overcommit_memory = 1 net.core.somaxconn = 1024 # 立即解决 echo never > /sys/kernel/mm/transparent_hugepage/enabled echo 1024 > /proc/sys/net/core/somaxconn sysctl vm.overcommit_memory=1 sysctl -p修改目录归属useradd -s /sbin/nologin -M redis chown -R redis:redis /alidata/server/redis启动redis并设置开机启动# 进入单元文件目录 cd /etc/systemd/system # 创建redis单元文件,格式为: [单元文件名].[单元文件类型] vim redis.service [Unit] Description=Start redis on boot. After=default.target network.target [Service] User=redis Group=redis Type=forking PIDFile=/alidata/server/redis/log/redis.pid ExecStart=/alidata/server/redis/bin/redis-server /alidata/server/redis/redis.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=false #Restart=always [Install] WantedBy=multi-user.target # 修改文件权限为只有root用户可以编辑该文件 chown -R root:root /etc/systemd/system/redis.service chmod -R 644 /etc/systemd/system/redis.service # 更新systemd systemctl daemon-reload systemctl enable redis systemctl start redisredis加入系统服务cp /home/redis/redis-5.0.3/utils/redis_init_script /etc/init.d/redis # 编辑/etc/init.d/redis 直接用systemctl控制开启和关闭redis # start 部分修改 #$EXEC $CONF systemctl start redis # stop 部分修改 #PID=$(cat $PIDFILE) echo "Stopping ..." #$CLIEXEC -p $REDISPORT shutdown #while [ -x /proc/${PID} ] #do # echo "Waiting for Redis to shutdown ..." # sleep 1 #done systemctl stop redis#如果没有设置开机启动 执行chkconfig redis on配置环境变量vim /etc/profile PATH=/alidata/server/redis/bin:$PATH # 使配置生效 source /etc/profile六、php安装redis扩展安装igbinary和phpredis扩展如果phpize动态编译报错Cannot find autoconf yum install m4 yum install autoconf wget http://pecl.php.net/get/igbinary-2.0.7.tgz tar -zxvf igbinary-2.0.7.tgz cd igbinary-2.0.7 phpize ./configure make && make install wget https://github.com/nicolasff/phpredis/archive/4.0.2.tar.gz tar -zxvf 4.0.2.tar.gz cd 4.0.2 #用phpize生成configure配置文件 phpize ./configure --with-php-config=/alidata/server/php/bin/php-config make && make install配置php.ini在php.ini最后一行加上 extension_dir = '/【php安装路径】/lib/php/extensions/no-debug-non-zts-20160303/' extension=igbinary.so extension=redis.so 重启php-fpm和Nginx,完成。七、php扩展trie-filter安装libiconv这个是libdatrie的依赖项wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz tar zxvf libiconv-1.15.tar.gz cd libiconv-1.15 ./configure make make install //查看版本 iconv --version 如果报 iconv: error while loading shared libraries: libiconv.so.2 ldconfig安装libdatrie最新版本下载站点https://github.com/tlwg/libdatrie/releaseswget https://github.com/tlwg/libdatrie/releases/download/v0.2.12/libdatrie-0.2.12.tar.xz tar xvJf libdatrie-0.2.12.tar.xz cd libdatrie-0.2.12 ./configure --prefix=/usr/local/libdatrie LDFLAGS=-L/usr/local/lib LIBS=-liconv make make install安装trie-filter扩展git clone https://github.com/zzjin/php-ext-trie-filter cd php-ext-trie-filter phpize ./configure --with-php-config=/alidata/server/php/bin/php-config --with-trie_filter=/usr/local/libdatrie make make install在php.ini文件最后加上extension=trie_filter.so,保存配置并重启php八、php开启opcache1. 配置php.ini文件在php的安装目录配置php.ini文件添加opcache扩展extension_dir = '/alidata/server/php/lib/php/extensions/no-debug-non-zts-20160303/' zend_extension=opcache.so配置opcache[opcache] 1. 开关打开 opcache.enable=1 2. 开启CLI opcache.enable_cli=1 3. 可用内存, 酌情而定, 单位为:Mb opcache.memory_consumption=528 4. Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB) opcache.interned_strings_buffer=8 5. 对多缓存文件限制, 命中率不到 100% 的话, 可以试着提高这个值 opcache.max_accelerated_files=10000 6. Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 定位为秒 注意:0是一直检查不是关闭,推荐 60 opcache.revalidate_freq=60 7. 打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高 opcache.fast_shutdown=1
2019年10月26日
5,163 阅读
0 评论
3 点赞
2019-10-13
python2.7.5+windows+64位系统安装文件
python2.7.5+windows+64位系统安装文件下载
2019年10月13日
6,837 阅读
0 评论
8 点赞
2019-09-13
常用正则表达式
([\s\S]*?) 表示任意多个字符,换行也可以匹配 ([\s*]+) 匹配一个或多个空格 ([\s,]+) 匹配多个空格或逗号 ([,]+) 匹配多个逗号 /php/i 不区分大小写 ^ $ 匹配开始结束字符 . 匹配除换行以外字符串 ? 0次 或 1次 等价{0,1} * 0次 或 多次 等价{0,} + 1次 或 多次 等价{1,} - 表示范围 [] 开始结束字符类定义 \d 任意10进制数字 [0-9] \s 任意空白字符 单个 \S 任意非空白字符 \w 任意单词字符 等价[a-zA-Z0-9] (?:中国|美国)(.*) 匹配中国,美国开头的字符串 (\d+\.\d+\.\d+\.\d+) IP ([a-zA-Z][a-zA-Z0-9_]) 匹配是否合法字母开头 (\d-\d|\d-\d) 电话号码 [1-9][0-9] qq ^[\w\.\-]+@\w+([\.\-]\w+)*\.\w+$ email href="(.*?)" 超链接/^\d{1,6}$/ 匹配0-999999/\d{4}年\d{1,2}月\d{1,2}/ 匹配年月日preg_math 匹配一次,成功返回 truepreg_match("/\<center>([\s\S]*?)<\/center\>/",$str,$rs);preg_match_all匹配多次,成功返回truepreg_match_all("/\<center>([\s\S]*?)<\/center\>/",$str,$rs);preg_replace 匹配替换,替换成$re$rs =preg_replace("/\<center>([\s\S]*?)<\/center\>/",$re,$str);preg_split分割成数组$arr = preg_split('/([\s*]+)/',"a b c d ef");替换$str = "选项[http://127.0.0.1/weixin/addons/yoby_diyform/weui/fm.jpg]你好"; $str1 = preg_replace("/(?:\[)(.*?)(?:\])/i", "<img src=\"\${1}\" />", $str);preg_replace("/.*\|(.*?)\|.*/i", "\${1}", $v); 字符|120000|来了 输出120000\s+ 多个空白[^>] >左边任意字符.*? 任意多个字符\d+ 匹配数字/*获取html并用正则处理*/function get_content($url){ $html = file_get_contents($url); $code= mb_detect_encoding($html, array("GB2312","GBK",'UTF-8','BIG5'));//获取编码 if($code!="UTF-8"){ $htmls = mb_convert_encoding($html, "UTF-8", $code);//转换内容为UTF-8编码 }else{ $htmls = $html; } $htmls = preg_replace("/<script[\s\S]*?<\/script>/i","",$htmls,-1);//去除script $htmls = preg_replace("/<noscript[\s\S]*?<\/noscript>/i","",$htmls,-1);//去除noscript $htmls=preg_replace("/<(\/?link.*?)>/si","",$htmls);//去掉link $htmls=preg_replace("/<(style.*?)>(.*?)<(\/style.*?)>/si","",$htmls);//去掉style $htmls =preg_replace("/style=.+?['|\"]/i",'',$htmls,-1);//去除style行内样式 $htmls =preg_replace('#<!--[^\!\[]*?(?<!\/\/)-->#' , '' , $htmls);//去掉html注释 $htmls = preg_replace("/<a[^>]*>(.*?)<\/a>/is", "$1", $htmls);//去除外站超链接 $htmls = preg_replace("/(\n\r)/i", '', $htmls); //去掉空行 return $htmls;} preg_match('/<div class="infoBox-list".*?>.*?<div class="news-page clearfix">/ism', $htmls, $rs); $htmls = $rs[0];//获取两个class之间内容 $url = (preg_match('/^http(s)?:\\/\\/.+/',$url))?$url:"http://".$url;//判断是否包含https/httppreg_match("/src=\"\/?(.*?)\"/",$content,$match);第一张图片[\u4e00-\u9fa5]{0,} 匹配中文 \d+ 匹配>=0数字[a-zA-Z]+ 不区分大小写26个字母[A-Za-z0-9]+ 英文与数字 \s+ 多个空格[0-9]* 匹配一串数字 \d{4} 匹配四位数字 \d{5,} 匹配至少5位数 \d{4,10} 匹配4-10位数
2019年09月13日
21,664 阅读
0 评论
2 点赞
2019-09-13
二分查找算法
二分查找思路分析:数组中间的值floor((low+top)/2)先取数组中间的值floor((low+top)/2)然后通过与所需查找的数字进行比较,若比中间值大则将首值替换为中间位置下一个位置,继续第一步的操作;若比中间值小,则将尾值替换为中间位置上一个位置,继续第一步操作重复第二步操作直至找出目标数字function BinaryQuery(array $container, $search){ $top = count($container); $low = 0; while ($low <= $top) { $mid = intval(floor(($low + $top) / 2)); if (!isset($container[$mid])) { return '没找着哦'; } if ($container[$mid] == $search) { return $mid; } $container[$mid] < $search && $low = $mid + 1; $container[$mid] > $search && $top = $mid - 1; }}递归版 二分查找function BinaryQueryRecursive(array $container, $search, $low = 0, $top = 'default'){ $top == 'default' && $top = count($container); if ($low <= $top) { $mid = intval(floor($low + $top) / 2); if (!isset($container[$mid])) { return '没找着哦'; } if ($container[$mid] == $search) { return $mid; } if ($container[$mid] < $search) { return BinaryQueryRecursive($container, $search, $mid + 1, $top); } else { return BinaryQueryRecursive($container, $search, $low, $mid - 1); } }}
2019年09月13日
5,669 阅读
0 评论
1 点赞
2019-09-13
网站托管、云服务器、网站建设、服务器环境安装维护
网站托管最适用于访问量较低或中等的网站,这些网站具有多名作者且内容更改较为频繁,例如营销网站、内容网站或博客。它们为未来可能会扩展的网站提供了一个简单起点。尽管这些站点的成本通常较低,但它们仍需对 Web 服务器进行 IT 管理。最适用于:基于 WordPress、Joomla、Drupal、Magento 等常见应用程序构建的网站基于 LAMP、LEMP、MEAN、Node.Js 等常见开发堆栈构建的网站无法扩展至超过 5 台服务器的网站希望管理自己的 Web 服务器和资源的客户希望使用一个控制台来管理 Web 服务器、DNS 和网络连接的客户网站安全维护① 7*24小时网站全方位监控② 域名、空间到期时间提醒③ 流量实时监控,定时木马病毒查杀④ 解决企业网站稳定性的难题
2019年09月13日
3,074 阅读
0 评论
17 点赞
2019-09-01
crontab计划任务误删除恢复方法
本来想执行 crontab -e的,没想到手一抖就输入了crontab ,然后就进入了下面这个样子。 一看不对劲,就随手按了 Ctrl + D。 接下来,恐怖的事情发生了,crontab的所有任务都被清空了。 查找资料发现如下: 如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按<Ctrl-D>,否则你将丢失crontab文件。 自己删的crontab,跪着也要找回来。 crontab有运行日志,在日志里面可以找到执行过的历史命令。前提是要有root权限。cat /var/log/cron* | grep CMD | awk -F'CMD' '{print $2}' | awk -F'[(|)]' '{print $2}' | sort -u 由此得到系统记录过的 crontab 执行命令,过滤其他账号的命令后即可追回目标账号的 crontab 任务。 grep CMD 可以改为 grep "(root) CMD" root 为某账号的crontab 。 命令是找回了,可是执行周期呢?cat /var/log/cron*|grep "(root) CMD"|grep "/data/scripts/send_mail.sh"|sort|uniq
2019年09月01日
7,656 阅读
0 评论
4 点赞
2019-08-26
mysql常用sql语句整理
常用sql语句整理:mysql增增加一张表CREATE TABLE `table_name`( ... )ENGINE=InnoDB DEFAULT CHARSET=utf8;增加记录INSERT INTO `your_table_name`(`column_name`)VALUES('your_value_one'),('your_value_two');增加字段ALTER TABLE `your_table_name` ADD `your_column_name` ...AFTER `column_name`;增加索引ALTER TABLE `your_table_name` ADD PRIMARY KEY your_index_name(your_column_name);ALTER TABLE `your_table_name` ADD UNIQUE your_index_name(your_column_name);ALTER TABLE `your_table_name` ADD INDEX your_index_name(your_column_name);ALTER TABLE `your_table_name` ADD FULLTEXT your_index_name(your_column_name);全文索引普通索引唯一索引主键删逐行删除DELETE FORM `table_name` WHERE ...;清空整张表TRUNCATE TABLE `your_table_name`;删除表DROP TABLE `your_table_name`;删除字段ALTER TABLE `your_table_name` DROP `column_name`;删除索引ALTER TABLE `your_table_name` DROP INDEX your_index_name(your_column_name);改变更数据UPDATE `table_name` SET column_name=your_value WHERE ...;变更字段ALTER TABLE `your_table_name` CHANGE `your_column_name` `your_column_name` ...(变更);变更字段值为另一张表的某个值UPDATE `your_table_name` AS a JOIN `your_anther_table_name` AS b SET a.column = b.anther_column WHERE a.id = b.a_id...;查普通查询SELECT `column_name_one`, `column_name_two` FROM `table_name`;关联查询SELECT *FROM `your_table_name` AS a JOIN `your_anther_table_name` AS b WHERE a.column_name = b.column_name...;合计函数条件查询:WHERE 关键字无法与合计函数一起使用SELECT aggregate_function(column_name)FROM your_table_name GROUP BY column_name HAVING aggregate_function(column_name)...;同一个实例下跨库查询SELECT *FROM database_name.your_table_name AS a JOIN another_database_name.your_another_table_name AS b WHERE a.column_name = b.column_name...;复制一张表结构CREATE TABLE `your_table_name` LIKE `destination_table_name`;完全复制一张表:表结构+全部数据CREATE TABLE `your_table_name` LIKE `destination_table_name`;INSERT INTO `your_table_name` SELECT *FROM `destination_table_name`;附录:mysql常用命令登陆: mysql -h host -u username -p列出数据库:SHOW DATABESES;列出表:SHOW TABLES;列出表结构:DESC table_name使用一个数据库:USE database_name;导入:source 'file';导出:mysqldump -h 127.0.0.1 -u root -p "database_name" "table_name" --where="condition" > file_name.sql;查看慢日志:mysqldumpslow -s [c:按记录次数排序/t:时间/l:锁定时间/r:返回的记录数] -t [n:前n条数据] -g "正则" /path新增用户: insert into user(Host, User, authentication_string) value('localhost', 'username', password('pwd'))mysql 5.7 新增用户// 插入新用户insert into mysql.user(Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subjectvalue('localhost', 'username', password('password'), '', '', '');// 数据库授权grant all privileges on dbname.name.* to username@localhost identified by 'password';// 刷新权限信息FLUSH PRIVILEGES;
2019年08月26日
6,067 阅读
0 评论
1 点赞
2019-08-26
PHP获取用户基本信息
PHP获取用户基本信息<?php namespace app\home\controller; use think\Controller; define("APPID", ""); define('SECRET', ""); class WeChat extends Controller { //获取用户基本信息 public function getUser() { $appid=APPID; $secret=SECRET; // access_token 调用接口凭证,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同 // openid 普通用户的标识,对当前公众号唯一 //避免重复发送授权链接。已经获取用户信息,刷新页面,获得重新返回该页面,导致相同的授权链接再次请求,产生错误。 //把获取的用户信息保存,每次发送请求前,检查是否已经获取,如果已经获取用户信息,就不再请求。 //提示errcode":40163,"errmsg":"code been used。说明code被使用过一次了,code只能用一次。 //判断是否发送获取code连接 if (input('code')) { //获取到code判断code是否已经被使用过 if (!cache('code_array')){ //通过code获取access_token $code = input('code'); $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$secret&code=$code&grant_type=authorization_code"; $result=$this->request($url); if (!$result) { return false; } $arr=json_decode($result,true); cache('code_array',$arr,7200); } //获取access_token,openid $code_array=cache('code_array'); $access_token=$code_array['access_token']; $openid=$code_array['openid']; $url="https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN"; $result=$this->request($url); if (!$result) { return false; } //$arr 用户信息数组 $arr=json_decode($result,true); return $arr; }else{ //发送获取code连接 $url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=*****网站地址*****&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect"; //发送GET请求 header("Location: ".$url); exit();//必要 } } /* *发送GET请求方法 *@param string $url URL *@param bool $ssl 是否为https协议 *@return string 响应主体内容 */ private function request($url,$data=null){ $curl=curl_init(); curl_setopt($curl, CURLOPT_URL, $url); //设定为不验证证书和host curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if(!empty($data)){ curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } // 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出 curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); $output=curl_exec($curl); if (false===$output) { echo "<br/>",curl_error($curl),"<br/>"; return false; } curl_close($curl); return $output; } }
2019年08月26日
7,261 阅读
0 评论
6 点赞
2019-08-26
PHP获取微信access_token
PHP获取微信access_token<?php namespace app\home\controller; use think\Controller; define("APPID", ""); define('SECRET', ""); class WeChat extends Controller { /** *获取access_token */ public function getAccessToken() { $appid=APPID; $secret=SECRET; //access_token暂存地址在和入口文件同级目录下 $token_file='access_token.txt'; //判断access_token文件是否已经过期,未过期直接返回文件内容 $life_time=7200; if (file_exists($token_file) && time()-filemtime($token_file)<$life_time) { return file_get_contents($token_file); } //若是文件过期根据URL重新获取access_token $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret"; //发送GET请求 $result=$this->request($url); if (!$result) { return false; } //获取响应返回结果 $arr=json_decode($result,true); //将access_token保存在文件中 file_put_contents($token_file, $arr['access_token']); return $arr['access_token']; } /* *发送GET请求方法 *@param string $url URL *@param bool $ssl 是否为https协议 *@return string 响应主体内容 */ private function request($url,$data=null){ $curl=curl_init(); curl_setopt($curl, CURLOPT_URL, $url); //设定为不验证证书和host curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if(!empty($data)){ curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } // 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出 curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); $output=curl_exec($curl); if (false===$output) { echo "<br/>",curl_error($curl),"<br/>"; return false; } curl_close($curl); return $output; } }
2019年08月26日
5,788 阅读
0 评论
1 点赞
2019-08-26
PHP身份证验证类
<?php /** *身份证号处理函数 */ /** * 功能:根据身份证号,自动返回生日 * @param stirng $IDCard 身份证号 * @return Ambigous <string, NULL> */ function getBrithday ($idCard) { if (strlen($idCard) == 18) { $birthday = substr($idCard, 6, 4) . '-' . substr($idCard, 10, 2) . '-' . substr($idCard, 12, 2); } elseif (strlen($idCard) == 15) { $birthday = "19" . substr($idCard, 6, 2) . '-' . substr($idCard, 8, 2) . '-' . substr($idCard, 10, 2); } else { $birthday = null; } return $birthday; } /** * 功能:根据身份证号,自动返回性别 * @param string $cid 身份证号 * @param number $comm 返回的性别类型 * @return string 男/女 1/0 */ function getSex ($cid, $comm = 0) { $cid = getIDCard($cid); $sexint = (int) substr($cid, 16, 1); if ($comm > 0) { return $sexint % 2 === 0 ? '女' : '男'; } else { return $sexint % 2 === 0 ? '0' : '1'; } } /** * 功能:把15位身份证转换成18位 * @param string $idCard * @return newid or id */ function getIDCard ($idCard) { // 若是15位,则转换成18位;否则直接返回ID if (15 == strlen($idCard)) { $w = array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1); $a = array("1","0","X","9","8","7","6","5","4","3","2"); $s = 0; $idCard18 = substr($idCard, 0, 6) . "19" . substr($idCard, 6); $idCard18_len = strlen($idCard18); for ($i = 0; $i < $idCard18_len; $i ++) { $s = $s + substr($idCard18, $i, 1) * $w[$i]; } return $idCard18.$a[$s % 11]; } else { return $idCard; } } /** * 根据身份证号返回年龄 * @param string $id 身份证号 * @return string|number */ function getAge($id){ //过了这年的生日才算多了1周岁 if(empty($id)) return ''; $date=strtotime(substr($id,6,8)); //获得出生年月日的时间戳 $today=strtotime('today'); //获得今日的时间戳 $diff=floor(($today-$date)/86400/365); //得到两个日期相差的大体年数 //strtotime加上这个年数后得到那日的时间戳后与今日的时间戳相比 $age=strtotime(substr($id,6,8).' +'.$diff.'years')>$today?($diff+1):$diff; return $age; }
2019年08月26日
5,638 阅读
0 评论
0 点赞
2019-08-26
百度地图两点坐标距离计算
百度地图两点坐标距离计算/** * * 根据两点的经纬度计算距离 * @author zhengshaozhuo * @version 2015-08-10 */ function calc_distance_by_pos($o_lat, $o_lng, $t_lat, $t_lng){ $pk = 180 / 3.14169; $_a1 = $o_lat / $pk; $_a2 = $o_lng / $pk; $_b1 = $t_lat / $pk; $_b2 = $t_lng / $pk; $t1 = cos($_a1) * cos($_a2) * cos($_b1) * cos($_b2); $t2 = cos($_a1) * sin($_a2) * cos($_b1) * sin($_b2); $t3 = sin($_a1) * sin($_b1); $tt = acos($t1 + $t2 + $t3); return (int)(6366000 * $tt); }
2019年08月26日
5,566 阅读
0 评论
4 点赞
2019-08-26
PHP地理位置计算
<?php // Geohash // @url: http://blog.jobbole.com/80633/ /** *求两个已知经纬度之间的距离,单位为米 *@param lng1,lng2 经度 *@param lat1,lat2 纬度 *@return float 距离,单位米 **/ function getdistance($lng1,$lat1,$lng2,$lat2){ //将角度转为狐度 $radLat1=deg2rad($lat1);//deg2rad()函数将角度转换为弧度 $radLat2=deg2rad($lat2); $radLng1=deg2rad($lng1); $radLng2=deg2rad($lng2); $a=$radLat1-$radLat2; $b=$radLng1-$radLng2; $s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6378.137*1000; return intval($s); } function distanceConvert($s){ $s = intval($s); if($s <= 0){ return '附近'; }elseif($s > 0 && $s <= 1000){ return $s.'m'; }elseif($s > 1000 && $s <= 2000){ return '<2km'; }elseif($s > 2000 && $s <= 3000){ return '<3km'; }elseif($s > 3000 && $s <= 4000){ return '<4km'; }elseif($s > 4000 && $s <= 5000){ return '<5km'; }elseif($s > 5000){ return '>5km'; } } /** * 根据条件获取商户列表 * @param string $lng * @param string $lat * @param string $city_id * @param string $district_id * @param string $type_id * @param string $search * @return mixed */ //如果存在经纬度则考虑范围5公里内数据,如果不存在经纬度,则不考虑 public function GetShopList($navigationId = 0,$page = 1,$size =10 ,$lng = '', $lat ='', $city_id = '',$district_id = '',$type_id = '',$search = '') { $field = 'id,province_id,city_id,district_id,navigation_id,type_id,name,phone,address,logo,stime,etime,rule,activity,discount,latitude,longitude,status,token,sort,description,gmt_created'; $where = array( 'is_deleted' => 0, 'is_show' => 1, 'navigation_id'=>$navigationId, ); //判断城市,县区,分类是否存在 if(!empty($city_id)){ $where['city_id|province_id'] = $city_id; } if(!empty($district_id)){ $where['district_id'] = $district_id; } if(!empty($type_id)){ $where['type_id'] = $type_id; } if(!empty($search)){ $where['name'] = array('like',"%{$search}%"); } $offset = ($page * $size) - ($size - 1); //如果存在经纬度,就根据经纬度查询5公里范围内数据 if(!empty($lng) && !empty($lat)) { // //求出半径 // $radius = 5;//半径范围,单位km // $rangeLat = 180 / pi() * $radius / 6372.797;//纬度范围 // $rangeLng = $rangeLat / cos($lat * pi() / 180.0); //经度范围 // $maxLat = $lat + $rangeLat; //x1 // $minLat = $lat - $rangeLat; //x0 // $maxLng = $lng + $rangeLng; //y1 // $minLng = $lng - $rangeLng; //y0 // // $where['latitude'] = array(array('lt',$maxLat),array('gt',$minLat)); // $where['longitude'] = array(array('lt',$maxLng),array('gt',$minLng)); $list = $this->where($where)->field($field)->order("abs(longitude - {$lng}) + abs(latitude - {$lat})")->limit($offset,$size)->select(); }else{ $list = $this->where($where)->field($field)->order('sort asc')->limit($offset,$size)->select(); } //记录错误日志 if ($list === false) { wLog('GetShopList error! sql:' . $this->getLastSql(), $this->errorFile); wLog('GetShopList error! errorInfo:' . $this->error, $this->errorFile); } //wLog('GetShopList sql:' . $this->getLastSql(), $this->errorFile); return $list; }
2019年08月26日
4,455 阅读
0 评论
0 点赞
2019-08-26
PHP原生生成EXCEL
<?php /*** * 生成excle文件 ***/ $time = time(); $filename = date("Y年m月d日h点m分s秒", $time).'问卷数据'; $rows = Sp_Looks_Vote::downvote(); $file = $filename.".csv"; header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); $tabletitle .= "购买地址,常常购买,喜欢模特,内容如何,印象如何,是否购买,感觉如何,购买方式,购买方式建议,吸引点,改进建议"; $conter = iconv('utf-8','gbk',$tabletitle)."\n"; echo $conter;die; /*** * 生成word文件 ***/ header("Content-Type: application/msword"); header("Content-Disposition: attachment; filename=doc.doc"); header("Pragma: no-cache"); header("Expires: 0"); $output = '<table border="1" cellspacing="2" cellpadding="2" width="90%" align="center">'; $output .= '<tr bgcolor="#cccccc"><td align="center">图片</td></tr>'; $output .= '<tr bgcolor="#f6f7fa"><td><span style="color:#FF0000;"><strong>下面是一张图片</strong></span& gt;</td></tr>'; $output .= '<tr><td align="center"><img src="http://zi.csdn.net/48260_2.gif"></td></tr>'; $output .= '</table>'; echo $output; ?>
2019年08月26日
3,473 阅读
0 评论
0 点赞
2019-08-26
PHP获取服务器状态
PHP获取服务器状态:<?php function get_server_status() { $fp = popen('top -b -n 2 | grep -E "^(Cpu|Mem|Tasks)"', "r");//获取某一时刻系统cpu和内存使用情况 $rs = ""; while (!feof($fp)) { $rs .= fread($fp, 1024); } pclose($fp); $sys_info = explode("\n", $rs); $tast_info = explode(",", $sys_info[3]);//进程 数组 $cpu_info = explode(",", $sys_info[4]); //CPU占有量 数组 $mem_info = explode(",", $sys_info[5]); //内存占有量 数组 //正在运行的进程数 $tast_running = trim(trim($tast_info[1], 'running')); //CPU占有量 $cpu_usage = trim(trim($cpu_info[0], 'Cpu(s): '), '%us'); //百分比 //内存占有量 $mem_total = trim(trim($mem_info[0], 'Mem: '), 'k total'); $mem_used = trim($mem_info[1], 'k used'); $mem_usage = round(100 * intval($mem_used) / intval($mem_total), 2); //百分比 /*硬盘使用率 begin*/ $fp = popen('df -lh | grep -E "^(/)"', "r"); $rs = fread($fp, 1024); pclose($fp); $rs = preg_replace("/\s{2,}/", ' ', $rs); //把多个空格换成 “_” $hd = explode(" ", $rs); $hd_avail = trim($hd[3], 'G'); //磁盘可用空间大小 单位G $hd_usage = trim($hd[4], '%'); //挂载点 百分比 /*硬盘使用率 end*/ //检测时间 $fp = popen("date +\"%Y-%m-%d %H:%M\"", "r"); $rs = fread($fp, 1024); pclose($fp); $detection_time = trim($rs); return array( 'cpu_usage' => $cpu_usage, 'mem_usage' => $mem_usage, 'hd_avail' => $hd_avail, 'hd_usage' => $hd_usage, 'tast_running' => $tast_running, 'detection_time' => $detection_time ); }
2019年08月26日
3,909 阅读
0 评论
2 点赞
2019-08-26
下单与支付流程的两种设计方案
两种方案两个分开事务过程 通常是创建订单,再支付,这适用于在线支付(第三方在线支付),可以先创建订单,可以此后再选择订单去支付。同一个事务内 另一种直接扣余额的订单(不支持第三方在线支付),其实可以创建订单和支付用一步就可以,订单生成就意味着支付了,只有成功支付才会生成订单,下单和支付放在一个事物内了。订单与支付 一般情况下,请求一次支付会创建一个订单,如果没支付的订单就不显示而已,这是为了,让创建订单和支付像是一步一样,简化了流程,其实实际情况不是用户感知到这样的,只不过没支付的订单,没必要显示给用户而已。 用户感知不到会创建订单,比如充值,购买会员等,用户感知不到这些操作会创建订单,但实际上是创建了订单的,这和商品订单有所不同。 但是有时创建订单和支付也可以一步完成,比如只规定使用余额支付的订单,就可以创建订单和支付为一步原子操作。
2019年08月26日
6,800 阅读
0 评论
78 点赞
2019-08-26
foreach使用引用时需要注意的问题
foreach ($car['cartList'] as &$shop) { } // 这里不释放会影响下面的$shop ,因为引用无法再正常使用 unset($shop); // 这里下面的循环$shop无法正常工作,因为上面$shop成为引用了 foreach ($car['cartList'] as $shop) { }&$item 要特别注意,遍历完必须马上 unset 否则就是一颗炸弹,对业务造成威胁,这种造成的业务错误往往很难排查! 所以不关紧要的变量需要提早释放,这是一个好的习惯,必须严格遵守,不是因为获得最大性能,而是因为可以减少这种难以预见,将来潜在的错误。
2019年08月26日
5,416 阅读
0 评论
16 点赞
2019-08-25
PHP数组与数据结构
数组是PHP中一个灰常、灰常、灰常重要的一个数据类型。因为他涉及到的知识点太多,太杂,我们的讲解是在数组类型部份告诉了大家一个大概,然后专门用一个章节来跟大家讲解。学习数组,大家主要学习两部分的知识:数组的定义,定义中的一些注意的坑数组的函数使用和(默写)又是默写级别的数组在之前我们让大家记住两个观点:数组可以存入多个不同类型的数据,是一个复合数据类型。数组的英文是array,学一下最简单的数组声明。那我们来进行简单的回顾:<?php $shu = array(1 , 1.5 , true ,'天王盖地虎,小鸡炖蘑菇'); echo '<pre>'; var_dump($shu); echo '</pre>'; ?>在上例中,我们发现我们存入了:整型浮点布尔字符串注:上例中echo pre这个标签的主要目的是为原样输出,格式展示的更好看,更清晰。我们用var_dump()打印出来显示看一下效果:我们仔细观察一下上面的这张图,你会发现以下几个特点:array(size = 4) 说明里面有4个元素0 => int 1 我们知道int是整型的意思,1是一个整型的数值。那前面的0,1,2,3和=>代表什么意思呢?最新前的0,1,2,3代表的是值的读取标识号,我们称之为下标或者键(英文:key)=> 是一个符号标准叫法叫作:键值对应符。因此,以后再看到 0=> int 1 可以这样来说。 下标访问符0对应整型的1。我们还称数组里面的键值对为元素,元素就是键值对的组合。哦耶! 数组好像还挺好学的,全是一些规律哟。我们通过上例,其实你一不小心的就完成了数组其中的一种声明方式:索引数组的声明哟。所谓索引数组:就是下标全为整型的数组。索引数组的下标必须要从0开始吗?答:这个问题其实不然,索引数组并不一定要从0开始。那如何能够不从0开始呢?答:需要用到大家在上面学的一小块知识哟。就是键值对应符。我们来动手写写。<?php $kele = array('只有不断努力才能博得未来',10 => 'NoAlike', 'PHP学院' , '去PHP学院去PHP', 19 => '凤姐和芙蓉我都爱' , '杨幂臭脚我最爱'); //打印显示$kele echo '<pre>'; var_dump($kele); echo '</pre>'; ?>上例中,我们一不小心就写了一个索引数组。不过索引数组的下标不是从0 开始的,而是从10开始的。不过上面的例子中,我们觉得写的不优美,我们可以将代码写的更加优美一些,格式更加清晰一些。<?php $kele = array( '只有不断努力才能博得未来', 10 => 'NoAlike', 'PHP学院' , '去PHP学院去PHP', 19 => '凤姐和芙蓉我都爱' , '杨幂臭脚我最爱' ); //打印显示$kele echo '<pre>'; var_dump($kele); echo '</pre>'; ?>这样是不是看得更清楚,一行对应一个数组的值。我们执行一下代码,看一下效果:通过上面的效果,我们来总结规律:索引数组若不强制声明他的下标,他的下标是从0开始的。(我们的第一个数组的值:只有不断努力才能博得未来。这个值的下标为0)。如果我指定过下标他的下标就为我指定的值。如下标为10和下标为19的,都是我指定过的值。若某个值(如NoAlike),强制指定了下标(下标为10)。在它后面加上的值(PHP学院),不指定下标的话。他们的下标增长规律为最大值+1。例如:凤姐和芙蓉我都爱的下标为19.我在后面加上了:杨幂臭脚我最爱。它的下标自动增长为了11。不知不觉,你已经学会了索引数组的创建,神奇吧?真为你感到高兴!###向索引数组中增加元素学习完了索引数组的创建,接下来我们学习索引数组的增加、修改和删除。<?php $minren = array( '杨幂', '王珞丹', '刘亦菲', '黄圣依' ); //如何向这$minren这个数组中增加元素呢 //猜猜范冰冰的下标是多少? $minren[] = '范冰冰'; $minren[100] = '范爷'; //它的下标又为几呢? $minren[] = '李晨'; ?>总结:向索引数组中增加元素用: 数组变量名[]、数组变量名[键值]这两种方式来增加元素键值的增长规则与之前的规则一样。都是最大值加1的原则。###向索引数组中删除元素我们还拿刚刚的数组来举例:<?php $minren = array( '杨幂', '王珞丹', '刘亦菲', '黄圣依', '范冰冰' ); //假设我不喜欢:黄圣依,如何将黄圣依给删掉掉呢? //如果删除掉后范冰冰的下标为多少呢? //如果在后面再追加一个元素,会填掉:“黄圣依”留下来的空吗? unset($minren[3]); $minren[] = '金星'; echo '<pre>'; var_dump($minren); echo '</pre>'; ?>看看效果:使用unset删除变量的方式来删除数组里面的值。删除了中间的值,并不会让后面的下标向前自动移动。而是原来的值为多少就为多少删除掉其中的某个值,新加入的值不会替换掉原来的位置,依然遵循最大值加1的原则。修改值我们学习最简单的创造、增加和删除。我相信大家一定能够推理出如何修改值了。<?php $minren = array( '杨幂', '王珞丹', '刘亦菲', '黄圣依', '范冰冰' ); $minren[5] = '范爷'; $minren[2] = '亦菲,不要架给韩国人好吗?'; echo '<pre>'; var_dump($minren); echo '</pre>'; ?>执行上面的代码,输出看看结果。1.用变量名[键] = 新值。就把数组中的值定的值修改了。索引数组的其他声明方式通过上面的例子,我们学习到了数组的声明。我们来学一下数组的其他声明方式。####一、直接用之前未声明的变量,用变量名后面接中括号的方式声明数组。<?php //直接写一个变量后面加上中括号,声明变量 $qi[] = '可口可乐'; $qi[10] ='百事'; echo '<pre>'; var_dump($qi); echo '</pre>'; ?>####二、每次用array()写的太麻烦了,还可以不用写array哟,更简单。<?php $minren = [ '杨幂', '王珞丹', 100 => '刘亦菲', '黄圣依', '范冰冰' ]; echo '<pre>'; var_dump($minren); echo '</pre>'; ?>上面是另外两种PHP学院的写法。当然,你自己喜欢使用哪一种就使用哪一种来声明。###关联数组索引数组适当的变一下形就出现了关联数组。只要数组里面有一个为字符串的数组,就为关联数组。通过上例中,我们发现数组的下标只能够为字符串,当然不能够满足我的需求。假设我想声明一个下标为帅对应李文凯这个值。肯定不能满足我的需求。那我们来声明一下关联数组。跟索引数组的声明方式完成一样。不过不同的是,必须要指定字符串的下标和必须要使用键值对应符。<?php //声明一下关联数组 $rela = array( '帅' => '李文凯', '很帅' => '黄晓明', '灰常灰常帅' => '宁泽涛', '有男人味的大叔' => '吴秀波', ); //再来玩玩简洁声明 $drink = [ '美' => '凤姐', '很美' => '芙蓉姐姐', 'verymei' => '杨幂', '心中滴女神呀' => '华妃', 100 => '孙俪', '娘娘', ]; // 输出 $rela echo '<pre>'; var_dump($rela); echo '</pre>'; // 输出$drink echo '<pre>'; var_dump($drink); echo '</pre>'; ?>我们来实验一下看看最终的结果是什么样的:我们通过实验知道:声明关联数组是 键名 => 值在关联数组可以有索引数组的元素关联数组中的索引数组的元素后再声明了无下标的元素,依然是最大值+1原则。(观察上图中的值为孙俪、娘娘的两个元素)。###关联数组的增、删、改<?php $drink = [ '美' => '凤姐', '很美' => '芙蓉姐姐', 'verymei' => '杨幂', '心中滴女神呀' => '华妃', 100 => '孙俪', '娘娘', ]; //追加方式与索引数组是一样的 $drink['kx'] = '康熙'; //输出试试 echo '<pre>'; var_dump($drink); echo '</pre>'; //删除一个试试 unset($drink['verymei']); echo '<pre>'; var_dump($drink); echo '</pre>'; //将芙蓉姐姐 改成:心里美才是真的美 $drink['很美'] = '心里美才是真的美'; echo '<pre>'; var_dump($drink); echo '</pre>'; ?>你动手做做刚刚的实验,你会发现操作方式与索引的操作方式一样。只不过下标在读取的时候读取的下标PHP学院了。####其他的关联数组声明方式<?php $drink['nf'] = '农夫山泉'; $cocacola = '可口可乐'; //当然可以是变量哟 $drink['kl'] = $cocacola; $data = array( 'kl' => $cocacola, ); ?>通过上例我们发现,在关联数组当中也是可以不用array,直接在变量后面接括号。括号里面插入字符串下标,一样也声明成功。后面插入变量的例子,只不过把字符串变成了变量,当然没有问题。###数组当中插入数组数组可以插入整型、浮点、字符串,那么数组当中可不可以插入数组呢?当然可以。在学习数组的时候,我们定义了这样一组名词。一维数组 数组里面没有其他数组,只有单纯的一些变量或者值。二维数组 数组里面插入了单层的一个数组,或者多个数组三维数组 在数组(A)里面插入了一个数组(B),在B数组里面又插入了一层级的数组(C),这种我们就称为三维数组超过三维的,统统都叫多维数组。注:索引数组和关联数组当中都可以再插入其他数组,让数组变为多维的。我们来声明一个一维数组,只有一个维度。索引、关联均可,这个操作大家都很熟。<?php //一维的索引数组 $data = [1 , 2 , 3 , 4 , 10 => 250]; //一维的关联数组 $rela = [ 'beijing' => '北京', 'shanghai' => '上海', 'tj' => '天津', ]; ?> echo '<pre>'; var_dump($rela); echo '</pre>'; echo '<pre>'; var_dump($data); echo '</pre>';一维数组大家很熟悉,也不难,就是声明数组嘛。二维也不难,只是在数组里面再插一个或多个数组。二维学好了,多维就学好了。<?php $person = array( 'office' => '办公室', //注意:插入第一个数组哟 'family' => array( '爸爸', '妈妈', 'yeye' => '爷爷', 'nn' => '奶奶', ), //注意:又插入了一个平级的数组 'jiaotong' => array( '自行车', '摩托车', '汽车', '飞机', ), ); echo '<pre>'; var_dump($person); echo '</pre>'; ?>我们执行一下看看效果:我们发现变量person 是一个数组类型。有三个元素(size=3)。第一个元素为 office 对应的是一个字符串“办公室”,第二个元素为family 里面是一个数组,这个数组又有4个元素,值分别为:爸爸、妈妈、爷爷、奶奶。第三个元素为jiaotong,里面也为一个数组有4个元素,值分别为:自行车、摩托车、汽车、飞机。好了,二维数组好声明,只要把格式写对了,确定是在一个数组里面再插入一个数组就好。那如何访问:爷爷和爸爸这两个值呢?<?php $person = [ 'office' => '办公室', //注意:插入第一个数组哟 'family' => [ '爸爸', '妈妈', 'yeye' => '爷爷', 'nn' => '奶奶', ], //注意:又插入了一个平级的数组 'jiaotong' => [ '自行车', '摩托车', '汽车', '飞机', ], ]; //访问“爸爸”这什值 echo $person['family'][0]; echo '<br />-----华丽丽的分割线------<br />'; //访问“爷爷”这什值 echo $person['family']['yeye']; echo '<br />-----华丽丽的分割线------<br />'; //访问“汽车”这什值 echo $person['jiaotong'][2]; ?>我们看看结果如下:上例大家会发现,访问二维数组不过是按照之前的下标读取方式依次向下读取即可。先写上变量,中括号写上family这个下标,再写上要访问元素的下标。三维数组我们说了概念,那我们直接上手实验看看效果:<?php $area = array( 'china' => array( '上海', '湖北', '天津', '北京' => array( 'hd' => '海淀', '朝阳', '房山', 'cp' => '昌平', ), '广东' => array( '深圳', '广州', '佛山', 'dg' => '东莞', ), ), 'usa' => array( '华盛顿', '旧金山', '纽约' => array( '曼哈顿区', '皇后区', '布鲁克林区', ), ), ); echo '<pre>'; var_dump($area); echo '</pre>'; ?>我们执行一下看看效果:说明:在变量$area下有二个数组,一个为china,一个为usa。在china这个数组里面插入了上海、湖北、天津,又插入了北京和广东。而北京和广东又是一个数组。在北京和广东这两个数组里面分别有不同的元素。在这usa 这个数组里面插美国的华盛顿、旧金山和纽约。而纽约下面又是一个数组,说明了纽约下面的几个区。所以说,三维数组就是在数组里面再插入一个数组(A),在A数组里面插入一个数组。我们接下来看看,如何来读取里面的值。<?php $area = array( 'china' => array( '上海', '湖北', '天津', '北京' => array( 'hd' => '海淀', '朝阳', '房山', 'cp' => '昌平', ), '广东' => array( '深圳', '广州', '佛山', 'dg' => '东莞', ), ), 'usa' => array( '华盛顿', '旧金山', '纽约' => array( '曼哈顿区', '皇后区', '布鲁克林区', ), ), ); //读取华盛顿 echo $area['usa']['0']; //读取:布鲁克林 echo $area['usa']['纽约'][2]; //读取:昌平 echo $area['china']['北京']['cp']; //修改cp下标的值改为:西城区 $area['china']['北京']['cp'] = '西城区'; //输出看看原来昌平的值是否发生了变化 echo $area['china']['北京']['cp']; ?>通过上面我们发现数组学习起来不难。学习多维数组的难点:注意格式,将每个维度的换行、缩进弄整齐。就不容易出错了。【切记】数组元素间的分割符为逗号,在数组中插入数组的时候,不要在结尾处写成了分号(;)下图是错误的载图展示:
2019年08月25日
3,908 阅读
0 评论
0 点赞
2019-08-20
ThinkPHP6.0极速入门视频教程
ThinkPHP6.0主要新特性采用PHP7强类型(严格模式)支持更多的PSR规范原生多应用支持更强大和易用的查询全新的事件系统模型事件和数据库事件统一纳入事件系统模板引擎分离出核心内部功能中间件化SESSION机制改进对Swoole以及协程支持改进对IDE更加友好统一和精简大量用法ThinkPHP6.0在5.1的基础上对底层架构做了进一步的精简和统一,引入了一些新特性,并提升版本要求。ThinkPHP6.0运行环境要求PHP7.1+,不支持5.1的无缝升级
2019年08月20日
13,789 阅读
0 评论
40 点赞
2019-08-12
大数据量搜索解决方案-ThinkPHP5+Elasticsearch搜索引擎
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎。当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。实时分析的分布式搜索引擎。可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。你往 ES 里写的数据,实际上都写到磁盘文件里去了,查询的时候,操作系统会将磁盘文件里的数据自动缓存到 Filesystem Cache 里面去。整个过程,如下图所示:ES 的搜索引擎严重依赖于底层的 Filesystem Cache,你如果给 Filesystem Cache 更多的内存,尽量让内存可以容纳所有的 IDX Segment File 索引数据文件,那么你搜索的时候就基本都是走内存的,性能会非常高。提升性能的小技巧:仅在 ES 中就存少量的数据,无关检索的数据使用HBase等数据库存储,让Filesystem Cache可以容纳更多的数据量。数据预热,经常会有人访问的数据,每隔一段时间,就提前访问一下,让数据进入 Filesystem Cache 里面去。1、安装Elastaic官网下载地址:https://www.elastic.co/downloads/elasticsearch# 解压到非root目录,运行时使用非root账号且必须安装java环境yum install javawget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.tar.gztar zxvf elasticsearch-6.2.3.tar.gzuseradd elasticsearchpassword elasticsearchchown elasticsearch:elasticsearch elasticsearch-6.2.3cd elasticsearch-6.2.3nohup ./bin/elasticsearch & #设置成常驻进程php扩展库引入 composer.json{ "require": { "elasticsearch/elasticsearch": "~6.0" } }Client使用示例:prepare($sql); $query->execute(); $lists = $query->fetchAll(); print_r($lists); } catch (Exception $e) { echo $e->getMessage(); } $client = ClientBuilder::create()->build(); foreach ($lists as $row) { $params = [ 'body' => [ 'id' => $row['id'], 'title' => $row['title'], 'content' => $row['content'] ], 'id' => 'article_' . $row['id'], 'index' => 'articles_index', 'type' => 'articles_type' ]; $client->index($params); } } /* * 功能:获取索引 * return */ public function getIndex(){ $client = ClientBuilder::create()->build(); $params = [ 'index' => 'articles_index', 'type' => 'articles_type', 'id' => 'article_1' ]; $res = $client->get($params); print_r($res); } /* * 功能:从索引中删除文档 * return */ public function delIndex(){ $client = ClientBuilder::create()->build(); $params = [ 'index' => 'articles_index', 'type' => 'articles_type', 'id' => 'article_1' ]; $res = $client->delete($params); print_r($res); } /* * 功能:设置索引 * return */ public function createIndex(){ $client = ClientBuilder::create()->build(); $params['index'] = 'articles_index'; $params['body']['settings']['number_of_shards'] = 2; $params['body']['settings']['number_of_replicas'] = 0; $client->indices()->create($params); } /* * 功能:查询条件 * return */ public function search(){ $client = ClientBuilder::create()->build(); $params = [ 'index' => 'articles_index', 'type' => 'articles_type', ]; //多字段匹配 // $params['body']['query']['multi_match']['query'] = '我的宝马发动机多少'; // $params['body']['query']['multi_match']['fields'] = ["title","content"]; // $params['body']['query']['multi_match']['type'] ="most_fields"; // most_fields 多字段匹配度更高 best_fields 完全匹配占比更高 // // //单个字段匹配 // $params['body']['query']['match']['content'] = '我的宝马多少马力'; //完全匹配 // $params['body']['query']['match_phrase']['content'] = '我的宝马多少马力'; //联合搜索 must,should,must_not $params['body']['query']["bool"]['must']["match"]['content'] = "宝马"; $params['body']['query']["bool"]['must_not']["match"]['title'] = "宝马"; $res = $client->search($params); print_r($res); } }
2019年08月12日
14,446 阅读
0 评论
9,924 点赞
1
...
62
63
64
65