Web开发中的18个关键性错误

前几年,我有机会能参与一些有趣的项目,并且独立完成开发、升级、重构以及新功能的开发等工作。

本文总结了一些PHP程序员在Web开发中经常 忽略的关键错误,尤其是在处理中大型的项目上问题更为突出。典型的错误表现在不能很好区分各种开发环境和没有使用缓存和备份等。

下面以PHP为例,但是其核心思想对每一个Web程序员都是适用的。

应用程序级别的错误

1、在开发阶段关闭了错误报告

我唯一想问的是:为什么?为什么在开发的时候要关闭错误报告?

PHP有很多级别的错误报告,在开发阶段我们必须将它们全部开启。

如果你觉得错误不会发生,那么你把程序太理想化了,在现实世界中,错误是必然的。error_reporting和display_error是两个完全不同的方法,error_reporting()设置了错误的级别,而display_errors则是设置错误信息是否要被输出。

在开发阶段,错误报告的级别应该设置成最高的,比如以下设置: error_reporting(E_ALL);以及ini_set(‘display_errors’, true);

2、淹没错误

和上一点相反,很多程序员喜欢将错误淹没了,你明知道错误会发生,但是你选择将错误隐藏掉,然后可以早早回家睡大觉,殊不知将来会发生更严重的错误。

3、代码中任何地方都没有使用日志

软件开发的一开始你就要牢记使用日志,不能到项目结束了才去弥补日志功能。很多程序员都会用这样或那样的手段进行日志记录,但是很少有人能真正用日志来记录异常信息,试问一个没有人查看的日志系统有什么用?

4、没有使用缓存

在的应用系统中,我们可以在多个系统层次上使用缓存,比如在服务端、应用端和数据库端等。和日志一样,缓存也应该在一开始就应用到系统中去,你可以在开发阶段禁用缓存,等到了产品发布后再将缓存开启。

5、丢弃了最佳实践和设计模式

你看到过多少人使用自己的密码加密算法?很遗憾的告诉你,有很多,因为他们认为将更了解它。

最好的实践方式和设计模式已经由前辈创建了,这往往比你自己再造一个轮子要来的简单奏效,我们开发者只需要熟练掌握这些设计模式并且合理地应用在项目中即可,比如一些加密算法。

6、没有使用自动化测试

在每一个Web项目中都会使用到测试,就像日志一样,如果没有人管理和使用,那么测试也是一无是处的。

运行测试工程是一项枯燥乏味的工作,幸好有一系列工具帮助我们实现自动化测试。在PHP开发中,有一款很好的测试工具叫Jenkins,使用起来非常方便。

7、没有做代码审查

在团队中工作是一项非常大的挑战,因为每一个成员都有自己不同的工作习惯和方式,如果没有良好的规范,那么项目开发就会走很多弯路。

团队中的每一个成员都应该互相审查代码,就像单元测试,它可以帮助项目变得更加干净和一致性。

8、编程只考虑理想情况

你是否遇到过自己或者别人的代码在交到客户手中后经常出问题,甚至是乱套了?我当然没有。

出现这种情况往往是因为开发者懒惰了,只考虑了理想情况,这会导致数据库崩溃了、PHP发生致命错误、甚至是服务器被黑。程序员在写代码时不仅要考虑最理想的情况,更要考虑最坏的情况,思考全面,才能让代码覆盖所有的情况。

9、没有正确运用面向对象编程的思想

大部分PHP初学者都不会再其代码中运用面向对象的思想,因为这个概念在刚开始的时候很难理解。

当然面向对象的概念并不是简单地将一些类组织在一起。

对象、属性、方法、继承和封装等都是OOP中最基本的概念,开发者正确使用了面向对象设计模式后,就有能力写出更干净、更有扩展性的代码了。

10、“飞行模式”(On-the-fly)编程

大部分开发者都会遇到这样的情况:“快,客户需要一项新功能,要能运行ASAP”,于是你就在源代码上新增一些功能,然后直接上传到正在运行的服务器上,这种编程方式我们称其为“飞行模式”(On-the-fly)编程。

我们在开发软件时,尤其是中大型的项目,都必须按照工作流程来进行分析、编程和发布,这将大大减少未来软件的bug。这种“飞行模式”并不可取。

