2 h398085541 h398085541 于 2014.12.21 13:57 提问

作为大学生学it编程,目前主攻php,应看哪有书籍有助于自身能力的提高?

学习php一年,项目经验少,参加过几次学校比赛,负责后台编写,在编写过程中,遇到到这些问题,很多知识点都能实现同一个功能,就无从下手是用哪个知识点去实现了!比如,session与cookie为例,当时不太会用cookie,于是在实现用户登录模块的,全程用的session,也可以使用户信息显示。于是,我就有疑惑了,既然session、cookie都可以实现同样的功能,那到底是用session还是cookie?查资料,对二者的联系看的是懂非懂的!在此,希望大牛们能推荐些关于 项目实战方面的书籍,以助于小弟 在思想上有质的提高!

8个回答

caozhy
caozhy   Ds   Rxr 2014.12.21 19:21
已采纳

然后回答你另一个问题,就是学习PHP怎么学,看什么书

答案在这张图里面,点击放大。

guwei4037
guwei4037   Ds   Rxr 2014.12.21 14:07

PHP我不熟悉,不能给你意见。但是session和cookie的关系,我可以简单说一下。
session是在服务器端进行验证的,当客户端请求服务器的时候,始终都会带一个sessionId一起请求服务器端,这样服务器端获取到这个sessionId就知道是哪一个客户端发起的请求,从而实现用户跟踪。
cookie是客户端(浏览器)的“小甜饼”,比如在IE浏览器的临时目录下就有很多网站生成的文件,比如将某个网站的用户名存放在客户端,下次登录的时候就可以直接加载用户名,不需要重新输入。
至于什么时候用,我认为session能不用就不用,尽量使用cookie。session会占用服务器端的资源,这样会加重服务器端的负担。
技术上提高可以找相关书籍不断的实践即可,但是思想上的本质的提高,需要大量的实践之后的感悟和思考才能达到。所以你才学习PHP一年,建议还是多做项目,积累项目经验。多看一些软件设计、架构设计的书籍(比如:设计模式、UML、重构等等),几年之后自然会达到。

caozhy
caozhy   Ds   Rxr 2014.12.21 17:59

OK。先回答第一个问题,cookie和session分别是什么,什么时候用哪个。
这个首先要简单说一下http协议,对于你搞的网站来说,用户通过客户端访问你的网站,使用的是http协议,这是一种无状态的协议。所谓无状态,就是说,用户请求你的网站,你的网站解析发来的请求,返回网页。这个流程就结束了。
你的服务器就“忘记”了客户端的存在。
用户每次请求你的网站,你都觉得是一个新的用户。
你的服务器不能保持和客户端的连续的对话。
因此我们引入了session这个概念。session的作用是,将相同用户的多次请求关联起来,让服务器知道它们有一个上下文关系,属于一个用户,这就是session,会话这个词的来历。

caozhy
caozhy   Ds   Rxr 2014.12.21 18:06

我们知道会话这个概念是用来解决保持用户状态的。但是显然http协议中没有,怎么办?如果让你设计,你会怎么做?你可以想下。
其实不难理解,我们可以在客户端第一次访问服务器的时候,传一个随机数,或者指定的唯一的数字给客户端(我们可以管这个叫做令牌,或者叫token)。同时呢,服务器将这个数字记录在自己的内存中。并且把需要的变量关联给这个数字(一般用一个字典集合来表示)。
然后下次客户端再访问服务器,只要每次都传递给服务器这个令牌,服务器都去检查下那个字典,找出对应的数字,就可以知道这个用户以前的状态了。
因此服务器接收到用户的请求无非两种情况,一种是客户端没有带上令牌,或者带了令牌,但是没有查找到服务器上对应的记录,这种情况,服务器视作是一个新的客户端访问。否则视作是现有的一个客户端的连续访问。
客户端和服务器交互的过程中,服务器就可以保存下来客户端的一些状态。而不会忘记了。这有什么用处呢?

caozhy
caozhy   Ds   Rxr 2014.12.21 18:15

