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++、汇编的人是如果笑你的真正懂的就不会在计算机语言上找存在感



     
     
  • 相关阅读:
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 695 岛屿的最大面积(DFS)
    Java实现 LeetCode 695 岛屿的最大面积(DFS)
    PHP serialize() 函数
    PHP print_r() 函数
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/8520239.html
Copyright © 2011-2022 走看看