数据库级别的错误

11、没有将数据库读写分离

为了能长时间运行复杂的系统,每一个程序员都应该考虑到系统的可扩展性,系统99%的时间都不需要考虑扩展,因为并没有如此大的流量。

为什么要数据库读写分离?

在每一个系统中,数据库将会是第一个出现的瓶颈,在大流量的冲击下,数据库很可能将会是第一个阵亡的。所以大部分情况下我们会用多个数据库来分散流量,开发者经常会使用Master – Slave模式或者Master – Master 模式。Master – Slave是最受欢迎的一种数据库分压模式,它会将指定的select语句路由到每一个Slave服务器,这样Master服务器的压力会减轻不少。

12、代码只能连接到一个数据库

这和上一个错误非常像,但是开发者有时候因为某些原因需要连接到多个数据库,比如你会将用户日志、活动信息流、实时数据分析等高负载的数据放到不同的数据库中来缓解对主数据库的压力。

13、没有检测数据库漏洞

如果你不对数据库进行漏洞检测,就相当于给大部分黑客敞开了服务器的大门。

在众多漏洞中,数据库漏洞是最脆弱的,最常见的就是SQL注入。因此定期做数据库漏洞检测还是很有必要的。

14、数据表不建索引

索引在数据表中有着非常重要的作用,合适的索引可以提高每张表的性能,这里有一篇文章就讲述了如何创建索引以及何时创建索引。

15、没有使用事务机制

数据完整性对Web系统非常重要,如果数据一致性发生错误,那么整个系统都会崩溃并且难以修复。合理地运用数据库的事务机制将有效地解决这个问题。比如你要保存用户数据,在table1中有e-mail, username和password,table2中有first name, last name,和gender age。我们可以利用事务对两张表更新时保证数据同时被更新或者同时不被更新。

16、没有加密敏感数据

对于数据库中的敏感信息,如果你不对它们进行加密,或者用简单的算法进行加密,那么在2014年你肯定会遇到一些麻烦的问题,黑客们一旦入侵你的数据库,用户的密码或者其他重要信息就会一览无余。

PHP5.5中提供了一个哈希加密方法,使用如下:

$hash = password_hash( $password, PASSWORD_BCRYPT );

17、没有备份

看到下面这张图片没,如果遇到这样的情况,你又没有备份,那么一切都over了。

18、没有监控

没有监控,你将不知道接下来会发生什么事情,对于监控,要注意以下几个问题:

  • 有多少人可以直接访问这个应用服务?
  • 服务器是否在高负载下运行?
  • 我们需要用另一台数据库服务器来扩展系统吗?
  • 应用系统的失败点在哪里?
  • 系统目前正处于离线状态吗?
时间: 2024-10-12 03:49:34

Web开发中的18个关键性错误的相关文章

(转)Web开发中最致命的小错误

Web开发中最致命的小错误 现在,有越来越多所谓的“教程”来帮助我们提高网站的易用性.本文收集了一些在 Web 开发中容易出错和被忽略的小问题,并且提供了参考的解决方案,以便于帮助 Web 开发者更好的完善网站. 通过避免下面这些小错误,可以使得我们的网站变得更为友好. 错误1:表单的 label 标签跟表单字段没有关联 利用“for”属性允许用户单击 label 也可以选中表单中的内容.这可以扩大复选框和单选框的点击区域,非常实用. 错误2:logo 图片没有链接到主页 点击网站 logo 就

Web开发中最致命的8个小错误

现在,有越来越多所谓的“教程”来帮助我们提高网站的易用性.本文收集了一些在 Web 开发中容易出错和被忽略的小问题,并且提供了参考的解决方案,以便于帮助 Web 开发者更好的完善网站. 通过避免下面这些小错误,可以使得我们的网站变得更为友好. 错误1:表单的 label 标签跟表单字段没有关联 利用“for”属性允许用户单击 label 也可以选中表单中的内容.这可以扩大复选框和单选框的点击区域,非常实用. 错误2:logo 图片没有链接到主页 点击网站 logo 就能转到主页已经成为了网民的条

Web开发中致命的8个小错误

