zoukankan      html  css  js  c++  java
  • PHP 和 Java 的主要区别有哪些?

    PHP 和 Java 的主要区别有哪些?

    其实Java方面我要学的真的还有很多,要是有大项目的机会和经验就好,所以提前我肯定要把基础打扎实。
    我要学的还有很多,比如前段,后端,还有linux,还有肯定要写出完整的操作系统,而且Java方面要更加熟练。
    我需要把HTML5的那个进阶给学了。
    PHP资源很多,那么这就好玩了。
     

    PHP暂时还不支持像Java那样JIT运行时编译热点代码,但是PHP具有opcache机制,能够把脚本对应的opcode缓存在内存,PHP7中还支持配置opcache.file_cache导出opcode到文件.第三方的Facebook HHVM也支持JIT.另外PHP官方基于LLVM围绕opcache机制构建的Zend JIT分支也正在开发测试中.在php-src/Zend/bench.php测试显示,PHP JIT分支速度是PHP 5.4的10倍.
    https://github.com/zendtech/php-src/tree/zend-jit/ext/opcache/jit
    https://www.phpclasses.org/blog/post/493-php-performance-evolution.html
    

    PHP的库函数用C实现,而Java核心运行时类库(jdk/jre/lib/rt.jar,大于60MB)用Java编写(jdk/src.zip), 所以Java应用运行的时候,用户编写的代码以及引用的类库和框架都要在JVM上解释执行. Java的HotSpot机制,直到有方法被执行10000次(-XX:CompileThreshold=10000)才会触发JIT编译, 在此之前运行在解释模式下,以避免出现JIT编译花费的时间比方法解释执行消耗的时间还要多的情况.

    PHP内置模板引擎,自身就是模板语言.而Java Web需要使用JSP容器如Tomcat或第三方模板引擎.

    PHP内置HTTP服务器和SQLite数据库,以及Apache模块实现libphp.so和FastCGI服务PHP-FPM.而Java Web开发时普遍需要使用第三方的Servlet容器Tomcat等.
    PHP内置的单进程HTTP服务器(可用于快速开发和测试):
    php -S 127.0.0.1:8080 -t /www
    

    PHP-FPM跟Nginx一样,是多进程的架构,worker进程处理请求,master进程不处理请求,只负责维护worker进程,比如定量重启,崩溃重启等.PHP-FPM支持进程池的特性,不同进程池相互隔离,互不影响.比如你可以配置一个监听9000端口的进程池www和一个监听9001的进程池io来分离IO密集脚本:
    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实例就是一个进程.

    另外,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崩溃退出.

    对于PHP-FPM和Apache MOD_PHP来说,服务进程常驻内存,但一次请求释放一次资源,这种内存释放非常彻底. PHP基于引用计数的GC甚至都还没发挥作用程序就已经结束了. 而且,在PHP脚本中用unset显式释放内存也是立竿见影的,不会有延时.而Java的内存回收严重依赖GC机制,高并发下的Full GC会导致Java服务雪崩:JVM忙于用GC回收内存无法处理请求,而新请求又源源不断地到来.

    PHP的运行模式决定了PHP天然支持热部署,而Java要实现热部署并不容易.这也是为什么在虚拟主机托管环境里PHP占绝对优势的原因,因为开发者通过FTP上传PHP文件到虚拟空间就实现了代码更新和部署.

    PHP跨进程共享数据,除了使用基于文件的session机制和鸟哥开发的无锁共享内存缓存扩展Yac.Linux上还可以使用内存文件系统(tmpfs)上的SQLite(如/dev/shm/data.sqlite3).而Java程序的生命周期随JVM常驻内存,线程可以访问共享数据.

    PHP不存在数据库访问速度比Java慢的问题.PHP的数据库驱动如mysqlnd等都是C实现的驱动,而Java的数据库驱动JDBC是Java实现的驱动,PHP的驱动性能并不吃亏.而且PHP同样支持数据库持久连接,也就是多个请求能复用一个数据库连接,并不需要每个请求都打开一个数据库连接.比如下图就是两个PHP-FPM工作进程跟MySQL保持的两个长连接:


    PHP跟Java都诞生于1995年,没有PHP相对Java是后起之秀的说法,反倒是PHP一开始就是用于Web开发,而Java不是.Java的前身Oak语言,是为了嵌入式软件开发而设计.

    C实现的PHP后来吸收了C++的对象编程思想,加入了对象编程支持.既可以用过程式,也可以用对象,更灵活.而Java必须完全面向对象编程,甚至还要把类名和文件名挂钩.

    PHP能不能开发大型应用,取决于使用者是否因地制宜地使用PHP. 比如,PHP就不适合用来开发数据库引擎(大多都是C/C++实现)等计算密集型应用.Java在计算密集型应用上相比PHP更有优势,比如HBase数据库使用了Java实现.不过大多数Web应用都是I/O密集型应用,这里面包括网络I/O,文件系统I/O,数据库I/O.

    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
    ", sum/1024 }'
    }
    
    测试程序PunBB是一个MySQL驱动的PHP轻量级论坛.
    用siege并发10,压测1分钟,PHP-FPM工作进程的内存(RES)都是13.4MB,并不存在你所谓的PHP-FPM内存占用会不断随请求数量而增长的问题,有图有真相:
     
     
     
     php和nodejs一般被用于做大前端的开发,而java,go一般用于大后端的开发。两者方向不一样。我们公司大后端用的Scala,java的衍生产品。从难度上讲,大后端的东西肯定比大前端的复杂一点。
     
     


    1、语言难易比较

      PHP是一种解释执行的脚本语言,语法和C语言类似,易学易用,不懂电脑的非专业人员稍经学习也能使用PHP.而Java要先编译成Class文件,然后在Java虚拟机上执行,Java开发需要熟悉Java语法以及一些核心的架构,从而实现一种可复用的、跨平台的软件,Java培训比PHP培训要难学的多

    2、技术架构比较

      从技术架构来说,Java语言相比PHP有明显的优势,Java使用的是面向对象的系统设计方法,而PHP还是采用面向过程的开发方法。PHP只能实现简单的分布式两层或三层的架构,而JAVA可以实现多层架构。数据库层、应用逻辑层、表示逻辑层彼此分开,而且现在不同的层都已经有一些成熟的开发框架的支持。例如Struts就是利用Java的web开发技术实现了MVC的设计模式,而在业务逻辑层也有Spring框架,数据库持久化层有Hibernate等框架。这些框架可以方便开发者高效、合理、科学得架构多层的商业应用。从数学运算和数据库访问速度来讲,Java的性能也优于PHP.实际上,对于跨平台的大型的企业应用系统来讲,Java几乎已经成为唯一的选择

    3、Java和PHP技术层面对比

      Java是纯面向对象开发,功能强大,分支众多,没有Java不能做的软件。C/S也好B/S也好。从功能上讲,没有语言可以和Java相比

      PHP属于后起之秀,吸收了Java和c以及perl等语言优点,专注互联网领域。WEB领域PHP拥有得天独厚的优势,WEB领域没有语言可以和他比

    4、Java和PHP的发展空间对比

      安卓势头很猛,但手机安装app数量有限,推广难,也是app面临的最大挑战,好在安卓只有JAVA可以做,除此之外就是HTML5了。目前来说互联网的发展空间巨大,而互联网离不开WEB,WEB离不开PHP。两者相比,个人觉得PHP的优势更加明显。

    5、适用性比较

      PHP适合于快速开发,中小型应用系统,开发成本低,能够对变动的需求作出快速的反应。而Java适合于开发大型的应用系统,应用的前景比较广阔,系统易维护、可复用性较好。还有,同样功能的系统用Java开发的系统要比PHP开发的系统的价格要高

    6、薪资比较

      薪资事由供求关系决定的,人才缺失,薪资自然高,人才饱和,薪资自然不会高。从需求上看企业对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才略微完善了面向对象的机制

    记忆写成,如有错误,欢迎指出
     
    对答案中有些关于 Java 的观点略有不同:
    1. 如果说 Java 的『最小单位』是类,那么 php 的『最小单位』应该是文件。
    2. Android 并不属于也不是 Java ME(答案中好像误写成了 J2SE) 平台。
    3. Java SE 并不是桌面编程,而是 Java 标准版本,并且也没有没落,因为它是 Java EE 和 Android 开发的基础。
    4. Java EE 并不只是 Web 方向,而是一套适用于企业级应用的标准和相关实现。
     
    你说的第一点不怎么赞同,java因为IDE里面直接集成了对文件的编译,而php必须要用浏览器访问,是否因此认为php最小单位是文件呢?其实php可以直接像python一样命令行交互,不过因为php本身设计的问题,使得其很不流行
    第二点同意,我在里面说了android使用的是其自身的虚拟机,只是借用了java的语法
    第三点我同意:我在文中只是说J2SE的主要应用,任何学校教java都是从J2SE开始的
    第四点同意,我在文中说了其在企业级的解决方案还是老大
     
     
    语言的差别还是比较大的, 想对于 语言, 差别大了去的更多在 JVM 和 Zend Engine or HHVM , 作为同时使用 PHP 和 Java 的我,主观的来说句吧。 赶紧去学下Java 学下PHP, 然后都到了中等水平后(这个很难把握), 你就知道Java 的强大在哪里(很多来自于他继承了C++的依钵,干了很多以前C++干的事儿,而且如今在Web领域大发光彩,但他的最强大的地方可能还是,成熟、稳定、现在性能极高); php么,作为Web领域而言,确实非常好用, 但是希望大家好好去看看为什么 要有 HHVM ,你就知道了, PHP会前进的方向, 现在 PHP7 的方向
     
    Java有GC并不意味着不存在内存泄露.PHP请求完成后释放内存并不依赖PHP的GC.

    另外PHP服务进程如带PHP模块的Apache进程或者PHP-FPM进程都是常驻后台,只不过额外支持动态伸缩的配置,也就是繁忙时fork出更多的进程服务,空闲时关闭一些进程来腾出内存,当然,你配置了不增不减固定个数的常驻进程也完全可以,比如PHP-FPM:
    pm = static
    pm.max_children = 8
    那PHP-FPM就是后台固定常驻8个工作进程.

    另外PHP脚本对应的中间码opcode可以通过opcache机制缓存在内存.还有PHP通过Linux内存文件系统上的SQLite如/dev/shm/data.sqlite3也可以实现跨进程共享数据.
     
     

    鄙人工作需要,两种语言不断切换,就简单谈一谈两者区别

    首先php确实是开发速度极快,为什么?因为弱类型(php7有类型声明选择开关,只要引入开关指令declare(strict_type=1)就会强制当前的文件下的程序遵循严格的参数类型,返回值类型),不需要定义返回的类型,加上php实际开发过程中喜欢运用它万能的数组来做计算,返回。所以他的动态扩展性非常强,如果返回值结构改变,没关系,直接改数组结构就行(注意,php数组太强大,可以当作map,list来用,底层的实现其实是hashmap)
    而java可能要开发过程可能要慢一点,java面向对象的技巧,设计模式会运用的更多一点。需要定义各类model来适应你业务的需求。编写风格会有一定的统一要求。强类型在编写的时候会比php麻烦,但好处是更安全,因为类型固定,潜在风险较低,还有编译器给你做了一次保障



    php几天就能入门做出东西,主要是资源太多,当然深入并不容易。Java的话,就不要想了,深入到安卓开发就更那啥了。我是做Vb转到asp又转到php,php我快熟透了。现在刚接触Java,得需要时间,Java很严谨很健壮,很多地方不是php能比的,完全不是一个层次。php就是为web而生的,Java的话转安卓吧,毕竟屠龙术你会了得有龙。


    没有本质上的不同。要说可能是Java编译成为字节码,执行的时候不依赖原文件,只执行字节码。有点类似于把c语言编译成汇编的意思。对,是很类似。实际上php要执行,也要有这个过程,把程序原文件,编译成命令集。然后程序的执行,只不过是按照顺序执行命令集而已。只是说Java编译成命令集的过程只有一遍,而PHP则每次执行都要编译
    其实在大部分情况下,这两者之间并不会产生较大的性能差异。而且php也有类似于memcache,wincache,eAccelerator这样的中间件,可以使得字节码的编译只要一次,第一次编译的字节码会缓存在内存中,第二遍不再重新编译。
    Java的一直再自己给自己定义的一个和php的不同,是叫做企业级应用。言外之意好像再说php不适合做企业级应用。但是实际情况却很打击java。现在即使是企业级应用,市场也在逐渐被php吞噬了。为了做企业级应用垒砌的高逼格,导致学习成本加大,维护成本增加,开发周期延长。除了在同样需要逼格衬托的erp领域把类似金蝶这样的软件公司养的肥肥之外,基本上真正的互联网公司大部分更钟爱php。看看招聘网站就知道现在招聘php的比java的多多少。
     
     
    JAVA是
    一门强类型的静态语言,几乎什么都能做。而PHP只是一个超文本解释器而已,它的诞生之初只是为了网页动态化早期的PHP的写法偏向于面向过程。面向对象开发也很难做到像JAVA那样大而全,不过后来像反射这一类技术的改进,PHP进化到7,也支持强类型了。PHP在WEB服务器端开发也有很强的一席地位,不过在复杂大型WEB系统中终究不是比不过像JAVA这一类的语言。别说Facebook用什么PHP,人家核心都HHVM了。
    尽管如此,PHP仍是世界上最好的语言它的易学,超简单的热部署,能让初学者有很大的成就感。所以语言倒是越简单越易上最好。像我大学刚开始学的C,处理字符串都要手动,后来学C++,感觉C++比C方便多了,后来学JAVA,感觉JAVA又比C++方便,直到今后的c#,PHP,Python...真是一个比一个用起来简单。


    1.php适合处理单线程,java适合处理多线程;
    2.php适合处理业务需求,java适合处理后端数据;
    3.php开发效率较高,同等任务,所需时间一般是java的1/2到1/3;
    4.php更多是面向过程开发,java是面向对象编程;
    5.php程序员相对java程序员较便宜,薪资一般是其的70%左右;
    6.php相对与java安全性较差;
    7.php版本更新较快,java版本稳定,更新慢;
    8.php适合中小型系统,java适合大型系统;
    9.php易学难精,java入门困难精通更难;
    10.php是将才,java是帅才;



    编程最重要的思想,一个只会copy、生成代码、讲速度,而不重架构的程序员,能算得上是程序员吗,典型的码农



     
    物尽其用。各自的长处不一样,没必要什么语言鄙视,PHP本来就是做网站快速开发。总有些人觉得玩个二次编译的强类型语言就比别人智商高了,菜鸟就是菜鸟,不是因为你用什么写程序就能改变的,还有JAVA的JVM和各大框架、无尽的类库。JAVAer不都是用现成的?有几个知道底层实现的细节?用解释语言笑动态脚本语言的时候。有没有想过搞C/C++、汇编的人是如果笑你的真正懂的就不会在计算机语言上找存在感



     
     
  • 相关阅读:
    spring framework体系结构及模块jar依赖关系
    Spring的核心jar包
    Spring AOP的理解和使用
    Spring特点与工作原理
    接口和抽象类的区别
    Java重载和重写的区别
    Jdk1.8中的HashMap实现原理
    Java集合中List,Set以及Map等集合体系详解
    Spring面试题整理
    ActiveMQ入门操作示例
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/8520239.html
Copyright © 2011-2022 走看看