Heim  >  Artikel  >  类库下载  >  最近写php命令行程序的一些心得

最近写php命令行程序的一些心得

高洛峰
高洛峰Original
2016-10-14 10:16:581229Durchsuche

       php,php,是的,还是php.已经写过四篇和php相关的东东了.(>,>,>,>)但是还是觉得不过瘾,还是想把半年来用php写命令行程序的一点心得总结出来,希望在回顾的过程中,自己也得到升华和提高.
        简单回顾一下已经写过的东西:
        1.让php程序自己执行
        这里提到的php,'自己执行',可不是将php编译成二进制代码,从而具有可执行权限.是指,给php加个文件头:#!/usr/bin/php,然后通过chmod给文件执行权限,以达到不用每次为了执行它,都在文件前面加个php的目的,具体见>.
        2.让你的程序让出当前占用的终端.
        如果你的程序跑的时间较长,或者干脆要一直跑着,先前的时候为了把它放到后台,我们会运行它的时候,在末尾加一个&放到后台.或者运行一个screen or tmux然后在里面运行它.但是,但是,这些做法总是感觉很argy,现在有了更好的解决方式,就是让它自己把自己放到后台,具体见>.
        3.除了手工输入数据,还可以接收别人传过来的嘛.
        在linux的世界里,能够和其它小程序共同完成一个使命是件很光荣的事儿哟~怎么样才可以做到呢?具体见:>
        有句话说:'温故而知新,可以为师夷'.咱温故了一下,发现没有知道新的东西,那咱就继续讲新的东西吧:)个人觉得现在的php脚本技术,已经很成熟很完善了,而且易学易用,很容易就可以上手.在使用php写命令行脚本的时候,笔者主要用在两个方向:后台服务,命令行程序.后台服务因为要在服务端,一直运行,长驻内存,所以要格外注意代码的优化.命令行程序里的一些东东,可以直接应用于后台服务,ok,开练:
        后台服务:
        1.后台运行
        已经说好是后台服务,你还想占用当前的终端?乖乖的去后台吧:)
        2.长驻内存
        第一点,程序要长期运行,看来只能放到while(0)里了.先前准备用这个方式的时候,看网上很多资料不提倡php用这种方式.但是不用这种方式用啥呢?goto?那是5.3以后特性,而现在服务器强调稳定多数用的是5.2的版本.而且这样强制在代码中跳来跳去的指令,你敢用吗?最后还是用while喽.在测试服务器跑了一个多月,感觉很好很强大!
        第二点,提到长驻内存就不得不提内存释放问题.php没有内存回收机制,虽然不像c那样,要自己分配和清理内存,但是还是注意一些好,小心驶得万年船.所以在内存使用上,笔者坚持一个原则:函数里的内存不管,主程序里的内存用完就unset.这样也可以避免变量重名带来意外的效果.(当然了,php好像是可以变量重名的,谁后来谁生效,但是养成一个好的习惯很重要:))
        3.禁用输出
        禁用输出是指禁止用echo吗?是,但不全对!因为linux的世界里输出有两种,一种是正常输出,一种是错误输出.正常输出,自不必说了,写的再好的代码,一个echo马上就退了.再有就是错误输出,一定要抑制错误!举个例子来说:mysql_connect.这个指令执行的结果有两种:成功,失败.大多数情况,很容易成功的.于是乎很多人相当然的认为,这个函数一定会成功的!于是你会看到很多网页在出错的时候,提示mysql连接失败的信息.网页还好,因为是一个人一次,这个人失败了,说不定下个人的时候就成功了,但是后台服务不一样,如果你不处理这些错误,程序直接就退了!所以,为了程序的健壮性,一定要懂得抑制错误.再者,考虑全面,也是男人成熟的表现:)
        4.信号控制
        一个完整的后台程序,怎么能必需靠'kill -9 pid'这样的暴力方式来终结呢?php里,也有完美的信号解决方案.让你的程序支持start,stop,restart,status只是信手捻来的事儿.
        5.运行日志
        后台程序,禁用输出了,肯定就要写日志了.从启动到正在干啥事儿,到什么时候因为什么原因退出,肯定都要有详细的记录.在我还没整明白信号的时候,日志里只有启动和运行记录,然后又是启动和运行记录,郁闷,后来终于可以知道程序是嘛时候退出的了:)在写日志的时候,我发现一个很帅的函数file_put_contents,而且她支持追加.这样的话,我就可以做到用'tail -f 日志名'实时看运行状态了:)
        命令行程序:
        6.echo也疯狂
        php最佳实践里提到:echo因为没有返回值所以比print的要快很多.echo后面可以用逗号分割多个句子,输入的效率要比用点连接快很多.所以,当我要处理大量的文本,希望最后一次将它们写到文件里的时候,我多么希望可以不用'.'来连接这些东西,因为我不想时间都浪费在连接字符串上!php跟我说,你可以做到!于是我惊喜的发现ob_start可以!例如:
        ob_start;
        echo xxx,xxx,xxxx;
        file_put_contents('filename',ob_get_contents);
        ob_clean;
        很黄很暴力!效果刚刚的,谁用谁知道.
        7.纠正时区错误
        linux装个系统是很简单的事儿.但是让笔者很郁闷的是:好多人可以把linux系统装成中文版(因为安装语言选择了中文),却把时间弄成了纽约时间(西八区,中国是东八区).所以作为程序员,不要奢望一切东西默认就是对的,为了保证自己的程序不出问题,在写日志,或者输出时间的时候最好自己定义一下时区:date_default_timezone_set('PRC') :)

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

In Verbindung stehende Artikel

Mehr sehen