第六章:第1节 PHP内置函数介绍

更新于:2017-04-25 21:55:58

楠神真正接触的第一门编程语言是PHP,后来又学习了多门编程语言,感觉PHP真得挺独特的,抛弃了很多程序语言本应该有的一些东西。光学PHP的童鞋可能都不知道进程、线程这些玩意,进而也就不知道计算机最基本的一些机制、原理性的东西。这应就是PHP最单纯的地方吧,不用让程序员有太深的计算机底子,只要学好PHP的语法,利用好PHP提供的各种便捷,专注于业务逻辑上的开发就好。


说一个PHP与大部分编程语言不同之处:


PHP脚本的生命周期很短(默认是30秒),没有常驻进程,PHP对开发长时间机制的程序支持不是那么好。很多核心的网络应用(比如QQ)不适合用 PHP 的短暂请求处理机制实现(比如准实时 push 提醒、网页即时聊天等),而更加适合由常驻进程来处理。


很多编程语言都可以开发常驻进程的程序,常驻进程什么意思?说白了就是一个while(true){……}死循环,能保证程序一直运行中。而PHP呢,是最忌讳死循环的,PHP要保证处理的时间越短越好。PHP为什么就不适合做常驻进程?


我们都知道PHP是专注于做web服务端开发的(天生的使命用于web开发),服务器(Apache)要接收很多客户端(浏览器)的请求,需要PHP(这里的PHP指的是能够执行PHP代码的解释器)处理的(PHP代码),Apache会交给PHP处理。PHP处理越快越好,这样Apache就可以及时把结果返回给客户端,Apache也可以断掉这个客户端的连接腾出位置去接收下一个客户端的请求。如果PHP长时间处理不完,或者PHP也玩常驻进程(针对每一个客户端来说,PHP代码里有死循环),那Apache的连接就一直被某些客户端占领着,所以会严重影响网站的并发。举一个生活中的例子,比如客服电话就10台,有10个用户打进来不挂断,第11个人就一直处于占线中。


PHP的脚本运行时间默认30秒,如果有程序运行了30秒还没有结束,PHP就会强制报错结束。在PHP配置文件中可以设置,或者用函数set_time_limit(0),0代表永不超时。


常驻进程,看看我们桌面上的QQ一目了然,打开了就一直在,需要用户主动去关闭。它是一直靠while(true){……}死循环运行,再说我们桌面的QQ只是客户端软件,服务的用户总共就两个,一个用户自己一个QQ总服务器,没有必要给予它短暂的生命周期。打开QQ接收完信息立马就关闭了,然后再打开接收信息再关闭,这样搞就太不像话了。


还有我们的服务器软件(Apache、Nginx)也都有常驻进程,Apache必须运行着,才能处理用户的访问请求。


像C、Java,甚至脚本语言Python都会学到socket网络编程(计算机与计算机之间可以互相通信,Apache就是用C开发的、用到了socket网络编程的程序),PHP脚本语言为什么就没有socket网络编程?我们可以把PHP代码看成一堆命令,给谁的命令?是给PHP解释器(PHP的解释器被称为zend engine)的命令,可以指使PHP解释器帮着服务器软件做一些运算处理什么。说白了就是一打工的,设计PHP脚本语言时,本就没有设计出让PHP解释器“自立门户”的“指令”(没有socket网络编程)。所以PHP脚本语言不适合开发常驻进程的程序,离开了服务器软件PHP也就废物一个。(一句话总结:PHP只会CGI编程,不会网络编程)


CGI架构图:

1.png


PHP与其他编程语言另一不同之处,就是前面说的PHP程序的执行是同步从头到尾,按照逻辑一路执行下来,不产生分支,没有异步编程的机制。


也就是这两点(再加上PHP是弱语言)PHP才遭到多少其他编程语言的程序员“唾弃”、“瞧不起”。


后期补充:


楠神上面写的有点偏激,后来楠神从网上看到一个叫做workerman的PHP socket 服务器框架,原来PHP也是可以做scoket网络编程的,类似的框架还有swoole,应该都是一些第三方用C语言对PHP做的扩展(不是官方出的)。不管怎样,PHP开发的主流还是做web开发(CGI开发),需要依托服务器软件的那种开发模式。所以初学PHP的朋友,前期对PHP的学习方向主要以web开发为主,关于PHP网络编程这块可作为后期研究学习课程。


PHP是一门高级语言,而且是脚本,所谓高级语言就是更接近人类的语言,好理解。脚本语言不用自己写太多东西,语言本身已经封装了很多了。说说第六章的内容,这一章节楠神带领大家去了解一些常用的PHP内置函数。PHP总共内置了一千多个函数,基本上满足了程序上各种功能需求,使用上都很简单,可能别的编程语言很复杂的写法在PHP中一个函数就搞定了。我们怎么去学习这些内置函数,是不是要死记?——肯定不是。学习PHP绝对不是死记所有的内置函数,我们不是有手册嘛,手册就相当于字典,有什么样的需求就去查找相关的函数(直接百度查有时更快更便捷)。虽说有一千个内置函数,常用的也就那几个,随着编程经验的增加,很多内置函数自然而然地顺手就能写出来。


1.png

PHP内置函数比程序员自己定义的函数效率要高很多,它是用C写的,所以能用内置的就最好不要自己去定义。


PHP内置函数还有一大好处——“直接就能用”。不像C语言,我使用一些函数还得引头文件(类似于PHP的require_once语句结构);像Java,我实现某些功能还能引进相关的类包文件。就这小小的一步,立马让楠神对PHP的好感提升好多。因为楠神都已经习惯了,在学C、Java时,好多东西老是拿来就用,都忘记引入。谁让那些头文件、类包文件有的都太难记,影响我学习的热情。


其实PHP有些函数也是不能直接用,是这样的,PHP有很多功能模块,有些模块默认是没有打开的,需要去PHP配置文件打开。

1.png

这是楠神本地的PHP配置文件,这一个个都是模块,把前面的“;”去掉,重启服务器就打开了。(这不是通用的打开模块的方式,不同的操作系统、不同的服务器软件会有所不同,“环境配置”不属于我们现在探讨的话题。)


如何查看PHP的模块有没有打开?在第四章第一节我们学过一个函数phpinfo(),用它就可以查看。

1.png

1.png

如果没有找到某个模块的名字,那就是没有打开。