最简单的,服务器可以在用户登录的时候,验证了用户名密码,然后记住这个用户是已经登录了,以后不再询问。
那么你要说了,如果我每次客户端都附带上用户名和密码,服务器不用记住什么,每次都从我发送的用户名、密码中判断,岂不是用不着会话了么?显然这么做有两个坏处:
(1)用户名密码被不断传输,费时费力(2)用户名密码反复传输,加大了账户泄密的风险。
再看下面一个案例,就必须要用session了:
我们知道,很多网站为了防止无人工干预的程序滥用,会使用验证码。验证码的流程是,在服务器上随机产生一个数字,然后将它的图片混淆了以后传给客户端,让客户端人工辨认,然后提交后和服务器比较。这个情况设想下,能不能不用session呢?
我们还是像上次那样,产生了验证码让客户端收着?那客户端的程序也能得到验证码,岂不是掩耳盗铃,不需要人工验证了么?
不让客户端获取呢?显然也不行。服务器如果同时响应多个用户的请求,那么显然会产生很多个验证码,此时某个客户端提交了输入的验证码,服务器不跟踪用户状态,知道此时用户输入的是它哪次生成的验证码呢?要知道完全可能第一个用户首先请求了验证图片,第二个用户再请求,但是后者手快,先提交了验证结果,你千万不能把它当作前一个用户,不然乱套了。
对了,还有个办法,把服务器发来的验证图片再传回去,让服务器去识别用户输入的对不对吧。。。这个。。。还是饶了服务器吧。

caozhy
caozhy   Ds   Rxr 2014.12.21 18:22

好,仔细想下,session是一个必不可少的好东西。现在的问题来了,客户端又是如何记住这个令牌的呢?也许你说这个问题还不简单,浏览器记录在内存的某个变量里面就是了。
想法很好。但是我们看到一些网站,有记住用户密码的功能。当浏览器关闭,甚至电脑关闭以后,再打开访问网站,网站还能记住它的存在。显然不能放在内存中了。
然后你又说了,那放在磁盘里就是了。
好的,发明cookie的人也是这么想的。于是就有了cookie。现在我们知道了,cookie用来在客户端保存状态的存储机制。换一句话说,要想session能工作,需要依赖cookie。(这不是绝对的,一般web server为了防止cookie被禁用,会想出别的方法,比如隐藏表单域来维持客户端的状态)

现在说清楚了session和cookie的原理,下面就说说什么时候用session,什么时候用cookie,我可以给你一些原则:

h398085541
h398085541 谢谢-。-
接近 3 年之前 回复
caozhy
caozhy   Ds   Rxr 2014.12.21 19:18

使用Seesion的场合:
(1)需要针对客户端跟踪,但是又不能放入客户端的敏感信息,比如之前说的验证码
(2)易失的,不必要放入数据库的少量数据,比如用户的查询条件
使用Cookie的场合:
(1)非敏感的,用于服务器跟踪自己的数据,比如说对用户使用偏好的优化,很多广告商据此来推送合适用户的广告。
(2)适合在客户端长时间保存,但是不重要的数据。因为cookie同样随时会被用户清除。同时,cookie无法随用户漫游,你不能用它存储业务,否则如果用户换一台电脑上网,找不到之前的订单了,那就麻烦了。

Session不适合存放大量的数据,这倒不是说Session存放在内存中,怕存不下,而是如果服务器使用了群集这样的技术,也就是使用很多计算机来同时处理用户的请求,Session在服务器之间同步是开销很大的。
当你需要存放的数据很多的时候,也不能使用cookie,因为cookie同样不能存大量的数据,不但如此,而且存放在cookie还增加了网络传输的开销。正确的做法是放入服务器的文件或者数据库中。

melu2012
melu2012   2014.12.23 12:02

session服务器端,cookie客户端。现在有些cms系统习惯把大量的session数据储存到db,再set一个cookie或session值,到时间后修改或删除

Csdn user default icon
上传中...
上传图片
插入图片