20. shell重命名目录中文件名称

这几天在看《Modern PHP》这本书,发觉需要使用其中介绍到的Xdebug工具来分析代码的运行,虽然对Xdebug这个工具的名称已是家常便饭,但项目中并没有使用过它。之前也听过一些关于Webgrind网页版的查看分析工具,但都没有自己安装使用过。

常听人讲,怎么优化代码一类的事情,但都没有去实践过。前几天在Coding冒泡贴了一段代码,就是后台某些功能可能需要超过10个的搜索字段(我是这么觉得的),有些字段可能周期中就使用过一两次或者根本没有使用过,也把它处理了。然后我贴了类似这样重复的代码:

if (isset($request['content']) && trim($request['content'])) {
    $query->andFilterWhere(['like', 'content', trim(strip_tags($request['content']))]);
}
if (isset($request['userid']) && intval($request['userid'])) {
    $query->andFilterWhere(['userid' => intval($request['userid'])]);
}
if (isset($request['start']) && strtotime($request['start'])) {
    $query->andFilterWhere(['>=', 'ctime', trim($request['start'])]);
}

当然实际比这个多得多,然后就收到一堆吐槽,日,直接列个数组循环不就得了,谁写的这段代码?直接打死,有人直接说这是一个月入门的吧,粘贴复制这么多行明显是不对的。我实现的方法有一万种,教你一个简单的,把要查询的字段放在一个数组里面呢,然后foreach数组里面的值去做你的addFilter…类似的道理其实不是第一次听说了,一直没有使用这种方式,还有一个同事建议直接对$_GET作$引用后,直接使用$var来进行操作,我都没有使用,对参数的验证来说,这些都不是好办法。

当然如果你不想验证了,那这样的确很方便,而且还有一丝丝hack的意思。我没看过什么开源项目,不知道有没有很多这类的做法,也不知道是否可取,但我的确一直没有采用这种实践。不记得什么时候看到的了,程序安全很重要,尤其是需要依赖客户端处理时,要坚持客户端的输入是不可取的这一原则。结果处理这个原则,丧失了很多灵活性,比如上面这种,至少在这个判断中,有去空格,强制类型转化,和大小于处理,你觉得把可能用的参数都预先写在一个数组中能简单到多少?其实这种方式也是一种不错的实现方式,数据库DB类中就有类似的做法,对于单一重复的操作的确简便,容易很多,但是表面单一,具体参数处理并不
统一时,这样反而变得复杂。所以一开始我也觉得我这样写挺傻逼的,尝试还是封装一下吧,结果发现不能用,我至少的准备三个数组,一个专门只做去空处理的,一个只做强制类型转化的,还有一个涉及大于等处理的,每一次循环中还是避免不了对该参数执行三个in_array()操作,直到遇到continue为止,你说这样看起来只是没有我上面写的傻一点,但是并没什么用啊。

还是后来一个大哥说的,没几个用户会这么搜,把常用的留着,其他的隐藏起来….就算是后台,这也太蛋疼了。。有些搜索可能一辈子也用不到。我才回过头来,没必要提供这么多搜索筛选,就把必不可少的留下,随便你怎么写,都不觉得麻烦,而且代码还简单,就是楼上说的,这是一个月入门的吧,呵呵。我才知道,不管程序也好,还是别的什么,会做加法固然重要,但能做减法,才是需要深思熟虑过后才可能会幡然醒悟的。这才是我们常说的,实现功能,代码越少越简单越好,并不需要各种机灵的hack手段。

早上尝试安装Xdebug,使用网页版的Webgrind发觉点击update后怎么也刷新不了页面,简单看了下源码报错,没怎么去理会,就安装了acachegrind,发觉这个软件不能自动识别Xdebug默认生成的文件cachegring.out.*,必须是以callgrind.开头的文件才予以理会。然后想到了怎么重命名日志目录中的文件,一开始是想用php来实现,一转念这不是没事找事做吗,这应该是Linux下和ls一样简单实用的操作啊。然后想起find命令来,还是搜了一番周折,才实现这个小便宜的。也吐槽下网上的文档,思路还是没有错,但是具体的实现或许是不能用的,比如这个,往上的文章挺多,但是没有一个是符合我的需求的,但思路
到位了,剩下的就是自身的把控了。

最后其实还是没有实现,我没去仔细研究怎么用shell 把文件名cachegrind.out.463 变更为callgrind.out.463,但是我发觉qcachegrind这个软件只需要文件是以callgrind.开头的就可以,于是我投机取巧,将文件名cachegrind.out.463 变更为callgrind.cachegrind.out.463也能暂时满足我的使用,哈啊哈。

在Mac命令行中运行该命令,就可以将当前目录中所有以cache*开头的文件统一加上callgrind.前缀,

find . -name cache* -exec basename {} \; | xargs -I {} mv {} callgrind.{}

朝阳区远洋国际中心 03:12