从PHP转向Java或.Net

4
我目前在LAMP上运行一个网站,正在将代码从普通php转换为Zend框架和Doctrine。我对设置感到满意,但经常发现因为我已经重命名了函数而在现场出现找不到函数的错误。这很令人沮丧,因为大部分时间都浪费在修补这些错误上。
因此,我决定从php切换到java,因为代码会被编译,所以只有错误不会进入现场。使用java Netbeans将更好。
但是,由于多年没有接触j2ee,我应该使用哪个java替代品最佳呢?
选项1.带有Hibernate的Jsf 2 选项2.Seam 选项3.Spring 选项4.带有Hibernate的Struts
我的服务器具有24 GB RAM和2个核心i7处理器以及RAID 0上的SSD驱动器。
如果使用Java,我的服务器是否可以处理相同数量的访问者而没有性能问题?
我喜欢更新我的网站而不失去实时会话(登录用户)。我能在Java中做到同样的事情吗?根据我的经验,每次更新网站都会重新部署应用程序,这会重置所有活动会话。
我喜欢考虑.NET,但根据我在大多数论坛上阅读的内容,没有人推荐它?
此致
敬礼
Zerone

4
为了澄清一下,您的网站编码很差,您决定换成Java是因为代码会被编译?现在...您为什么认为别人不会用Java编写糟糕的代码呢?注意:是的,Java代码确实比PHP执行更快。然而,我们谈论的是微小的改进(您能注意到1毫秒和0.5毫秒之间的区别吗?)。社交网络网站经常遇到从数据存储区(在您的情况下是MySQL)读取和写入的瓶颈问题,这些问题可以通过分发读取和写入并利用缓存系统(如Memcached)来解决数据库层。 - N.B.
1
@Marc B 至少在Java中,通过必要的重新编译,他将在编译时捕获所有引用,因此错误不会在实际网站上出现。 - Aleks G
@Aleks:如果他使用文件查找、重构、函数别名或单元测试,这些“错误”很容易被捕获。虽然有替代方案存在,但由于某种原因,他没有使用它们。 - Quamis
从PHP转向Java确实可以让您在编译时捕获一些错误,而这些错误有时在PHP中直到运行时才能捕获。使用一种可以在编译时检查依赖关系的语言确实会提供一定程度的“安全性”。话虽如此,使用Java的一个成本是通常需要更长时间来开发,有时甚至需要更长时间。权衡取舍。(我要注意的是,我更喜欢使用动态语言进行前端开发,并使用静态/编译语言进行后端工作) - RHSeeger
良好编写的PHPDoc和高质量IDE有助于对函数/方法进行安全删除。 - Sylwester
显示剩余2条评论
4个回答

2

你的问题并不是从PHP切换到Java,而是需要进行良好的测试覆盖,特别是整合测试。根据你所写的内容,最好的方法可能是看看Selenium,并尽可能自动化测试。你需要一个完整的基础设施来部署到测试系统上,并在其上运行整合测试(使用Selenium),然后才能说一切都正常。


编写单元测试需要花费大量的时间和思考,但是我是否需要为这些单元测试编写单元测试呢? - Zeronex
此外,PHP过于宽容,迫使你编写不整洁的代码。我也讨厌编写/@var和//@return,有时可以工作,有时则不能。 - Zeronex
嗯...我已经写了很长时间的PHP(6年)以及Java(同时也有7年的Java),所以区别只在于坐在键盘前。如果你写好代码,用哪种语言编写代码并不重要。存在许多技术可以支持编写良好的代码。如果你想重写代码,那么需要花费很长时间才能达到当前PHP实现的状态,并且需要更长的时间才能达到当前PHP代码的测试状态。我认为最好的投资是编写集成测试,然后重构代码。这将提高质量。 - khmarbaise

1

Java的性能更好,但是为了这种情况而切换到Java似乎有些过头。话虽如此,我建议使用基于Spring和Hibernate的东西。Spring可以为Java中的几乎任何配置提供真正的帮助,而Hibernate类似于Doctrine。

Apache Tapestry将成为您网站的良好演示工具包。它是一个比JSP更干净的优秀模板库。


我可以使用Tomcat作为服务器,Spring作为业务逻辑,Hibernate作为模型和Apache Tapestry作为前端吗? - Zeronex

0

Java有各种各样的解决方案来解决同一个问题。目前,在网页上呈现内容的主要Java解决方案是Java Server Faces。

旧的(并不总是更糟糕)解决方案包括Struts、Apache Tapestry、Spring的部分功能等。这些解决方案受益于成熟,已经拥有了一定的追随者等。基本上它们是好的解决方案,因为人们已经知道它们失败的点,并已经知道如何解决它们。新的解决方案试图消除这些痛点,因此会遇到新的痛点。可以把它看作是在修复断臂之后才注意到头疼。

Java的性能要优于其他语言,因为提供Web页面的代码已经在内存中,所以避免了一些需要时间的操作(启动进程、访问磁盘、Web服务器与语言引擎之间的通信等)。还有其他的PHP解决方案也尝试使用类似的技术来解决类似的问题;然而,PHP有着不同的编码背景和风格。例如,Java不需要在Web页面请求之间丢弃任何状态,而PHP却需要(并经常使用大量库和解决方案来减轻这种情况)。

我的建议是使用Java,但要意识到直接移植会产生很多不必要的开销。选择一个面向Web的工具包(JavaServerFaces是最新的并且是Java EE标准的一部分),并从移植HTML网页的静态部分开始。按范围(请求的副作用应该持续多长时间)组织您的请求,并使用Servlet标准将请求生成的工件存储在适当的应用程序、会话、请求等范围内。

在数据库方面,也有许多标准和解决方案可供选择。就个人而言,由于您没有太多的遗留问题,我会选择JPA。虽然它不是真正的100%完整解决方案,但它将推动您使用可以随着时间替换为更好实现的接口,而无需重新编写应用程序。当我说它不是100%完整时,我的意思是您需要选择一个JPA提供程序,因为默认提供程序可能无法满足您的实际生产需求。尽管如此,默认提供程序应该支持面向开发的工作,而JPA的标准应该保护您免受在不同环境下运行代码时出现的意外差异的影响。

无论您是想将代码完全重组为Java EE多层架构,还是只想嵌入一个大型Servlet(服务器面板是一种Servlet解决方案),它能够实现所有功能更多地取决于您希望如何架构代码。这不是一个迁移问题。话虽如此,典型的Java解决方案比典型的PHP解决方案的最大优点在于Java架构旨在以更快的速度工作并提供更多的开箱即用功能。如果您打算进行迁移而没有重构,则最好找出PHP代码中的瓶颈并修复它们。


根据您的经验,如果我切换到J2EE,我的服务器应该能够正常运行。 - Zeronex
根据我的经验,当你转向J2EE时,你将能够显著加快事情的进展;然而,最糟糕的性能问题并不是来自语言,而是来自浪费的编码。你可能会在某些部分看到一些性能提升,而在其他部分看到性能下降,平衡出适度的性能增益。然而,当你开始在新环境中重构代码时,你将会看到巨大的收益。Java有更多面向性能的工具,因此更容易看到瓶颈所在(并修复它们)。 - Edwin Buck

-1

如果您不使用Ajax,我更喜欢4(Struts + Hibernate):

  • JSF需要一些经验来处理这样的重负载(getter方法必须快速等等)。

如果您使用Ajax,我更喜欢3和1的组合

敬礼 彼得


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接