PHP的优缺点是什么?
本人做程序较长时间了,下面是一些个人的观点,不喜勿喷: 优点和缺点:
1:学习简单,做为一种脚本语言,学习简单是必须的!同样的,作为一种脚本语言,效率问题,永远是痛点,特别是复杂的运算
2:语法较随意,同样的,语法的随意性,使得在阅读没有注释的代码时,无法很清楚的明白到底是什么意思,比如Java,变量的类型是固定的,而php则前面可以是string,后面直接成array都没关系
3:php本身不支持多线程(swoole除外)
4:php没有直接操作内存的函数(至少本人不知道,6还没研究,不知道有没)
5:作为一种弱语言,php也算很好了,比之perl等也不错
6: php可以说应用范围很狭窄(个人理解,除了网页之外,好像没什么其他用途了,如果内嵌在游戏中那么python是不错的选择,cli也能凑合,),当然,我把php做的server-api这种模式也理解为是网页! 据说php6出来之后效率会提高很多,用了比较好的内存分配算法,但目前出来的是alpha版本,有很大的不稳定性 以上是个人见解,不喜勿喷!谢绝私信骂人!谢谢
php有点是移植性好,在windows、linux都可以使用,专门用于开发网站的。缺点嘛就是太多配置的地方,不同的程序可能需要单独配置下php.ini,这样一台服务器放很多站点就可能存在不兼容。
.net可以用于做网站,也可以做软件,仅支持windows,优点是有很多模块,开发速度很快,缺点就是和系统过度集成,安全性不是很好。
php有没有连接池?为什么很多书上都没有提及?
首先,php是可以实现连接池的,不过只能在cli模式下运行可以实现,通常我们的web服务是使用cgi模式运行的。
一般中小型应用,不太需要用到这个,主要php连接数据库的扩展基本都是c实现的,速度其实很快。
如果确实发现连接瓶颈(基本不太可能),你可以参考下面解决方案。
1. 你可以用命令行模式,写一个常驻后台的进程来实现连接池,开放接口给其他应用调用即可(不建议尝试,过于复杂,且稳定性待定)
2. 当你使用持久连接连接数据库的时候,实际上每一个fpm worker进程会对应一个mysql连接,你可以根据这个特点来配置phpfpm工作进程数和mysql连接数。(也不是太好)
3. 安装swoole扩展可以实现真正的连接池,而且效率非常好。
建议第三种方案,成熟且高性能。
php执行的生命周期是怎样的?
PHP的执行分三个阶段:
处理请求的开始阶段、处理请求阶段、请求之后的结束阶段。
处理请求的开始阶段:
1 模块初始化阶段(MINIT),在整个SAPI生命周期内(例如Apache启动以后的整个生命周期内或者命令行程序整个执行过程中),该过程只进行一次。(这应该就是为何修改了php.ini之后,要重启Apache的原因);
PHP_MINIT_FUNCTION(extension_name){
/* Initialize functions, classes etc */
}
2 请求初始化阶段(RINIT),该过程发生在请求阶段, 例如通过url请求某个页面,则在每次请求之前都会进行模块激活。(为何不先激活呢?因为方便模块在RINIT阶段针对各种请求设置环境变量或其他的操作);
PHP_RINIT_FUNCTION(extension_name) {
/* Initialize session variables, pre-populate variables, redefine global variables etc */
}
处理请求阶段:
1 词法分析:将php文件翻译成一个个的token;
2 语法分析:根据生成的token和语法规则进行分析;
3 Zend引擎:将代码编译为opcode后并执行,在执行的过程中还会重复进行编译-执行,例如执行了include语句 (为何不在第一次编译就把这些包含进来的文件也一起编译好?);
4 调用SAPI的输出函数返回执行结果。
处理请求的结束阶段:
1 关闭请求:RSHUTDOWN对应于RINIT,释放资源等操作
2 关闭模块:MSHUTDOWN对应于MINIT,SAPI生命周期结束(Web服务器退出或者命令行脚本执行完毕退出)
PHP_RSHUTDOWN_FUNCTION(extension_name) {
/* Do memory management, unset all variables used in the last PHP call etc */
}
PHP_MSHUTDOWN_FUNCTION(extension_name) {
/* Free handlers and persistent memory etc */
}