现在,有越来越多所谓的"教程"来帮助我们提高网站的易用性.本文收集了一些在Web开发中容易出错和被忽略的小问题,并且提供了参考的解决方案,以便于帮助Web开发者更好的完善网站. 通过避免下面这些小错误,可以使得我们的网站变得更为友好. 错误1:表单的label标签跟表单字段没有关联 利用"for"属性允许用户单击label也可以选中表单中的内容.这可以扩大复选框和单选框的点击区域,非常实用. 错误2:logo图片没有链接到主页 点击网站logo就能转到主页已经成为了

Web 开发中 20 个很有用的 CSS 库

转自:http://www.oschina.net/translate/css-libraries-for-developers 在过去的几年中,CSS已经成为一大部分开发者和设计者的最爱,因为它提供了一系列功能和特性.每个月都有无数个围绕CSS的工具被开发者发布以简化WEB开发.像CSS 库,框架,应用这样的工具能够为开发者做很多事,而且可以使开发者创造出创新立异的WEB应用. 在这篇文件章中我们找到了一系列对开发者有用的CSS库,它们能帮助开发者在一定的期限内取得有创造性和创新性的成果.我们

Web开发中 前端路由 实现的几种方式和适用场景

浅析Web开发中前端路由实现的几种方式 主题 Web开发 故事从名叫Oliver的绿箭虾`说起,这位大虾酷爱社交网站,一天他打开了 Twitter ,从发过的tweets的选项卡一路切到followers选项卡,Oliver发现页面的内容变化了,URL也变化了,但为什么页面没有闪烁刷新呢?于是Oliver打开的网络监控器(没错,Oliver是个程序员),他惊讶地发现在切换选项卡时,只有几个XHR请求发生,但页面的URL却在对应着变化,这让Oliver不得不去思考这一机制的原因- 叙事体故事讲完,

Web开发中前台与后台技术小结--关于EL表达式,JSTL,eval()函数

在我们日常Web开发中,常常用到EL表达式,JSTL标签,还有可能用到JavaScript中的eval().下面就这样技术和函数小小说明一下. EL(Expression Language),全称表达式语言,既然是开发语言,那么就像Java等语言一样是用来写语句的,通常是用在JSP页面中,我们为了获取JSP提供的内置对象的属性值, 我们通常会使用到EL表达式,比如开发中常见的一个需求就是获取项目的根目录,如果项目的名值变化了,我们在指定路径时,如果把项目的根目录用一个变量来表示的话,那么就不 需

浅析Web开发中前端路由实现的几种方式

故事从名叫Oliver的绿箭虾`说起,这位大虾酷爱社交网站,一天他打开了 Twitter ,从发过的tweets的选项卡一路切到followers选项卡,Oliver发现页面的内容变化了,URL也变化了,但为什么页面没有闪烁刷新呢?于是Oliver打开的网络监控器(没错,Oliver是个程序员),他惊讶地发现在切换选项卡时,只有几个XHR请求发生,但页面的URL却在对应着变化,这让Oliver不得不去思考这一机制的原因… 叙事体故事讲完,进入正题.首先,我们知道传统而经典的Web开发中,服务器端

java web开发中的奇葩事web.xml中context-param中的注释

同事提交了代码.结果除同事之外,其他人全部编译报错.报错说web.xml中配置的一个bean 没有定义.按照报错提示,各种找,无果. 由于代码全部都是提交到svn主干,之前也没有做过备份,只能一步一步删除同事提交的代码,进行还原. 奇葩事情出现了! <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:/context_entry.xml

web开发中的安全问题

web开发中很多东西由前段来负责判断,比如常见的邮箱 电话号码,前端判断到不是一个正确的格式,在你点击提交时候提示你格式填错了,然后不请求后端php,直到你填写正确的格式为止.这种其实可以修改js或者干脆用python里面的requests之类的http请求库直接请求接口,那么可以成功把错误的东西提交给后端进而存储到数据库了,那么这种就不太好了. 如果系统不重要,用的人不多,可以勉强放过这一点. 但有的很重要的系统,尤其涉及到金钱的接口,后端必须也做好验证.否则有人利用漏洞来破坏规则,造成金钱的