我们在做业务项目,客户端的输入总是无法控制,有各种各样的特殊字符,这些特殊字符就要借助ASCII码表才能判断,所以我做了一张图,方便查看为什么要搞个表出来,下面的字符串中,你看看你能否看的出来是什么特殊字符嘛(中间空白地方)20160807  1看不出来吧,让我们看看16进制是什么$ hexdump -C tmp.md 0000000 32 30 31 36 30 38 30 37 20 c2 a0 31 000000c三个特殊字符是 20,c2,a0 这只能对应ascii码表找了
有一次去图书馆看书,遇到一个刚毕业不久,在图书馆学习php,我就和他聊天,他期间问到一个问题“如何开发一个大型网站”,这个问题吓不倒我呀,我了解一些了,当时就和他连说带比划了一次,回家了我仔细又想了想,觉得还是写篇文章记录下任何网站都是从一个小网站 演变成 一个复杂的网站的(后面我们用成熟的网站表示大型网站)才开始一个网站不可能非常成熟的,都是随着用户量的增长,业务功能的不断扩展逐渐完善的第一:最初的网站架构 这个时候应该是最简单的架构了,应用程序,文件,数据库,web软件 都放在一台服务器上了,如下图(这就是我现在的基本架构了,嗯哼,就是小网站了)第二:应用程序,文件,数据库分离随着业务的发展,一台服务器已经满足不了性能要求了,所以这个时候将 应用程序,文件,数据库分别放在单独的服务器上第三:可以适当使用缓存改善网站性能提升硬件的配置同时,我们也可以使用软件做性能优化的,这里我们重点说的是数据库缓存,目前可以使用memcache/redis等软件第四:使用集群改善应用服务器性
缘由我们公司最近手机端H5 经常受到商户和用户的投诉,说有广告并且导致不能正常进行操作,我们商户自己当然不会加广告了,但是商户和用户可不管这些了,就认为是我们的问题探索发现根本目前我们用的很多浏览器,都提供插件功能,在Chrome浏览器体系下有个 广告终结者插件:可以用来屏蔽网页中的广告部分。受到这个插件的影响,我先探索下 广告劫持是怎么做的?我就想到通过获取网页html代码过来分析,如下JS代码setTimeout(function(){     $.ajax({         url:"/error/ad_log",         type:'post',        &nbs
前言在博文中 解读大型网站的演变过程  浅谈 举家搬迁静态文件到CDN 博文中都有涉及CDN,这次我们来详细讲解下CDN的架构简介CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求好处提升访问资源速度,为用户提供更好的用户体验,例如访问某个图片,原来如果从源站获取可能需要30s,但是使用cdn之后可能只需要 1 ~ 5 s,因为cdn是从离用户最近的服务器获取图片资源的适用对象静态资源,例如js,css,图片资源,视频,音乐资源,软件资源等等CDN架构实例:某个用户访问图
缘由本周技术群有一个同学说我们该怎么实现 由近到远的基于地理位置的搜索,我创业做电商的系统做过类似这样的服务,我把我们以前的操作给大家分享下什么是LBSLBS 全称是 Location  Based Service ,基于位置的服务。我们可以使用到这种服务,真是由于我国移动设备的大量增加,让我们加速进入了 移动互联网的时代。由近到远的基于地理位置的搜索  其实就是 通过当前使用用户的经纬度,然后从我们自己的数据库中查出指定范围内(例如5km)的数据,按照由近到远的顺序 进行展示。这句话中有四个条件用户的经纬度,我们定义 用户维度为:$lat 、经度:$lng指定范围,定义范围:distince数据库中商家的经纬度字段,定义 维度为:lat,经度:lng计算 用户经纬度 与 数据库中商家的经纬度 距离,由远及近进行排序接下来,我们一起来用两种方案实现实现方案一:这种方案会比较挫,理想模型计算阀值点计算某个经纬度的周围某段距离的正方形的四个点为什么这么计算,我给大家举个例
  查看软件xxx安装内容:dpkg -L xxx 查找软件库中的软件:apt-cache search 正则表达式 查找软件库中的软件:aptitude search 软件包 查找文件属于哪个包:dpkg -S filename 查找文件属于哪个包:apt-file search filename 查询软件xxx依赖哪些包:apt-cache depends xxx 查询软件xxx被哪些包依赖:apt-cache rdepends xxx 增加一个光盘源:sudo apt-cdrom add 系统升级:sudo apt-get update;sudo apt-get dist-upgrade 清除已删除包的残馀配置文件:dpkg -l |grep ^rc|awk&
  最近应该说比较忙,今天休息了一天,算是对自己身体健康的一个缓冲。今天抽出一小会时间 说说 为什么我会去云平台录制课程始于想挣点外快哎呀,咋和我们梦想中的高大上的话术有点不一样。是不是觉得我应该说点比较激励的鸡汤哇。哈哈当时云平台的人找到我,让我录制课程,我是思考过要不要去作为讲师的。当时由于在创业过程中,出现了一些问题,比较清闲。然后基于自己对自己能力的风骚自信,我就给自己了一次尝试的机会。通过把自己会的东西以视频的方式分享出来而赚取一部分费用,我觉得没有什么不好意思说的。所以基于自己对自己的风骚自信 和 赚点外快的想法,我踏入了网络讲师这个行业源于责任以前我上大学那会,觉得老师好像挺辛苦的,一个课程要重复反复讲N次。直到我自己做一个无证的网络讲师,我发现老师的真的不容易。给大家我说说我在录制课程中的体会,我目录已经录制了3个课程(RBAC打造通用web管理权限,Vagrant打造跨平台可移动的开发环境,Yii 2.0 微信服务号开发带后台的图书商城)。在这三个课程过程中,给大家呈现的2
最近突发奇想想做个在线音乐小网页。需求很简单,如下搜索歌曲 或 歌手在线播放音乐借用qq 或者 百度的 音乐接口需求明确那就直接动手了我首先尝试的百度音乐,但是不能在线播放(提示forbidden),虽然不能在线播放,但是下载是可以的百度音乐具体Api如下1:搜索接口$url = "http://musicmini.baidu.com/app/search/searchList.php?qword=%s&ie=utf-8&page=1";//qword就是要搜索的歌曲或者歌手 $url = sprintf( $url,urlencode($kw) );这个其实不能算是接口了,是百度的一个页面,直接可以访问2: 根据搜索结果得到的html字符串,然后取出song_id,使用正则表达式    3:根据song_id 获取 歌曲信息,接口如下$url 
缘由我们程序员难免要和数据库打交道,经过这几年的锻炼,感觉手写SQL语句已经忘记的差不错了,促使我一定要这篇文章的原因是,有一次晚上我更新某个系统的数据库的表(由于目前公司比较严格,数据库都只能通过命令行访问,无法通过GUI工具操作),然后由于where 条件写错了,然后数据更新错了不少。痛定思痛:用好的工具来避免这种情况,那就是phpMyadminphpMyadminphpMyAdmin是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出更为方便。其中一个更大的优势在于由于phpMyAdmin跟其他PHP程式一样在网页服务器上执行,但是您可以在任何地方使用这些程式产生的HTML页面,也就是于远端管理MySQL数据库,方便的建立、修改、删除数据库及资料表。也可借由phpMyAdmin建立常用的php语法,方便编写
需求缘由        最近接收了一个新的工具业务:ipublish发布系统,刚接手这个业务的时候,发现每次发布新的代码 需要到群里告知大家,我要停服务几分钟,准备更新代码啦。这尼玛 哪个公司都不敢这么牛逼的和用户说,我们网站要停服务几分钟,准备发布的。        基于这个原因我要对ipublish进行优化,如何优雅的发布代码,而用户是无感的功能需求发布系统自己更新迭代需求的过程中,不能停止服务,对用户是无感知的实现设计方案其实这个问题基本都知道解决方案,我这里就王婆卖瓜自卖自夸吧,来一张架构图架构非常简单,通过一个LB作为反向代理,然后将所有请求转发到 后端的tomat ,后端有两个tomcat ,但是提供服务的只能是某一个tomcat操作步骤前提条件LB 使用的Nginx 监听 80端口配置两个tomcat 一个 8080
  为什么写这篇文章我个人有一个技术群,里面学什么框架的都有,经常会有人问 某某功能 在 哪个框架怎么实现,用什么框架实现更好,说道这里我大家讲一个同类型问题的笑话某女:你能让这个论坛的人都吵起来,我今晚就跟你走。某软件工程师:PHP是最好的语言!某论坛就真的炸锅了,各种吵架../..某女:服了你了,我们走吧,你想干啥都行。某软件工程师:今天不行,我一定要说服他们,PHP必须是最好的语言大家注意重点哦(可能有同学会说 活该单身狗 哈哈),这边文章的标题 就和这个语言争论是一样没有最好,只有更适合和语言之争一样,框架一样没有那个最好这种说法,只有更适合。这里的更适合我要给大家解释下。更适合是 你非常了解一个框架 ,一定要注意不是因为你使用过 就一定更适合,因为只有你认证了解过 在出现极端问题才知道怎么解决更适合是 你当前技术栈选择,例如公司大部分人都会Yii2 框架,你说我们选择个tp5,你这不是折腾人嘛,多人的智慧还是可取的更适合是 相对而言 文档比较丰富,不然新人学习成本很高的其实真有最好
微信墙效果图使用简单说明关于微信公众号回复 “上墙“,查看指引回复”# + 上墙内容“ 即可发表上墙消息了查看微信墙列表,点击这里
今天我们聊聊开心的话题 :)我们都知道无论在什么行业,学习能力才是发展的最重要的,用潜力来说也可以。但是学习能力是什么,其实很虚,企业如何为你的学习能力买单发工资。我觉得可以用解决问题的能力来衡量我们从几张截图开始我们的话题截图一:截图二:截图三:善用互联网的搜索工具        作为新手难免是遇到问题就到各个技术群里去询问,这个很正常,我也是这么经历过来的。但是一般都有工作,谁又能及时给予帮助,基本不可能了。所以还要要靠自己,我们就那第一张截图来说,根据提示:no input file specified。我们以这几个字作为关键字,作为搜索条件。来看看几个搜索引擎的截图        通过上面几张截图,大家应该可以看到结果了吧,其实我们遇到的95%的问题,60亿人中肯定有人遇到过了。   &nbs
本人简单实现的示例,使用任意二维码工具打开二维码对应链接http://www.54php.cn/demo1/scan原理介绍:第一步:访问登录页面,生成唯一key,例如MkhjDFL=,并且将此key 存入cache,对应值为-1 ,-1表示未登录,key有效期我设置的为5分钟,过期就会重新生成二维码图片第二步:生成二维码,本人使用库(https://github.com/2amigos/yii2-qrcode-helper),二维码对应的链接                http://www.54php.cn/demo1/qrcode?key=MkhjDFL=第三步:登录页面,JS循环请求某个接口,本人接口 http://www.54php.cn/demo1/dologin第四步:使用任意app,打开二维码对饮的链接。此处应该使用自己开发的App,并且App已经登录,然后使用自己的App扫描二维
本文主要讲解 手机浏览器 如何拍照 为什么会有这个需求 最近做一个项目要用到拍照然后上传照片,但是网页拍照一般都是用Flash做的,而我们主要是H5页面,如果在微信里面有权限就可以通过JSSDK调起摄像头拍照的。这里我们主要说下手机端浏览器如何调起摄像头 H5如何打开摄像头 不需要特别的支持,只需要一行代码就可以了 <input id="upload" type="file" accept="image/*;" capture="camera" > 如何预览图 原理是用js获取input file的图像流,然后赋给img标签的src属性,然后再设置这个img的css,就能得到你要的效果了,代码如下 ; var demo_h5_upload_ops = { init:function(){ t
  每次都很容易忘记Nginx的变量,下面列出来了一些常用$remote_addr //获取客户端ip $binary_remote_addr //客户端ip(二进制) $remote_port //客户端port,如:50472 $remote_user //已经经过Auth Basic Module验证的用户名 $host //请求主机头字段,否则为服务器名称,如:blog.sakmon.com $request //用户请求信息,如:GET ?a=1&b=2 HTTP/1.1 $request_filename //当前请求的文件的路径名,由root或alias和URI request组合而成,如:/2013/81.html $status //请求的响应状态码,如:200 $body_bytes_sent        //&nbs
  Nginx的return关键字属于HttpRewriteModule模块:语法:return http状态码 默认值:无 上下文:server,location,if 该指令将结束执行直接返回http状态码到客户端. 支持的http状态码:200, 204, 400, 402-406, 408, 410, 411, 413, 416 , 500-504,还有非标准的444状态码.使用方法:#不符合规则的返回403禁止访问location /download/ {     rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  break;     return&
  Squid简介Squid可以做什么性能要素Squid安装Squid快速体验Squid配置Squid简介Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more. It reduces bandwidth and improves response times by caching and reusing frequently-requested web pages. Squid has extensive access controls and makes a great server accelerator. It runs on most available operating systems, including Windows and is licensed under the GNU GPL翻译过来大致意思: Squid是一个支持HTTP,HTTPS,FTP等众多协议的缓存代理
  ###举例仓库仓库地址A:git@gitlab.54php.cn:guowei/demos.git仓库地址B:git@gitlab.54php.cn:infra/demos.git开发人员仓库C:git@gitlab.54php.cn:lurenjia/demos.git###多分支开发背景以demos为例子,主分支是仓库B,开发分支是仓库A,然后每个开发人员从仓库A clone,每周会在仓库A切一个新分支(例如43周叫做demos_201443)git clone A将远程的仓库A 克隆到本地仓库git remote add B_alias Bgit checkout -b demos_201443_local B_alias/demos_201443从仓库B的分支demos_201443创建一个本地分支,分支名称叫做demos_201443_localgit add .git commit -am "代码提交NB备注信息"git fetch --allgit re
   git 基本命令git add .git commit -am "请填写你NB的备注"git fetch --allgit fetch -p  //如果远程分支删除了,本地发现还是有备份,可以使用此命令git push origin master:mastergit remote add origin 仓库地址git remote rm origingit remote -vgit rebase origin/mastergit rebase --continuegit rebase --skipgit rebase --abort###举例仓库仓库地址A:git@gitlab.54php.cn:guowei/demos.git仓库地址B:git@gitlab.54php.cn:infra/demos.git开发人员仓库C:git@gitlab.54php.cn:lurenjia/demos.git###单分支开发git clone A将远程的仓
条形码 和 二维码 对比一维条形码只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息,其一定的高度通常是为了便于阅读器的对准。 在水平和垂直方向的二维空间存储信息的条形码, 称为二维条形码(dimensional bar code)。相比一维条码,二维码记载更复杂的数据,比如图片、网络链接等。一维条形码的应用可以提高信息录入的速度,减少差错率,但是一维条形码也存在一些不足之处:● 数据容量较小: 30个字符左右● 只能包含字母和数字● 条形码尺寸相对较大(空间利用率较低)● 条形码遭到损坏后便不能阅读(部分破坏还是有可能可以读取的)与一维条形码相比二维条形码有着明显的优势,归纳起来主要有以下几个方面:● 数据容量更大● 超越了字母数字的限制● 条形码相对尺寸小● 具有抗损毁能力条形码 和 二维码 应用场景条形码的应用场景条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、
前提介绍        玩过微信公众平台的同学都知道,公众平台群发消息给关注者是有限制的,订阅号每天一条,服务号每个月4条。        其实人家平台这么限制也是可以理解了,就怕天天乱发以后就和垃圾短信一样了,所以做这个监管我是点赞了(很多平台如果做这个功能估计就会随便让发了)        但是嘛 浪子我有时候偶尔做了一个什么事情想让大家知道,用服务号群发消息肯定不合算,因为每周基本会发一篇群发消息了,那么我就想如何突破这个限制咧?        办法总是比困难多的,通过仔细查阅官网文档发现有这样的一个接口是可以的:模板消息,只要我知道了关注者的openid,就可以给这
最近一直比较忙,很多东西都咩有认证整理,今晚将所有项目整理了做了一个演示系统,可以方便自己找也方便大家查看整体布局如下图:演示系统的地址:http://www.54php.cn/demo 下面是我目前认证的服务号二维码。会不定期发一些心灵鸡汤哦
  技术界没有银弹,只有你自己不断的提高自己,练好内功,方能在未来指点江山对技术要有追求,要学会偷懒,经常完善自己的编程思想 迷惑一最近有好几个人问我,说:工作已经1年左右,每天都在忙,感觉技能方面没有什么提升,感觉到对技术方向的迷茫。迷惑二有很多人本身有点眼高手低,只要一听到干货就打了鸡血,干什么都要看看是不是干货迷惑三我只想写个能运行的代码就行了,请不要和我讲那么多编程思想的问题迷惑四普通工程师和高级工程师的差别在哪里?我以我这几年的工作经历和大家来唠唠这迷惑之一二三四说首先这两个阶段我都经历过,我刚开始来到上海这个陌生的大城市当年的确就是凭着一股不服输勇气支撑着我(Too Young Too Simple)。今天当然也感谢当年那次的决定,不然也不会有今天的我第一份工作是为一个公司(BAT之一)做外包项目,当时真的蛮辛苦的,经常半夜还在加班,由于是第一份工作当然非常开心并且干劲十足。那时候我记得我只用了三个月就已经熟悉了公司的框架以及外包公司框架。那时只要有时间(经常三更半夜)
  预祝大家端午节安康~~今天想和大家聊聊的心灵鸡汤主题是:为撒要爱惜自己的羽毛。羽毛是什么?其实在2年前,我也不理解羽毛是什么。只是我的老大们经常在说。这里的羽毛是自己的名声。例如你在公司就是 公司同事对你的评价和认可度。在朋友圈就是朋友对你的亲密和信任度。在某个具体行业 就是 你在业界的知名度。总结就是:认可度、信任度、知名度如何建立?想要建立认可度、信任度、知名度 绝非一蹴而就的,需要时间积累。我个人有感是通过三年积累起来的。而在这三年里,我是通过了无数件事情和努力,让他们觉得我是靠谱的、交给我的事情不用担心。其实这也是个人成长的阶段,只有当你的思维真密度 和 老大们的意识在慢慢靠近的时候,说明你快要被认可了。如何做到?多做事,少废话。我记得我当时做了好多系统,例如ipublish发布系统、Job管理平台、CMDB运维系统、Ansible打造业务标准机、数据库性能分析系统等等。别人认识你都是通过具体的事情和你接触,然后慢慢对你有了理性的打分要走出去,要有分享精神。你懂得东西再多,如果你
提前先申明今天的话题不是为了责备或者责怪,如果你非要这么理解我也没有办法今天的话题就由下面这张图引出来,以下是一个找人帮忙解决问题的描述最近这段时间经常遇到类似这样的寻求帮助的。我说一下我看到这样的寻求帮助的对话之后内心的变化过程认真读每一句话从描述找遇到的问题内心狂躁心中一万个草泥马在奔腾一般任何人只要找我问问题,我都会尽量尽我所能去解决,如果真真解决不了,当然也只能抱歉,因为我个人能力不够,仍然需要学习那么为什么我内心会狂躁因为我看了半天没读懂你到底要问什么,你的困难在哪里,请问我如何帮你解决?并且我 个人工作时间也是非常忙的(分分钟也是5毛钱上下咧),能让我内心不狂躁嘛,我不回答你嘛,我怕你说我什么玩意不给我解决问题,我回答你嘛,接下来将是无休止的一问一答。我当然可以理解你的确是出问题,不然你也会闲着蛋疼没事跑到问问题,还顶着随时被我这样脾气差的人骂的风险为什么内心在奔腾其实这个问题跟我半毛钱都没做关系,我是为你的描述能力着急,我也是从零开始的,一步一步一个脚印学习编程的,我也遇到
  当使用php5自带的file_get_contents方法来获取远程文件的时候,有时候会出现file_get_contents(): failed to open stream: HTTP request failed!这个警告信息。google或者baidu一下,好多这样的问题,解决的方法都是修改PHP.ini,把allow_url_fopen给启用,改成 allow_url_fopen = On这样做可以解决某些人的问题,有人说在php.ini中,有这样两个选项:allow_url_fopen =on(表示可以通过url打开远程文件),user_agent="PHP"(表示通过哪种脚本访问网络,默认前面有个 " ; " 去掉即可。)重启服务器。但是有些还是会有这个警告信息,想用完美的解决还差一步,还得设置php.ini里面的user_agent,php默认的user_agent是PHP,我们把它改成Mozilla/4.0 (compatible
  原始时代我记得在当时用php的时候还没有composer,只有个pear,但是不好用呀,还不如直接在互联网上到处复制代码了,更快更不容易出错,当时也没有github这么好的社区工具了总结如下代码混乱规范不统一没有后续统一更新等管理Composer侠应运而生composer直到如今 已有5个年头了,也是直到今年才有了第一个稳定版本1.0,以前都是alpha版本了,其实composer的发展 也和 PHP-FIG (后续会专门解释的)的发展有很大关系composer是php新时代的依赖管理利器,就像python的pip,nodejs的npm,javascript的bower等。你可以在自己的项目申明所依赖的外部库,composer可以帮你安装这些composer解决如下问题你有一个项目需要依赖若干个库其中一个库依赖其他库找出你需要的版本进行安装安装Composer要求composer 要求 php 不低于 5.3.2+命令curl -sS https://getcompo
  问题最近遇到一个这样的问题,新建数据库表的时候 提示 错误如下Invalid default value for 'created_time' timestamp field语句如下`created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入时间' 错误大致的意思 就是不能为 timestamp字段设置指定的默认值,也就是语句中的 0000-00-00 00:00:00,但是很奇怪在本地就可以,为什么线上服务器就不行了?本地数据库版本:5.5.46 上线数据库版本:5.7.17后来经过查询文档(文档地址)发现,其实从5.6.17这个版本就默认设置了不允许插入 0 日期了,术语是 NO_ZERO_IN_DA
  • 微信公众号 微信小程序
  • 微信机器人
  • 群1:1046090432
  • 群2:585567981