php作为弱语言是最棒的~哈哈哈哈

来源:互联网 发布:软件著作权分类号 编辑:程序博客网 时间:2024/06/05 06:19
手动前言:最近项目出现不固定时间段两分钟的504啊,上服务器调日志发现是MYSQL最大连接数问题,数据库是跟别的部门共享的,应该是有别的部门在跑数据,拉高了数据库服务器的CPU,额!有运维,DBA问我,你设置的PHP连接池多少,我说PHP对MYSQL没有连接池概念,但可以用第三方扩展可以做到,比如swoole立马4-5张嘴说,怎么可能,JAVA都有,领导也说我,不可能吧,要不,你去查查资料!!!哎!最后我找了一些资料,发给各位爷,证明确定没有,他们才说,不好意思,我对PHP不太了解,对JAVA了解一点!!!
我又能说什么呢~~~各位爷开心就好~

一。如何理解php是弱类型语言
1.从变量角度:在声明一个变量不需要声明其类型,这事PHP的特色,因为他交给了底层
底层的变量存储是在一个zval结构里,声明一个变量会把所有类型都考虑到并开辟空间,同种类型默认用最大限度声明(int用long,float用double),这样绝对满足的所有变量的需求
2.从运算的角度:底层会根据你当前变量类型做转换并运算,并且返回结果做类型转换(string+string=int,float+string=float,sting('')==int0...);数组也可以加减参与运算;
从存储结构理解php空,null,0'0'falsehttp://blog.csdn.net/ty_hf/article/details/70217267

二。php生命周期:
主要分为3个阶段,开始阶段,运行阶段,结束阶段
开始阶段:
1.module_init: 初始化全局变量,引入standard标准库,加载php.ini。
启动apache就经历一次;加了dll或.so扩展,php.ini发生改变,重启nginx或apache的原因;
2.request_init:对全局变量赋值,激活zend引擎
运行阶段:
3.run:词法分析-语法分析-opcode
访问脚本,程序员们最熟悉的步骤了,你写的代码。
结束阶段:
4.request_shutdown:销毁使用的函数变量,回收内存
碰到die or exit自动进入此阶段并且调用析构方法 
5.module_shutdown:各模块最后一次释放内存
PHP内核--生命周期http://blog.csdn.net/ty_hf/article/details/52877759

三。变量的分离改变
变量8种类型:int string array float bool null resource object
存储在zval_value(存储变量的值)zval_struct(存储变量的类型引用等)
写时分离:PHP在修改一个变量以前,会首先查看这个变量的refcount,如果refcount大于1,PHP就会执行一个分离的例程.【recount -=1
写时改变:如果是一个引用的赋值,那会发生写实改变 【is_ref 由0->1
PHP内核的存储机制(分离/改变)http://blog.csdn.net/ty_hf/article/details/51057954

四。内存与垃圾回收
内存:
 1.内存是一次性申请:在sapi周期request_init,向系统申请内存,ZendMM向系统进行的内存申请,并不是有需要时向系统即时申请, 而是由ZendMM的最底层(heap层)先向系统申请一大块的内存, 建立一个类似于内存池的管理机制。
 2.用完后不释放:在sapi运行阶段,及时unset变量内存也不马上释放,而是归还heap堆层,将内存复用,避免多次内存申请和释放所带来性能消耗。
 3.统一释放:在sapi周期request_shutdown阶段,统一销毁释放内存
 4.内存配置:在php.ini配置,memory_limit=32M
垃圾回收
 1.php5.3以前,引用计数回收机制,变量都有recount的参数,当为0时判断无可用,回收。存在问题:内存泄漏怎么办
 2.php5.3以后,引用计数的基础上,加入了一个复杂的垃圾回收算法(不用了解),每发生一次内存泄漏可能操作时,记录到【根缓冲区】,到了10000执行一次算法,清理这里边的垃圾。
 3.效果:复杂的算法固然会有时间消耗,增加了6~7%,但是产生的回收机制节约可98.3%的内存,利大于弊。
PHP内核--探究内存管理与缓存机制http://blog.csdn.net/ty_hf/article/details/52905896
PHP内核--内存泄漏与新垃圾回收机制http://blog.csdn.net/ty_hf/article/details/52906258

五。命名空间:
作用:定义了不同的空间,解决了类,函数等名字的冲突
本质:比较简单,php底层会将 命名空间与定义函数名以\结合的形式展现,不就不重名了嘛
PHP内核--命名空间http://blog.csdn.net/ty_hf/article/details/52905209
原创粉丝点击