运维力挺PHP完爆Java
运维力挺PHP完爆Java,同时PHP是世界上最好的语言没有之一!!!
-
半夜爬起来重启Tomcat有什么?
-
凌晨升级有没有?占用周末私人时间升级有没有?
-
空指针抛出异常崩溃有没有?
-
出现异常,一直解决不了有没有?
-
只能通过重启让系统苟延残喘的运行有没有?
-
抛出异常系统崩溃,业务暂停,被老板吊一顿有没有?运维背黑锅有没有?
-
程序问题老板会让开发处理,但会扣你一个运维反应不及时。
-
运维要派专人每天开发下载日志文件有没有?
-
Tomcat不敢用vhost(虚拟机)有没有,使用虚拟机一个系统崩溃全死有没有?
-
不能使用虚机机只能多个实例运行有没有?多个实例要开一堆端口有没有?
-
jsp页面被植入恶意代码有没有?
-
数据库链接池出问题有没有?
-
服务器监控一个晚上都在报警有没有?
-
配置文件搞死人有没有?
从运维角度,运维PHP项目远比Java来的轻松。 而Java网站就要非常费神,你要做好7*24小时待命,手机常开,准备随时重启,随时为开发提供日志,很多开发解决不了的问题,推给运维。 本汪目前为你还没有见过一个稳定健壮的Java程序。什么是稳定健壮的程序,能做到零错误,异常异常抛出,能够长时间稳定运行,不要半夜出事。
Web 运维
PHP Web解决方案主流有两种,一种是 Apache + mod_php 搭档,另一准是fastcgi系的php-fpm 通常跟 Nginx 搭档。
mod_php 与 php-fpm 无论哪种方案,健壮性,稳定性都远远超过Tomcat + Servlet。
理论上 Servlet 应该速度上好于 mod_php 跟 php-fpm。但实际情况并没有很突出,因为系统瓶颈不在应用服务器,而是数据库。
两个WEB解决方案都能通过负载均衡,横向扩展解决应用服务器压力问题。
mod_php 与 php-fpm 原理是一次请求,运行完毕便释放OS资源。无论程序有多烂都能正常运行完,某个功能模块出现问题,其他仍能正常使用。
Servlet 启动后全部载入内存,程序写的不够好,就容易崩溃。一崩溃就是出大事,连首页都进不去,这个矛头都会指向运维。
本地应用运维
什么是本地应用程序,说白了就是在命令行运行的应用。这些应用通常是定时运行,守护进程运行。
大部分Java开发者在Windows上使用Eclipse或者NetBeans一类的集成IDE开发,然后在IDE中编译好后交给运维,通常给过来的程序都运行有问题。
都说Java是跨平台,实际上不同平台之间还是有很大差异的。Java 实质上是夸VM,而无法做到跨平台。如果某个平台上面没有JVM,Java是无法跨过去的。
由于大部分Java开发者使用IDE开发,不涉及命令行处理,只需在IDE集成开发环境中点两个按钮Run跟Build即可,一旦离开IDE无从下手,不清楚在Linux上怎么搞。 我认为Ant,Ivy,Maven 应该是必须掌握的,时至今日很多Java开发者还没有听过Ant。
PHP开发者对linux命令的熟悉程度好于Java开发者,无用操心。Java吗至少陪着搞。
Java 不能访问底层,Jre 是运行在OS之上,守护进程实现起来需要写一个shell,实现启动,提取pid,pid写入文件,记录日志,进入后台运行,停止退出等等功能,这个脚本Java开发者通常搞不定。
PHP 能够调用 pcntl 写出完美守护进程。
本地应用程序一定会涉及多线程,PHP初级程序员培训后就可以写出质量不错的多线程程序,而Java中级软件工程师都未必写出同样质量的程序。 PHP的pcntl + pthreads + libevent 比 Java Thread + NIO 门槛低,学习成本低,上手快,更容易开发出高效稳定的应用程序。
配置复杂度
Java 不敢采用vhost模式运行,而是采用多个实例的方案,是为了降低崩溃后影响的面积,以及升级过程中停机的影响。 多实例问题来了,本可能高内聚的程序,多实例后项目之间产生了通信成本,每个项目部署后都携带大量的配置文件,配置起来十分繁琐,出现问题需要逐一排查。
这也是为什么Java项目一旦出现问题,排查耗时的原因。
安全性
很多人认为Java是编译运行,就安全了,这是大错特错的,实际情况Java网站攻击的机会与漏洞数量一点也不比PHP网站少。
被注入有没有?,被脱库有没有?
现在黑客已经很少搞破坏性攻击了,而更多的手法通常是控制肉鸡,获取有价值的数据。从外围寻找业务漏洞的方式来的更直接有效。
另外无论是Java还是PHP,很多开发人员都拒绝升级,因为每次升级都会扯出很多陈年BUG,谁都不想决解,承担责任。
很多版本厂家已经不在提供技术支持跟后续升级更新,一旦该版本出现漏洞,后果很严重,大家都心知肚明。
神马 PHP 5.2.17, JDK 1.5, Tomcat 5 都是坑,出了问题害的运维背黑锅。
总结
Java 运维应盯紧日志,Java 项目崩溃不是偶然的,是各种抛出异常积累结果。 对于Java项目,重启是万能的,通过脚本监控发现异常就重启,不要试图找出问题的根源,因为日志你永远看不懂,保证业务最重要,随后丢一份日志给开发人员,同时告知老板。
从运维角度看,使用什么语言并不重要,安全,稳定,健壮这才是王道。语言的各种不足可以从架构上,部署上,设计上弥补。
没有一种语言是全能的,每种语言在设计的时候都是针对某个领域或者倾向于解决某领域而设计的。
上面所提的很多问题并不全是语言的问题,可能是容器问题,可能是虚拟机问题。对于运维并不关心这些细节,很多人无法分清楚什么事语言,什么是编译器,什么事虚拟机,我们只看结果。