https://github.com/zendtech/php-src/tree/zend-jit/ext/opcache/jit
https://www.phpclasses.org/blog/post/493-php-performance-evolution.html
PHP内置模板引擎,自身就是模板语言.而Java Web须要使用JSP容器如Tomcat或第三方模板引擎.php
PHP内置HTTP服务器和SQLite数据库,以及 Apache模块实现libphp.so和FastCGI服务PHP-FPM.而Java Web开发时广泛须要使用第三方的Servlet容器Tomcat等.PHP内置的单进程HTTP服务器(可用于快速开发和测试):
php -S 127.0.0.1:8080 -t /www
nginx.conf: 访问io.php的请求都交给监听9001的PHP-FPM进程池处理
location = /io.php {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9001;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
php-fpm: 正常脚本由静态www池处理,阻塞脚本由动态io池处理
[www]
;名为www的进程池监听9000端口,常驻进程数量为固定4个
listen = 127.0.0.1:9000
pm = static
pm.max_children = 4
[io]
;名为io的进程池监听9001端口,进程数常驻4个,最大8个
listen = 127.0.0.1:9001
pm = dynamic
pm.max_children = 8
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 4
其中I/O密集这个进程池[io]采用动态的prefork进程,好比这里是繁忙时8个,空闲时4个.
利用PHP-FPM提供的池的隔离性,分离计算密集和I/O密集操做,能够减小阻塞对整个PHP应用的影响.
也就是说,PHP经过多进程利用多核实现并发,而Java广泛经过多线程实现并发,由于一个JVM实例就是一个进程.html
另外,PHP也能够运行在多线程模式下,好比Apache的event MPM和Facebook的HHVM都是多线程架构.无论是多进程仍是多线程的PHP Web运行模式,都不须要PHP开发者关心和控制,也就是说PHP开发者不须要写代码参与进程和线程的管理,这些都由PHP-FPM/HHVM/Apache实现.前端
PHP-FPM进程管理和并发实现并不须要PHP开发者关心,而Java多线程编程须要Java开发者编码参与.PHP一个worker进程崩溃,master进程会自动新建一个新的worker进程,并不会致使PHP服务崩溃.而Java多线程编程稍有不慎(好比没有捕获异常)就会致使JVM崩溃退出.java
对于PHP-FPM和Apache MOD_PHP来讲,服务进程常驻内存,但一次请求释放一次资源,这种内存释放很是完全. PHP基于引用计数的GC甚至都还没发挥做用程序就已经结束了. 并且,在PHP脚本中用unset显式释放内存也是立竿见影的,不会有延时.而Java的内存回收严重依赖GC机制,高并发下的Full GC会致使Java服务雪崩:JVM忙于用GC回收内存没法处理请求,而新请求又源源不断地到来.node
PHP的运行模式决定了PHP自然支持热部署,而Java要实现热部署并不容易.这也是为何在虚拟主机托管环境里PHP占绝对优点的缘由,由于开发者经过FTP上传PHP文件到虚拟空间就实现了代码更新和部署.python
PHP跨进程共享数据,除了使用基于文件的session机制和鸟哥开发的无锁共享内存缓存扩展Yac.Linux上还可使用内存文件系统(tmpfs)上的SQLite(如/dev/shm/data.sqlite3).而Java程序的生命周期随JVM常驻内存,线程能够访问共享数据.mysql
PHP不存在数据库访问速度比Java慢的问题.PHP的数据库驱动如mysqlnd等都是C实现的驱动,而Java的数据库驱动JDBC是Java实现的驱动,PHP的驱动性能并不吃亏.并且PHP一样支持数据库持久链接,也就是多个请求能复用一个数据库链接,并不须要每一个请求都打开一个数据库链接.好比下图就是两个PHP-FPM工做进程跟MySQL保持的两个长链接:react
C实现的PHP后来吸取了C++的对象编程思想,加入了对象编程支持.既能够用过程式,也能够用对象,更灵活.而Java必须彻底面向对象编程,甚至还要把类名和文件名挂钩.linux
PHP能不能开发大型应用,取决于使用者是否因地制宜地使用PHP. 好比,PHP就不适合用来开发数据库引擎(大多都是C/C++实现)等计算密集型应用.Java在计算密集型应用上相比PHP更有优点,好比HBase数据库使用了Java实现.不过大多数Web应用都是I/O密集型应用,这里面包括网络I/O,文件系统I/O,数据库I/O.android
PHP是C实现的Web快速开发框架,不依赖第三方框架也能实现快速开发.而Java Web开发广泛依赖Spring等第三方框架.
补充:
回复
数据库持久链接很容易用,mysqli里host参数传递p:127.0.0.1就能开启持久链接,pdo_mysql里把PDO::ATTR_PERSISTENT设为true也能够开启持久链接.并且PHP的数据库持久链接也不依赖PHP-FPM,个人截图不过是举例说明,其实用Apache也同样能够.只是PHP-FPM的进程数或者Apache进程/线程数最好配置为固定数量,并且要求数量不能超过MySQL最大链接数(max_connections默认是151).
进程间共享数据,除了Yac,我不是还说了Linux内存文件系统tmpfs上的SQLite么?SQLite的锁机制够用了呀,连事务都支持,你担忧什么?并且内存上也不须要担忧SQLite的读写性能限制,彻底是SQLite引擎在内存上的计算密集操做.能利用Linux的tmpfs机制,能利用SQLite的锁机制,而不依赖PHP实现,我以为颇有优点很稳定.
这里讨论的不是Swoole这类CLI下实现的PHP服务,而是PHP传统的FastCGI模式.长时间后台常驻运行的PHP脚本,固然须要GC.对于一些要求实时的高并发应用,我以为就不该该使用GC机制.PHP能够配置zend.enable_gc=off来禁用GC,而且本身经过unset来手动释放内存.不过运行在FastCGI下的PHP脚本生命周期很短,其实原本就不依赖GC.再次强调,高并发实时类应用,GC毫不是一个优点,而是一个劣势.
PHP常见的SAPI有这么几种:
php(cli,cli-server)
php-cgi(cgi-fcgi)
php-fpm/hhvm(fpm-fcgi)
libphp7.so/php7apache2_4.dll(apache2handler)
fpm-fcgi和apache2handler下,不管是多进程模式仍是多线程模式,进程和线程的实现和管理都不须要PHP开发者关心(这是优点),而是由php-fpm/hhvm/apache实现.PHP开发者若是要参与多进程或多线程编程,彻底能够在php-cli下实现,相关PECL扩展包括pcntl多进程,pthreads多线程,libevent事件驱动等等,相关的项目实现有WorkerMan.另外峰哥的Swoole也须要用php-cli跑,但其服务的进程和线程控制也是由Swoole实现而不太须要PHP开发者关心.
PHP从5.4内置的单进程HTTP服务器,目的就是用于快速的开发和测试,我以为是一个很方便的工具,开发者不须要安装和配置Apache或者Nginx之类Web服务器就能进行入门开发.并且把PHP解释器交叉编译到Android手机或者OpenWRT无线路由就能用PHP这个省资源的HTTP服务器在局域网内编程并提供服务,很方便.
JIT在大量计算上有优点,bench.php脚本就是用来测试计算性能.真实应用如WordPress等,JIT能带来的性能提高确定不会这么明显,具备JIT机制的HHVM和没有JIT的PHP7,在压力测试WordPress时体现出同一水平,就说明了这个问题.并且我强调过,Web应用大可能是I/O密集型应用,编译型语言不会在I/O密集型应用里也具备数量级的优点.因此说,对于大多数PHP开发者来讲,就算是没有JIT机制的PHP7,性能也够用了.
回复mem php-fpm && siege -c10 -t1M http://www.example.com/app/punbb/index.php > /dev/null && mem php-fpm
其中mem是我定义在~/.bashrc里的一个用于快速根据名称查看程序状况的函数:
mem ()
{
top -n1 -b | head -n7 | sed '1,6d' && top -n1 -b | sed '1,7d' | grep --color=auto -i $1;
ps aux | grep --color=auto -i $1 | grep --color=auto -v grep | awk -F " " '{ sum += $6 } END { printf "Total Memory Usage: %.1f MB\n", sum/1024 }'
}
一、语言难易比较
PHP是一种解释执行的脚本语言,语法和C语言相似,易学易用,不懂电脑的非专业人员稍经学习也能使用PHP.而Java要先编译成Class文件,而后在Java虚拟机上执行,Java开发须要熟悉Java语法以及一些核心的架构,从而实现一种可复用的、跨平台的软件,Java培训比PHP培训要难学的多。
二、技术架构比较
从技术架构来讲,Java语言相比PHP有明显的优点,Java使用的是面向对象的系统设计方法,而PHP仍是采用面向过程的开发方法。PHP只能实现简单的分布式两层或三层的架构,而JAVA能够实现多层架构。数据库层、应用逻辑层、表示逻辑层彼此分开,并且如今不一样的层都已经有一些成熟的开发框架的支持。例如Struts就是利用Java的web开发技术实现了MVC的设计模式,而在业务逻辑层也有Spring框架,数据库持久化层有Hibernate等框架。这些框架能够方便开发者高效、合理、科学得架构多层的商业应用。从数学运算和数据库访问速度来说,Java的性能也优于PHP.实际上,对于跨平台的大型的企业应用系统来说,Java几乎已经成为惟一的选择。
三、Java和PHP技术层面对比
Java是纯面向对象开发,功能强大,分支众多,没有Java不能作的软件。C/S也好B/S也好。从功能上讲,没有语言能够和Java相比。
PHP属于后起之秀,吸取了Java和c以及perl等语言优势,专一互联网领域。WEB领域PHP拥有得天独厚的优点,WEB领域没有语言能够和他比。
四、Java和PHP的发展空间对比
安卓势头很猛,但手机安装app数量有限,推广难,也是app面临的最大挑战,好在安卓只有JAVA能够作,除此以外就是HTML5了。目前来讲互联网的发展空间巨大,而互联网离不开WEB,WEB离不开PHP。二者相比,我的以为PHP的优点更加明显。
五、适用性比较
PHP适合于快速开发,中小型应用系统,开发成本低,可以对变更的需求做出快速的反应。而Java适合于开发大型的应用系统,应用的前景比较广阔,系统易维护、可复用性较好。还有,一样功能的系统用Java开发的系统要比PHP开发的系统的价格要高。
六、薪资比较
薪资事由供求关系决定的,人才缺失,薪资天然高,人才饱和,薪资天然不会高。从需求上看企业对Java人才的需求是比较大的,但Java方面的人太多,而PHP方面的人才要少不少,因此面上看PHP的薪资应该要高一些,但Java只要学得好,薪资高的也不少,这方面仍是看技术。
总结下:无论是PHP仍是Java都是不错的选择,目前来讲这两种语言都还处在势头上,可是从长远出发仍是Java好,毕竟从性能、处理数据各方面来看仍是Java有优点一些,固然最终选择仍是在你本身的手里。
简单说几点
1:java是半编译语言,php是脚本语言
2:java使用封装继承,最小的单位是类,php做为脚本,最小单位就是语句,用二者输出hello world就知道了,因此java语法比较严格,而php很灵活
3:java是自动内存分配回收,php是一次建立一次销毁,相同点:二者都不用考虑内存泄漏问题,不一样点:java能够常驻内存,多线程;php没法常驻内存,也没有线程的概念
4:java分三个方向
J2ME,嵌入式设备,安卓就是目前最大的J2ME平台,不过其使用的不是JVM,而是谷歌本身开发的虚拟机
J2SE,桌面编程,基本没落,须要JVM支持
J2EE,web方向的编程,近些年大规模的衰减,java语言排名榜之因此跌这么快,就是因为J2EE的出走,若是不是安卓兴起,java的现状可能更悲惨点,近年来脚本语言发展太快,挤压了java在web上面的开发。不过在企业级的解决方案里面,由于追求性能和安全行,基本上仍是java老大
PHP:不用想了,就是为web而生的语言,出了web什么都作不了,这既是它的缺点,也是它的优势,语法简洁灵活,和java冗长的语法正好造成对比
5:java已是一门很成熟的语言,或者说其语言的进一步提高已经不可能能了,曾经看到一篇文章,讲编程语言的进化,其中提到,java语言的进化树太全了,使得其没有发展的空间
php是在web繁荣以后兴起的语言,因此语言成熟度没有java高,2006年(若是我没记错的话)推出的php5.0才略微完善了面向对象的机制
鄙人工做须要,两种语言不断切换,就简单谈一谈二者区别
首先 php确实是开发速度极快,为何?由于 弱类型(php7有类型声明选择开关,只要引入开关指令declare(strict_type=1)就会强制当前的文件下的程序遵循严格的参数类型,返回值类型),不须要定义返回的类型,加上php实际开发过程当中喜欢运用它万能的数组来作计算,返回。因此他的 动态扩展性很是强,若是返回值结构改变,不要紧,直接改 数组结构就行(注意, php数组太强大,能够看成map,list来用,底层的实现实际上是hashmap)