阅读网 购物 网址 万年历 小说 | 三丰软件 天天财富 小游戏
TxT小说阅读器
↓小说语音阅读,小说下载↓
一键清除系统垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放,产品展示↓
佛经: 故事 佛经 佛经精华 心经 金刚经 楞伽经 南怀瑾 星云法师 弘一大师 名人学佛 佛教知识 标签
名著: 古典 现代 外国 儿童 武侠 传记 励志 诗词 故事 杂谈 道德经讲解 词句大全 词句标签 哲理句子
网络: 舞文弄墨 恐怖推理 感情生活 潇湘溪苑 瓶邪 原创 小说 故事 鬼故事 微小说 耽美 师生 内向 易经 后宫 鼠猫 美文
教育信息 历史人文 明星艺术 人物音乐 影视娱乐 游戏动漫 | 穿越 校园 武侠 言情 玄幻 经典语录 三国演义 西游记 红楼梦 水浒传
 
  首页 -> 小说文学 -> (原创)郎朗的计算机文学 -> 正文阅读

[小说文学](原创)郎朗的计算机文学[第3页]

作者:langlangname
首页 上一页[2] 本页[3] 下一页[4] 尾页[4] [收藏本文] 【下载本文】
    顶
    当然也存在一个问题,如何在以编程方式创建的电子邮件中插入附件。使用Mime_Mail来实现很容易。只要调用Mime_Mail对象的addAttachment()方法,传入附件名和扩展,然后确认它的内容类型:
    $mimemail->addAttachment(‘inventory.pdf’,’application/pdf’);
    验证服务器的连接性是一个常见的管理任务。下面的代码展示了如何使用PHP来完成这个任务。
    <?php
    //该去ping哪台服务器,ping属于一个通信协议,利用ping命令可以检查网络是否连通。ping大致代表了你和服务器连接的网络质量。ping越高质量越差。
    $server=”www.example.com”;
    //ping服务器多少次。
    $count=3;
    //完成相应的任务。
    echo “<pre>”;
    system(“/bin/ping –c $count $server”);
    echo “</pre>”;
    //关闭相应的任务,system()函数是PHP提供的三个专门的执行外部命令的函数之一。通过
    //system()函数输出并返回最后一行shell命令的结果。
    system(“killall –q ping”);
    ?>
    以上代码输出如下:
    PING www.example.com(192.0.34.166) from 123.456.7.8:56(84) bytes of data.
    64 bytes from www.example.com(192.0.34.166):icmp_seq=0 ttl=255 time=158 usec
    64 bytes from www.example.com(192.0.34.166):icmp_seq=1 ttl=255 time=57 usec
    64 ytes from www.example.com(192.0.34.166):icmp_seq=2 ttl=255 time=58 usec
    --- www.example.com ping statistics ---
    5 packets transmitted,5 packets received,0% packet loss
    round-trip min/avg/max/mdev=0.048/0.078/0.158/0.041ms

    PHP的程序执行函数功能很强大,因为这些函数允许你利用安装在服务器上的任何程序,这些程序具有正确的许可。其实,在适应自己内心中对于程序或者是编码的喜爱的时候,很多情况下其实已经遇到了很多的误区,我们其实可以适应我们内心中对于PHP代码的热爱,当然,这种热爱本来就已经超越了我们所能够定义中的那一份完满。当然,其实,在上海贝尔软件做外派工程师的这一年中,其实我在Linux系统下也做了将近一年不到的管理员,其实也遇到了很多问题,就比如apache网站服务器的一些问题。其实,在工作的时候,有时候会因为一些突发的原因所以自己也可能会变得比较焦虑,但其实这种焦虑都是可以被理解的,同时也是可以被容忍的,其实,我们只是因为学会了懂得感谢我们曾经的大学生活,其实我回忆起我以前出版高专时候的生活,我觉得满充实的,毕竟看了很多的电视剧和日剧,还有很多日本的动漫,让我开始学会让我自己适应我所能够适应的大学生活的一些真正精华的东西。出版高专其实就相当于一个服务器,然后我现在有时候会通过我的记忆点连接到这台已经迷失了很久的服务器上去寻找我曾经的出版高专的同学和朋友们。也许,我们必然在我们必然需要学会懂得感谢的时候感谢我们曾经现实中努力过,学习过的地方,当然,我们早就应该彻底领悟的同时学会懂得感谢现实中,和工作中真正能够汲取到营养的那些东西,在我们愿意了解得到我们现实中一度愿意感谢的那些东西的时候,我们开始学会懂得珍惜我们现实中一度尝试努力多次,同时也失败了多次的地方,继续站起来,继续努力地尝试学会更多的同时也掌握更多。其实,我们早就应该学会懂得感谢现实中工作上的那些积累和曾经努力许久的大学生活,但或许,我们内心中真正愿意ping到的我们内心中的理想服务器的时候,也许,我们会稍微笑一笑,继续淡淡地去做好我们想要去做的事,同时,也不容易轻易放弃我们现实中一直愿意留守的这一片,在我们家里的一片小小的天地吧,当然,我就在这一片小小的天地里,通过电脑,通过键盘收获了很多。

    顶
    顶
    如下代码使用了PHP的system()函数和Nmap(网络映射器)工具:
    <?php
    $target=”www.example.com”;
    echo “<pre>”;
    system(“/usr/bin/nmap $target”);
    //通过system()函数执行相应的shell命令,使用Nmap这个网络映射器工具。
    echo “</pre>”;
    //关闭相对应的任务
    system(“killall –q nmap”);
    ?>
    以下是示例输出的一部分:
    Starting nmap V.4.11(www.insecure.org/nmap/)
    Interesting ports on(209.51.142.155):
    (The 1500 ports scanned but not shown below are in state:closed)
    Port State Service
    22/tcp open ssh
    80/tcp open http
    110/tcp open pop-3
    111/tcp filtered sunrpc
    有时候会遇到一些常见问题,就比如一条网线插错或者根本没有插网线。其实我曾经在中新房东方从事IT专员的时候有时候偶尔也会帮人插插入网线,然后做一些装电脑系统的杂活,其实原来上海贝尔软件我几乎很多的杂活都会干,同时也通过这些杂活收获了很多。上海贝尔软件其实是以通讯为主的,也许,我在这家公司里面其实应该学点有关于通讯的东西。而不仅仅只是从事PHP相关的开发工作。有时候,自学能力对于程序员而言,是有着非常大的帮助存在的。同时也通过这些帮助,让我们自己都能够非常明显地发现自己身上的大量不足和缺点,然后,通过这些缺点,不断地通过弥补的方式让自己变得越来越轻松的同时,还能够附带着成就感。成就感这种东西,反而比上海贝尔软件最强程序员这种虚衔来得更加有意义,很多时候,人在尝试做一些看似很有意义的事情时,总是会面对很多问题,同时也通过各异的问题,挖掘出自己身上的很多闪光点,然后发光发热在自己所热爱的岗位上,其实很多时候人就是因为喜爱这个岗位,人才会继续努力,继续坚持在自己愿意坚守的位置上和职位上,只是因为无法通过自己现实中的意识去控制,去驾驭。本来就可以通过自己的努力做到并做好更多,同时,也不容易真正遗忘并放弃许多许多。其次比较常见的问题是,在配置必要的基本网络配置时出现了错误:IP地址,子网掩码,广播地址,网络地址等。为修复这个问题,可以利用一些PHP函数和位操作来完成这些计算。就比如下面的这一段代码的描述。
    <form action=”listing16-3.php” method=”post”>
    


    IP Address:<br/>
    <input type=”text” name=”ip[]” size=”3” maxlength=”3” value=”” />
    <input type=”text” name=”ip[]” size=”3” maxlength=”3” value=”” />
    <input type=”text” name=”ip[]” size=”3” maxlength=”3” value=”” />
    <input type=”text” name=”ip[]” size=”3” maxlength=”3” value=”” />
    


    //定义四个可以用来输入IP地址的文本输入框。
    


    Subnet Mask:<br/>
    <input type=”text” name=”sm[]” size=”3” maxlength=”3” value=”” />
    <input type=”text” name=”sm[]” size=”3” maxlength=”3” value=”” />
    <input type=”text” name=”sm[]” size=”3” maxlength=”3” value=”” />
    <input type=”text” name=”sm[]” size=”3” maxlength=”3” value=”” />
    


    <input type=”submit” name=”submit” value=”Calculate”/>
    </form>
    <?php
    if(isset($_POST[‘submit’])){
    //将IP相关表单的组件连接起来,然后转换成IPv4的格式
    $ip=implode(‘.’,$_POST[’ip’]);
    $ip=ip2long($ip);
    //将子网掩码相关表单的组件连接起来,然后转换陈IPv4的格式
    $netmask=implode(‘.’,$_POST[‘sm’]);
    $netmask=ip2long($netmask);
    //计算网络地址
    $na=($ip & $netmask);
    //计算广播地址
    $ba=$na|(~$netmask);
    //将相对应的地址转换成为点格式的表现方式然后显示出来
    echo “Addressing Information:<br/>”;
    echo “<ul>”;
    echo “<li>IP Address:”.long2ip($ip).”</li>”;
    echo “<li>Subnet Mask:”.long2ip($netmask).”</li>”;
    echo “<li>Network Address:”.long2ip($na).”</li>”;
    echo “<li>Broadcast Address:”.long2ip($ba).”</li>”;
    echo “<li>Total Available Hosts:”.($ba-$na-1).”</li>”;
    echo “<li>Host Range:”.long2ip($na+1).”-“.long2ip($ba-1).”</li>”;
    echo “</ul>”;
    }
    ?>
    如果IP地址是192.168.1.101,子网掩码是255.255.255.0,应当通过以上代码实现如下的输出:
    Addressing Information:
    IP Address:192.168.1.101
    Subnet Mask:255.255.255.0
    Network Address:192.168.1.0
    Broadcast Address:192.168.1.255
    Total Available Hosts:254
    Host Range:192.168.1.1-192.168.1.254
    计算机网络原理自考本科这一门课程我重考到第三次的时候,我突然发现这些原来非常晦涩难懂的计算机名词其实也可以通过熟练地阅读掌握并获取到更多,其实,是不容易轻易放弃的,同时也通过自己的意识真正学会懂得感谢计算机自考本科对于我现在的帮助,特别是对于我现在写作的帮助,是非常巨大的,同时也是非常有着强烈的推动作用,继续鼓舞着我继续写下去,继续写下去。上海贝尔软件最强程序员其实就是一个空的名号,一旦离开了这家公司,还是看你的学历,还是看你现在所拥有的能力,专科,确实一种歧视,当然,34周岁的我现在觉得复旦计算机自考本科是有意义的,是有价值的,对于今后继续从事写作是有着非常大的帮助的。所以,我还是会写,还是会坚持。做一个有着追求的人,有着理想的人,是非常好的,至少是我所认为的好。
    值班编辑,我今天写的没有问题吧,我建议你以后不要再删除我的帖子了。没什么意思的。我今天写的你不要再删除了。
    顶
    顶
    使用PHP发送大量数据,然后记录完成传输所用的时间,就可以自动测试用户的网络速度。首先创建将传输给用户的数据文件,这个文件可以有任何内容,不必担心,因为用户永远都看不到这个文件。我们考虑生成大量文本并写入到文件来创建此文件。下面的一个脚本将生成一个大约为1.5MB的文本文件:
    <?php
    //创建一个新的文件,创造性地命名为”textfile.txt”。
    $fh=fopen(“textfile.txt”,”w”);
    //将英文单词bandwidth重复性地写入文件。
    for($x=0;$x<170400;$x++) fwrite($fh,”bandwidth”);
    //关闭这个文件
    fclose($fh);
    ?>
    如下是计算网络速度的脚本。
    <?php
    //取回数据然后发送给用户
    $data=file_get_contents(“textfile.txt”);
    //决定数据的总的大小,以千字节为单位
    $fsize=filesize(“textfile.txt”)/1024;
    //定义开始的时间
    $start=time();
    //发送数据给用户
    echo “<!-- $data –>”;
    //定义停止的时间
    $stop=time();
    //计算发送数据花费的时间
    $duration=$stop-$start;
    //将文件大小除以传输这个文件所花费的秒数
    $speed=round($fsize/$duration,2);
    //以千字节每秒显示所计算的速度
    echo “Your network speed:$speed KB/sec.”;
    ?>
    执行此脚本将得到类似于下面的输出:
    Your network speed:59.91 KB/sec.
    PHP的网络功能或许真的很强大,但其实通过这种网络功能跟其他功能之间的比较之后,你会很清晰地发现原来很多现有的,非常成熟的客户端所提供的工具,并不能够说明好像PHP不擅长这个领域还是什么其他方面的比较还是什么。PHP其实一直致力于从事网站相关的开发,但或许,这种网站领域的开发比起JAVA而言,JAVA还可以从事企业级的应用开发,好像PHP确实缺少了点什么,但是PHP也是有着自己非常成熟的开发框架的体系,当然,也许,只是为了证明程序员不单单只应该拘泥于一种编程语言,通过这些语言跟语言之间的交互,很多看似在现实中,在书本上一直固定化的一些编程语法,都变成了一种看似鲜活的东西,同时这种鲜活的东西能够在我们所认为的日常生活和工作当中,起到非常大的作用,如果是因为这些原因的话,那或许对于编程语言本身而言,不考虑各个方面,都是看似可取的,同时也通过这种可取,让我们读者都开始有所感悟,感悟的原因就是其实我们都应该学会更好地整理自己现实中一度不愿意认真去做好的很多事,同时,通过这些事与事之间的比较和权衡之后,很多看似在编程和写作的工作中非常明朗化的东西,都开始蜕变地不像是现实所能够形容的样子,在上海生活的人可能会非常叹惋于房价,我昨天还看了一下安居客上的上海房价的均价,不知不觉新房已经逼近6万大关了,通过这个看似非常鲜红的数字给我们带来了什么样的警醒呢,也许,我们现在所拥有的工作和我们现在所能够承担的收支,在面对这个数字的时候,我们终于发现原来连高级软件工程师也买不起好地段的房子了,就是因为这种现实,所以,我们确实应该要努力工作,努力学习,尝试想要改变得到现实生活中看似落魄的我们,然后通过这个现实,让我们不断地在经验的积累中总结并提炼自己身上的优缺点,也许,我们必然会因为现实,最后我们开始学会妥帖,学会真正地接受现实所能够给予我们的馈赠。我们必然需要这种馈赠。
    顶
    很多用户和管理员都在忍受着由于缺乏全面管理解决方案而带来的困扰,直到最后目录服务终于应运而生。目录服务为系统管理员,开发人员和终端用户提供了一致,高效,安全的方式,用以查看和管理诸如人员,文件,打印机和应用程序等资源。这些“读优化”的数据仓库结构通常很接近于公司的物理结构。所有使用广泛的目录服务产品都依赖于一种称为轻量级目录访问协议(LDAP)的开放规范。PHP的LDAP扩展似乎始终未得到应得的重视,但它确实提供了大量的灵活性,功能和易用性,这是开发人员创建LDAP扩展驱动的复杂应用程序时所渴望的三个方面。其实原先我在上海贝尔软件搞mediawiki这个PHP开源框架的时候,最开始的时候也考虑过将mediawiki跟LDAP集成在一起,将新入职员工的ad4账号密码进行关联。其实那个时候最开始建立mediawiki的时候就考虑过这些基本的配置和服务,然后等网站搭建出来的时候,发现其实mediawiki可以集成很多的扩展,就比如html扩展,在线编辑器扩展,通过这些扩展可以实现更多,更为强大的功能,也许,作为一个程序员而言,在面对一个成熟的PHP框架时,很多时候考虑太多的问题反而会头疼,反而会因为这些太多,太杂乱的东西的拼凑之后,让程序员都有着一种别样的感慨,这种感慨就是,也许我们都应该学会总结自己的同时不断地更新自己的知识面,然后,通过这些知识面让自己突然发现并意识到其实自己可以通过很多未知的计算机名词懂得更多,同时还能够总结得到更多。

    ldap_connect()函数建立与由一个主机名和一个可选的端口号指定的LDAP服务器的连接。其形式为:
    resource ldap_connect([string hostname[,int port]])
    如果未指定端口参数,并且服务器前面使用ldap://URL模式,或者完全省略了URL模式,则使用LDAP的标准端口389。如果使用ldaps://模式,则使用端口636。如果连接成功,则返回链接标识符:有错误则返回FALSE。见一个例子代码如下:
    <?php
    $host=”ldap.openldap.org”;
    //$host标识相对应的主机名。
    $port=”389”;
    //$port标识相对应的端口号
    $connection=ldap_connect($host,$port)
    or die(“Can’t establish LDAP connection”);
    //通过$connection进行相对应的LDAP服务器的连接。
    ?>
    ldap_start_tls()本身并不是连接所特有的函数,如果开发人员希望使用传输层安全(TLS)协议安全地连接LDAP服务器,一般会在调用ldap_connect()之后立即执行这个函数。其形式为:
    boolean ldap_start_tls(resource link_id)
    LDAP的TLS连接只能用于LDAPv3。因为默认情况下使用LDAPv2,所以需要专门声明使用版本3:在调用ldap_start_tls()之前要使用ldap_set_option()。
    可以在绑定到目录之前或之后调用函数ldap_start_tls(),但如果要保护绑定凭证,那么在绑定到目录之前调用这个函数更有意义。
    代码如下:
    <?php
    $connection=ldap_connect(“ldap.openldap.org”);
    //通过ldap_connect连接到相对应的LDAP服务器。
    ldap_set_option($connection,LDAP_OPT_PROTOCOL_VERSION,3);
    //通过ldap_set_option设置LDAP的TLS连接为LDAPv3。
    ldap_start_tls($connection);
    //通过ldap_start_tls开启相对应的LDAP的TLS连接。
    ?>
    其实很多时候,在面对一些看似未知的计算机概念面前,有时候程序员必然要尝试以妥协的方式来面对很多事,然后,通过这些事的积累之后,很多我们愿意尝试想要努力的方向,在看似茫然的时候,也必然能够给予我们必要的,必然的帮助。
    顶
    顶
    成功连接到LDAP服务器之后,就需要传递一组凭证,所有后续的LDAP查询将基于这些凭证执行。这些凭证包括各种用户名,也称为RDN,即相对区分名,以及密码。其实很多时候,在很多个网站用户名和密码本来就是一种用来证明自己注册过这个网站,是作为一种凭证来存在的,也许,在定义属于自己的自定义网站的时候,在修改PHP开源项目的时候,本来就有着非常多的值得自己思考并思索许久的问题存在。而且,在编程开发中这种焦虑和困惑会变得越来越多,同时,还不容易真正释怀自己内心中真正渴望的那一份样子,其实,我们早就应该学会懂得通过我们自己的理解方式来理解这些开源的PHP项目,如果,我们愿意这样来认为的话,那或许,我们在不容易轻易放弃的时候,也同样能够非常会心地来面对这些开源的PHP项目中,一直潜藏着特定作用的PHP代码。如果,我们觉得这些代码没有用,那或许,值得我们思考许久的问题都会频繁地出现,同时,还能够出现在我们愿意提及得到的,我们所认为的现实中,而且,我们也不容易真正地忘却,也不容易真正地释怀我们自己。我们其实在面对一些生僻的PHP函数的时候,我们往往无法真正通过自己的意识去控制和驾驭好现实中的我们自己。但是,其实,我们需要一种途径去想通,去做好我们现实中一度不愿意做好的,在面对PHP书籍时候的那种头疼感,当然,其实我曾经也有过这种焦虑,但是,慢慢地,这种焦虑因为PHP书籍给予我的那种充实感之后,让我突然发现并意识到,很多时候,在面对很多看似未知的概念和定义面前,很多看似无力的东西也开始成就为有力,而且,还不容易真正因为我们自己的理解,让我们自己能够真正了解并定义好那个在现实中真正愿意投入精力学习编程,努力做好一个热血读书的我们自己。而且不仅仅是读计算机的书籍。使用ldap_bind()函数来完成。其形式为:
    boolean ldap_bind(resource link_id[,string rdn[,string pswd]])
    虽然任何人都可以连接到LDAP服务器,但在获取或操作数据之前,通常需要正确的凭证。这是通过ldap_bind()实现的。这个函数至少需要ldap_connect()返回的link_id,可能还需要用户名和密码,分别由rdn和pswd指定。代码如下:
    <?php
    $host=”ldap.openldap.org”;
    //设定连接到的LDAP服务器
    $port=”389”;
    //设定连接到的LDAP服务器的端口号
    $connection=ldap_connect($host,$port) or die(“Can’t establish LDAP connection”);
    //通过ldap_connect来测试连接到的LDAP服务器的连接,如果连接失败,跳出错误信息。
    ldap_set_option($connection,LDAP_OPT_PROTOCOL_VERSION,3);
    //设置LDAP服务器连接的默认选项。
    ldap_bind($connection,$username,$pswd) or die(“Can’t bind to the server.”);
    //通过ldap_bind绑定到所对应的LDAP服务器,如果绑定失败跳出错误信息。
    ?>
    在完成与LDAP服务器的所有交互之后,应当清除并正确地关闭连接。函数ldap_unbind()可用于此任务。其形式为:
    boolean ldap_unbind(resource link_id)
    ldap_unbind()函数终止与link_id关联的LDAP服务器连接。使用代码如下:
    //连接到LDAP服务器
    $connection=ldap_connect(“ldap.openldap.org”) or die(“Can’t establish LDAP connection”);
    //绑定到LDAP服务器
    ldap_bind($connection) or die(“Can’t bind to LDAP.”);
    //执行各种的LDAP相关的命令...
    //关闭LDAP连接
    ldap_unbind($connection) or die(“Could not unbind from LDAP server.”);
    ?>
    顶
    因为LDAP是读优化的协议,所以,在任何实现中提供一组有用的数据搜索和获取函数很有意义。创建支持LDAP的PHP应用程序时,几乎肯定会经常使用ldap_search()函数,因为这是根据指定的过滤器来搜索目录的主要方式。其形式为:
    resource ldap_search(resource link_id,string base_dn,string filter[,array attributes[,int attributes_only[,int size_limit[,int time_limit[int deref>]])
    如果搜索成功,将返回一个结果集,然后可以由其他函数来解析这个结果集。搜索失败时返回FALSE。考虑如下代码,其中ldap_search()用户获取名字以字母A开头的所有用户:
    $results=ldap_search($connection,”dc=OpenLDAP,dc=Org”,”givenName=A*”);
    如果希望获取每位用户的名,姓和电子邮件地址,可以在attributes列表中指定:
    $results=ldap_search($connection,”dc=OpenLDAP,dc=Org”,”givenName=A*”,”surname,mail”);
    注意,其中dc指domaincomponent,也就是域名,surname指真实名称。也就是每位用户的真实姓名。
    如下代码是获取名字以A开头的前五位用户的属性类型及其相应值:
    $results=ldap_search($connection,”dc=OpenLDAP,dc=Org”,”givenName=A*”,0,5);
    以下代码也完成之前那个例子同样的搜索,但限制搜索只进行30秒:
    $results=ldap_search($connection,”dc=OpenLDAP,dc=Org”,”givenName=A*”,0,5,30);
    一旦搜索操作返回一个或多个记录,可能希望对这些数据做一些处理,可能是输出到浏览器,或者完成其他动作,为此最容易的做法是利用ldap_get_entries()函数,它可以把结果集中的所有成员放入一个多维数组中。其形式如下:
    array ldap_get_entries(resource link_id,resource result_id)
    下面列出可以由这个数组得出的各项信息。
    return_value[“count”]。获取的项的总数。
    return_value[n][“dn”]。结果集中第n+1项的DN。
    其实DN用于指向一个LDAP对象,LDAP连接服务器的连接字串格式为:ldap://servername/DN,其中DN有三个属性,分别是CN(Common Name常用名称),OU(Organization Unit组织单元-部门),DC(Domain Component域名)。
    return_value[n][“count”]。结果集中第n+1项的属性总数。
    return_value[n][“attribute”][“count”]。与第n+1项attribute属性关联的值个数。
    return_value[n][“attribute”][m]。第n+1项attribute属性的第m+1个值。
    return_value[n][m]。第n+1项位于第m+1个位置的属性。
    其实很多时候,协议只是一种展现自己优势或者是劣势的手段,如果,作为程序员的你如果厌倦了自学,那你会很快发现如果缺失了这种对于计算机或者是编程的热情之后,你作为程序员的那种优势和劣势马上都会转化为一种懒惰,通过这种懒惰其实很多高级程序员最后都看似好像成为了废人,但其实,很多时候,代码对于程序员而言,确实是需要温故而知新的,而且需要不断学习的过程中不断地巩固和提高,通过了这个过程之后,作为高级程序员的那种骄傲,那种成就感就会油然而生,很多时候,我们在开始决定我们接下去要做什么事的时候,我们往往需要以一种更加清晰的眼光来正视我们自己,如果,我们开始认为我们应该学会懂得整理,学会懂得梳理一些我们现实中无法真正愿意勇敢面对的,独属于我们自己的那一份弱势的时候,我们其实也应该更加会心地微笑,通过这种微笑,让阳光下的我们终于发现其实我们可以通过我们自己的努力克服很多的困难和险阻,然后,通过这些挫折的组合之后,让经历过风浪的我们终于发现,原来承载我们自己的知识海洋,看似好像有点干涸,但其实这种干涸很多时候只是因为我们的某种错觉在作祟,所以,我们开始正视计算机文学的时候,我们开始惊喜地发现,原来,我们是可以将计算机跟文学创作结合在一起的。确实,计算机文学不仅仅只是一种噱头。
    顶
    有时候在学习PHP代码的时候也许必然会经历一些困惑和挫折,但其实这些困惑和挫折一直都在现实中经历过,但是,这种经历本来就不单单仅仅只是一种变相的追求,其实,人在追求自己的兴趣爱好跟自己的人生志向相结合的时候,有时候矛盾必然会产生,同时还能够产生地非常自然,也许,通过自己现实中的很多种努力的结合之后,很多必然无法真正避免的东西就会慢慢地产生,同时还能够产生地非常合理,其实,我们只是忘记了一点,我们应该想清楚我们现实中的真正定位,当然,当我们觉得我们可以通过我们自己的意识连接到属于我们自己的LDAP服务器的时候,也许,不仅仅只是因为尝试想要连接到自己想要思考的那一片领域,同时,这一领域好像带来了些什么,但其实,早就不应该轻易忘却一些什么。总应该想清楚自己现实中一度不愿意真正放弃的那些东西。知识的海洋中到底能够容纳多少正在求知中的人们,当然,这些人们可能会认为为什么PHP的代码会这么多,这么杂乱,但其实,这种多,这种杂乱都仅仅只是一种错觉,这种错觉其实在很大程度上能够揭露很多你现实中一度不愿意轻易放弃或者是抛却的一些东西,人总应该有着属于自己的追求,然后,通过这些追求,人开始意识到其实自己早就应该可以彻底释怀并想清楚很多现实中一度无法真正理解的概念或者是定义。其实,早就应该彻底想清楚的同时还能够非常理智地思考,在想到了自己现实中的一度努力还是有可能会变为徒劳,当然,这种错觉不仅仅只是因为我们开始容易想起我们的很多个小小的目标达到的那种看似微小的成就感,确实,我们其实可以通过以下的代码找寻得到我们现实中的,看似有点渺小的成就感吧。考虑如下代码。
    <?php
    $host=”ldap.openldap.org”;
    $port=”389”;
    $dn=”dc=OpenLDAP,dc=Org”;
    $connection=ldap_connect($host)or die(“Can’t establish LDAP connection”);
    ldap_set_option($connection,LDAP_OPT_PROTOCOL_VERSION,3);
    ldap_bind($connection)or die(“Can’t bind to the server.”);
    //找回所有第一个名字以字母K开始的人群
    $results=ldap_search($connection,$dn,”givenName=K*”);
    //将记录全部倾泻在数组里
    $entries=ldap_get_entries($connection,$results);
    //决定返回多少条记录
    $count=$entries[“count”];
    //通过数组的方式进行循环然后输出名字和e-mail地址
    for($x=0;$x<$count;$x++){
    printf(“%s”,$entries[$x][“cn”][0]);
    printf(“(%s)<br/>”,$entries[$x][“mail”][0]);
    }
    ?>
    执行上面这个脚本会生成类似下面的输出:
    Kyle Billingsley(billingsley@example.com)
    Kurt Kramer(kramer@example.edu)
    Kate Beckingham(beckingham.2@example.edu)
    搜索一个特定项时,应当使用ldap_read()函数,该项由特定DN标识。其形式为:
    resource ldap_read(resource link_id,string base_dn,string filter[,array attributes[,int attributes_only[,int size_limit[,int time_limit[int deref>]])
    比如,获取一个由其ID标识的用户的名和姓,可以执行以下代码:
    <?php
    $host=”ldap.openldap.org”;
    //我们到底在寻找些什么。
    $dn=”uid=wjgilmore,ou=People,dc=OpenLDAP,dc=Org”;
    //连接到LDAP服务器
    $connection=ldap_connect($host)or die(“Can’t establish LDAP connection”);
    ldap_set_option($connection,LDAP_OPT_PROTOCOL_VERSION,3);
    //绑定到LDAP服务器
    ldap_bind($connection)or die(“Can’t bind to the server.”);
    //找回所想要获得的消息
    $results=ldap_read($connection,$dn,’(objectclass=person)’,array(“givenName”,”sn”);
    //找回返回的记录所形成的数组
    $entry=ldap_get_entries($connection,$results);
    //输出第一个还有最后一个的名字
    printf(“First name:%s<br/>”,$entry[0][“givenname”][0]);
    printf(“Last name:%s<br/>”,$entry[0][“sn”][0]);
    //关闭连接
    ldap_unbind($connection);
    ?>
    这会返回如下结果:
    First Name:William
    Last Name:Gilmore
    代码其实也能够暗示写这些代码人的一种潜在的性格,通过这些性格之间的细微差别,我们其实就能够非常清晰地定位到自己现实中一度无法真正忘怀的那些东西。确实,代码,改变了我们现实中的很多种想法,所以,还是继续努力地学习,求知吧。
    顶
    了解搜索所获取的项数通常很有用。其实,在能够通过自己的清醒意识发现自己在编程过程中到底该经历什么,到底该如何真正获取什么其实是有着非常多的现实意义存在的。仅仅只是因为一些看似肤浅的理解方式来理解PHP其实并不应该是一种可取的方式。我们其实早就应该学会懂得想通很多事,同时也不容易轻易放弃自己现实中的一些目标和追求,其实,我们早就应该学会懂得珍惜更多,同时通过自己的认真理解和认真揣摩之后,让现实中的我们突然意识到其实我们早就可以因为我们自己的很多种的尝试之后,让我们自己都能够非常清醒地察觉到我们身上的优缺点和看似透明的致命缺陷。也许,我们应该通过我们自己的理解方式来尝试更好地来感受一回真正地以程序员为人生目标与追求的那种最为清晰的方向。其实,我们应该能够通过我们自己的很多种想法之后,让这种杂乱变得有章可循。其实,很多种看似不够现实的想法很多时候都无法真正因为我们自己的很多种努力,蜕变得到我们现实中的那种看似不够真实的感觉。其实,感觉有时候就是类似于一种错觉。当然,我们其实应该要正视这种错觉,如果,我们真正地认为我们应该沉浸入这片代码的海洋的话。PHP提供了一个函数ldap_count_entries()来显式地完成这个任务。形式为:
    int ldap_count_entries(resource link_id,resource result_id)
    下面的代码返回表示姓以G开头的所有人的LDAP记录的总数:
    $results=ldap_search($connection,$dn,”sn=G*”);
    $count=ldap_count_entries($connection,$results);
    echo “

Total entries retrieved:$count

”;
    这会返回:
    Total entries retrieved:45
    ldap_sort()函数可以根据返回的任何result属性对结果集进行排序。该函数会比较每个项的字符串值,并以升序重新组织进行排序。其形式为:
    boolean ldap_sort(resource link_id,resource result,string sort_filter)
    代码如下:
    <?php
    //连接然后进行绑定...
    $results=ldap_search($connection,$dn,”sn=G*”,array(“givenName”,”sn”));
    //通过用户的第一个姓对记录的集合进行排序
    ldap_sort($connection,$results,”givenName”);
    $entries=ldap_get_entries($connection,$results);
    $count=$entries[“count”];
    for($i=0;$i<$count;$i++){
    printf(“%s %s<br/>”,
    $entries[$i][“givenName”][0],$entries[$i][“sn”][0]);
    }
    ldap_unbind($connection);
    ?>
    以上代码会返回:
    Jason Gilmore
    John Gilmore
    Robert Gilmore
    向目录中插入数据与获取数据一样简单。可以使用ldap_add()函数向LDAP目录增加新项。其形式为:
    boolean ldap_add(resource link_id,string dn,array entry)
    以下代码是一个例子,但是这个例子不会正确执行,因为你没有恰当的权限将用户添加到OpenLDAP目录:
    <?php
    /*连接并绑定到相对应的LDAP服务器...*/
    $dn=”ou=People,dc=OpenLDAP,dc=org”;
    $entry[“displayName”]=”John Wayne”;
    $entry[“company”]=”Cowboy,Inc.”;
    $entry[“mail”]=”pilgrim@example.com”;
    ldap_add($connection,$dn,$entry) or die(“Could not add new entry!”);
    ldap_unbind($connection);
    ?>
    但其实从逻辑上讲,可以使用索引数组:
    $entry[“displayName”]=”John Wayne”;
    $entry[“company”]=”Cowboys,Inc.”;
    $entry[“mail”][0]=”pilgrim@example.com”;
    $entry[“mail”][1]=”wayne.2@example.edu”;
    ldap_add($connection,$dn,$entry) or die(“Could not add new entry!”);
    其实入口这种东西并不可怕,关键可怕的是到底该如何通过自己的定义和自己的追求方式来更好地揣摩好自己的以后,我们其实早就好像看破了很多东西,但或许,这些东西本来就因为隐形,本来就因为透明,让我们开始有一种潜在的感觉,这种感觉就是其实我们早就应该彻底因为我们现实中的努力,来更好地揣摩好我们现实中看似透明的以后,如果,我们能够更加轻易地认为PHP代码可以真正改变我们的真实人生的话。其实,我相信我们都能够尝试学会改变,学会懂得改变。
    顶
    ldap_mod_add()函数用于向现有的项增加值,成功时返回TRUE,失败时返回FALSE。其形式为:boolean ldap_mod_add(resource link_id,string dn,array entry)。其实,很多时候,你有时候会因为一些看似很细微的原因删除或者是添加一些微信好友,但或许,这本来就不应该仅仅只是一种看似非常日常的行为,我们其实在我们不愿意轻易面对一些对或者是错的事物面前,我们都开始学会懂得整理我们现实中愿意整理的很多东西而不自知。当然,也许,我们早就应该因为自己大脑深处所记忆住的那些瞬间或者是点来回忆起我们曾经读过的所有书本,但是,这些书本到底真的能够带来一些特定的价值或者是作用呢,答案或许是否定的,同时也是不肯定的。我们仅仅只是想要尝试通过浅显的方式来了解PHP的一些特定函数,当我们认为我们应该通过我们自己的理解方式来更加深入地了解PHP的时候,很多我们无法轻易面对的一些现实都会慢慢地浮出水面,同时也不容易放弃在我们不愿意轻易放弃的地方。程序有时候一段一段的出现不仅仅只是因为这些程序看似对于你而言重要或者是不重要。当然,也许,仅仅只是因为一些看似很平庸的原因,让整个世界不仅仅只是因为你,因为我开始学会懂得改变的时候,也开始因为现实中那些看似琐碎的东西,让整个现实中的书桌面前,都能够静静地躺着很多书本,很多看似能够在现实中不轻易放弃或者是放弃阅读的一些杂乱书籍的堆积,当然,也许,我们不应该轻易放弃我们现实中愿意记忆住的很多东西,只是因为我们都应该学会懂得珍惜更多,同时也更加珍惜我们在网上非常轻易下载的那些电子版书本,当然,这些书本确实非常重要,同时,也不容易通过自己的大脑真正地实现过滤的一些东西。我们其实很多时候都有一种错觉,这种错觉就是,也许,我们不应该轻易忘却一些东西,但,我们或许早就应该学会彻底释怀的同时,还能够铭记住一些真正有意义,有价值的东西。
    下面是一段代码,但是,它不能正确执行,因为你不具备恰当的权限来修改位于OpenLDAP目录中的用户:
    $dn=”ou=People,dc=OpenLDAP,dc=org”;
    $entry[“mail”][]=”pilgrim@example.com”;
    ldap_mod_add($connection,$dn,$entry)
    or die(“Can’t add entry attribute value!”);
    假设John现在希望向目录中添加他的标题。因为title属性是单值属性,所以可以如下添加:
    $dn=”cn=John Wayne,ou=People,dc=OpenLDAP,dc=org”;
    $entry[“title”]=”Ranch Hand”;
    ldap_mod_add($connection,$dn,$entry) or die(“Can’t add new value!”);
    虽然LDAP数据基本上是静态的,但有些时候做些改变也是必要的。PHP提供了两个完成修改的函数:ldap_modify()和ldap_rename(),ldap_modify()用于属性值改变,ldap_rename()用于对象级的改变。
    ldap_modify()函数用来修改现有的目录项属性,成功时返回TRUE,失败时返回FALSE。其形式为:boolean ldap_modify(resource link_id,string dn,array entry)
    利用这个函数可以同时修改一个或多个属性。考虑一个例子:
    $dn=”cn=John Wayne,ou=People,dc=OpenLDAP,dc=org”;
    $attrs=array(“Company”=>”Alcatel lucent”,”Title”=>”CEO”);
    ldap_modify($connection,$dn,$attrs);
    注意,ldap_mod_replace()函数是ldap_modify()的别名。
    ldap_rename()函数用来重命名现有的项,其形式为:
    boolean ldap_rename(resource link_id,string dn,string new_rdn,string new_parent,boolean delete_old_rdn)
    new_parent参数指定重命名项的父对象。如果参数delete_old_rdn设为TRUE,则删除原来的项;否则,它将作为重命名项的未区分值保留在目录中。
    顶
    顶
    顶
    顶
    顶
    虽然很少见,但有时确实也会从目录中删除数据。思想,或者是通过自己整体的意识尝试想要从计算机的世界中找寻得到自己最为真实的定位,但很多时候,看似能够忽略,但,或许,这种忽略,本来就是看似不够现实的,同时也是看似真实中的未知。可以在两个级别上发生删除,也就是删除项对象,或者删除与对象关联的属性。有两个函数可以用来执行这些任务:ldap_delete()和ldap_mod_del。ldap_delete()函数删除实体的值,而不是整个对象。其形式为:boolean ldap_delete(resource link_id,string dn)
    代码示例如下:
    $dn=”cn=John Wayne,ou=People,dc=OpenLDAP,dc=org”;
    ldap_delete($connection,$dn)or die(“Could not delete entry!”);
    完全删除一个目录对象很少见;一般可能只是希望删除对象的属性而非整个对象。这可以由以下将介绍的函数ldap_mod_del()完成。
    boolean ldap_mod_del(resource link_id,string dn,array entry)
    这种限制说明这个函数比ldap_delete()用得更多,因为删除属性比删除整个对象的可能性更大。在下面的示例中,用户John Wayne的company属性被删除:
    $dn=”cn=John Wayne,ou=People,dc=OpenLDAP,dc=org”;
    ldap_mod_delete($connection,$dn,array(“company”));
    在下面的示例中,删除了多值属性mail的所有项:
    $dn=”cn=John Wayne,ou=People,dc=OpenLDAP,dc=org”;
    $attrs[“mail”]=array();
    ldap_mod_delete($connection,$dn,$attrs);
    为了从多值属性中删除一个值,必须指定该值,如下:
    $dn=”cn=John Wayne,ou=People,dc=OpenLDAP,dc=org”;
    $attrs[“mail”]=”pilgrim@example.com”;
    ldap_mod_delete($connection,$dn,$attrs);

    其实很多时候,在操作电脑的时候会误删除一些数据或者是文件,并不是说计算机天赋或者还是什么其他的之类原因在作祟,只是因为看似好像对于计算机的一些基本操作缺乏部分或者是更加全面的了解,但是,作为学习者的你要知道,很多时候,缺失了部分热情之后,也可能因为这些部分或者是全面的热情的累积和堆积之后,很多在这个现实中看似有点糟粕的失意和颓废都会变得不再像是自己现实中所能够描绘的那种画面,其实,也仅仅只是因为看似好像因为这么多的PHP函数,好像让学习者的你或者是很多人都觉得为什么作为一门编程语言,看似好像在大学时期也曾经学习过编程之类的语言或者是其他的东西,但,也许,仅仅只是因为看似好像在阅读书本的时候可以略过或者是跳过很多的文字,但,这些文字,能够让我们都清醒地意识到原来我们自己能够看似容忍或者是忍耐一些事,但,或许,这些事,在能够通过这一片现实中凝望了许久的天空,还有那天空中太阳的映照下,很多个能够忽略许久的问题,都开始变得不再像是问题,当然,也许,我们看似好像忽略了我们现实中一度愿意忽略的高中时期的数学,还有大学时期的高等数学,但,其实,这些课程,是非常珍贵,同时也非常值得现实中的我们去珍惜,去好好把握,仅仅,或许只是因为我们都愿意尝试想要收获属于我们自己的感动,然后通过这个世界中,我们愿意珍惜或者是珍视的,能够让我们开始学会感谢我们现实中愿意通过我们自己的努力,尝试收获的那些东西。但是,我想,我们不仅仅只是因为我们愿意珍惜,当然,也许,很多时候,我们都是有些勉强的,同时也是足够天真在我们不愿意放弃许久的位置上,同时,我们还能够做好很多,也能够做到很多。
    顶
    有时候,了解所处理对象的区分名(DN)的更多信息会有很多帮助。其实在PHP的学习过程中,尝试想要通过区分各种函数在用法上的一些细微差别,这些差别其实很多时候能够给我们学习者带来很多益处。其实,就算是高级软件工程师,而且不限制编程语言的那种,其实在面对该如何分辨各种函数的在细微上的差别也是很难的。确实,很多时候,编程的工作经验反而会让这些人陷入误区。确实,很多时候,一个人一旦能力强了,就会骄傲,但,这种骄傲如果在面对一些新知识,新计算机学习技能面前,其实都应该通过这些原因和理由,让我们都开始意识到原本所掌握的那些计算机技能,积累的计算机经验或许都应该适应并服从于谦虚,然后,通过我们自己现在的努力,来尝试通过我们现在所掌握的PHP来改变我们现实中的那种浮躁,那种对于旧有知识的优越感确实是不可以有的,同时,我想,我们其实都应该学会通过PHP来适应属于我们自己的孤独。一些函数可用来完成这个任务。ldap_dn2ufn()函数将DN转换为更为可读的格式。其形式为:string ldap_dn2ufn(string dn)
    最好用一个示例来说明:
    <?php
    //定义区分名dn
    $dn=”OU=People,OU=staff,DC=ad,DC=example,DC=com”;
    //将DN转换为用户友好的格式
    echo ldap_dn2ufn($dn);
    ?>
    以上代码会返回:
    People,staff,ad.example.com
    ldap_explode_dn()函数在操作上与ldap_dn2ufn()相同,只是会以数组形式而非字符形式返回DN的各个部分,数组的第一个元素存放数组的长度。其形式为:
    array ldap_explode_dn(string dn,int only_values)
    如果only_values参数设置为0,数组元素将包括属性及其相应的值;如果设置为1,则只返回值。考虑以下的代码:
    <?php
    $dn=”OU=People,OU=staff,DC=ad,DC=example,DC=com”;
    $dnComponents=ldap_explode_dn($dn,0);
    foreach($dnComponents as $component)
    printf(“%s<br/>”,$component);
    ?>
    这会返回如下结果:
    5
    OU=People
    OU=staff
    DC=ad
    DC=example
    DC=com
    虽然我们希望编程逻辑和代码是完善的。但事实上往往并非如此。其实很多时候,在编程的过程中,其实对于固有的逻辑思维能力,看似要求很高,但只要坚持,还是能够有着一定的收获的。下面的错误处理函数,它们可以帮助确定错误原因,不仅如此,如果错误是由于不合适或不正确的用户动作造成的,而不是因为编程问题所导致,这些函数还能为终端用户提供所需的有关信息。
    ldap_err2str()函数将LDAP标准错误码转换为相应的字符串表示。其形式为:
    string ldap_err2str(int errno)
    例如,错误码3表示超时错误。因此,执行如下函数将得到适当的消息:
    echo ldap_err2str(3);
    这会返回:
    Time limit exceeded
    当然,这些错误字符串可能稍有变化,所以要想提供对用户更友好的消息,一定要根据错误码而不是错误字符串进行转换。
    LDAP规范提供了与目录服务器交互时可能产生的错误码标准列表。如果希望另行定制ldap_error()和ldap_err2str()提供的简单消息,或者希望把错误码记入日志,比如记录在数据库中,就可以使用ldap_errno()获取此错误码。其形式为:
    int ldap_errno(resource link_id)
    ldap_error()函数获取创建LDAP连接(由一个链接标识符指定)期间生成的最后一条错误消息。其形式为:
    string ldap_error(resource link_id)
    这里列举一部分错误码:
    LDAP_TIMELIMIT_EXCEEDED,超出了预定义的LDAP执行时间限制。
    LDAP_INVALID_CREDENTIALS,给定的绑定凭证无效。
    LDAP_INSUFFICIENT_ACCESS,用户没有足够的权限完成所请求的操作。
    对用户不是很友好其实都是一种变相的借口。如果要为用户提供更详细的响应,就需要建立适当的转换逻辑。但是,基于字符串的错误消息可能会改变或本地化,所以最好是根据错误码而不是错误字符串完成这样的转换。转换并不可怕,最可怕的是到底该怎么让有点傲慢的,作为高级软件工程师的你适应这种转换和变化。其实,是不是高级软件工程师不重要,关键,是不是有一颗继续努力谦虚下去的心态。
    顶
    HTTP是一种无状态的协议,之所以无状态,其实也不是说这个协议有多神秘,只是比较通用而已。说明每次请求的处理都与之前或之后的请求无关。cookie是一种在客户端机器上存储少量信息的实践,但是,cookie大小的限制,所允许的cookie数量以及cookie实现上的各种不一致,诸如此类的种种原因就产生了一种解决方案,会话处理。

    会话处理实际上是无状态问题的一种更聪明的解决办法。它的实现方式是为每位网站访问者分配一个称为会话ID(SID)的唯一标识属性,然后将此SID与任意数量的数据关联,例如每月访问次数,喜爱的背景颜色或中间名等等。SID可以视作为将其他所有用户属性捆绑在一起的主键。更通俗一点来讲,会话就相当于一次线上的聊天,就比如在聊天室聊天这种类型的,一旦网聊结束,会话就关闭了。其实可以通过会话这两个字的字面意思来加深理解。

    cookie,管理用户信息有一种创造性的方法,实际上,这种方法建立在使用cookie的初始方法基础之上。当用户访问网站时,服务器将用户的有关信息(如首选项)存储在cookie中,并发送给浏览器,浏览器将保存这个cookie,而当用户对另一个页面执行请求时,服务器将获取该用户信息,并使用这些信息,例如,对页面进行个性化设置。但是,并不是在cookie中存储具体的用户首选项,而只是存储SID。客户在网站中浏览时,会在必要时获取SID,并在页面中使用与SID相关的各项数据。此外,因为即使会话结束,cookie也能在客户端保存,所以可以在后续会话中读取,这意味着即使长时间不活动,也能持久地保存信息。但是要记住,由于是否接受cookie最终要由客户端控制,而用户有可能禁用浏览器对cookie的支持,或者将cookie从机器中删除,所以必须对这些可能性做好准备。cookie之所以存储在你本地电脑是有原因的,确实,是为了方便你访问某个网站,留下你曾经访问过的痕迹,同时也证明其实你也是有着非常强大的能动性的。关键,看你是否曾经努力尝试证明过自己。

    URL重写。第二种用于SID传播的方法是在每个请求页面的本地URL上增加SID。无论用户何时单击这些本地链接,都会导致SID的自动传播。这种方法称为URL重写,这样即使客户端禁用cookie,也不会影响网站会话处理功能的正常使用。但是,这种方法也有缺陷。首先,URL重写在会话之间不能保证持久性,因为一旦用户离开网站,向URL自动追加SID的过程就无法再持续。其次,无法阻止用户将URL复制到电子邮件并发送给另一位用户。只要会话没有超时,会话就会在接受者的工作站上继续。如果两个用户同步使用相同的会话,或者链接的接收者无意中看到了会话的秘密数据,都可能会发生严重的灾难。出于这些原因,推荐使用基于cookie的方法。但是,最终还是要靠你自己最后来决定。其实,方法有很多,关键是看你怎么正确看待这些计算机中的专业术语,当然,其实,好像感觉很复杂的时候,也好像感觉得到或许有更加简单的解释和更加简单的具体描述。
    顶
    启用会话的页面执行的第一项任务是确定是否存在有效的会话,或者是否要开始新的会话。其实,在通过自己的理解方式来理解自己所定义中的那一份情感寄托的时候,好像,单单在聊天室里面寂寞地在自己看似孤独的小屋里继续着虚幻的聊天看似好像并不是非常可取的。但是,这种可取的方式本来就因为我们自己的很多种想法,很多种思维方式的碰撞之后,让我们突然发现其实我们可以很好地来衡量好我们自己。但是,很多种的悲观总是应该通过我们自己的诸多努力来尝试得到兑现,但是,这种兑现的方式确实应该通过我们自己现实中的努力来尝试获取到,当然,我想,我们应该通过我们自己的思维方式来更好地考虑好我们自己。当然,也许,这也仅仅只是寄托,而不是我们最终将要追求的,属于我们自己的,生活中的会话方式。如果,我们仅仅只是认为我们值得托付我们的时间去做好很多事,做完美很多事的话。我们其实需要属于我们自己的,对于计算机开发的情感碰撞。如果不存在有效的会话,就生成的一个会话并与此用户关联,这将使用前面介绍的某种SID传播方法。可以在请求URL或cookie中寻找SID,由PHP确定是否存在会话。比如,如果会话名为sid并追加到URL,就可以通过以下变量获取值:
    $_GET[‘sid’]
    如果存储在cookie中,可以如下获取:
    $_COOKIE[‘sid’]
    对于每个请求页面都获取此SID。获取之后,就可以为此SID关联信息,或者在获取之前关联到SID的数据。其实,关联和不关联,到底是否应该通过你自己的意识去驾驭,去控制,不仅仅只是一句空话,但是,例如,假设用户在浏览网站上的新闻文章。文章标识符可以映射到用户的SID,这样你就能编排用户已阅读的一组文章,并在用户继续浏览时显示该列表。
    这个过程一直持续到用户结束会话:关闭浏览器或者浏览其他网站。如果使用cookie,并且cookie的过期日期设为将来的某个日期,当用户在过期日期之前返回到网站时,会话将继续,就好像用户从来没有离开过一样。如果使用URL重写,会话则绝对会结束,用户下一次访问网站时必须开始新的会话。其实,这就有点类似于恋爱之中的分手和复合,看似好像跟这个分手后的女朋友没有过多或者是多长久的关联,但,这种关联和不关联,本来就应该通过我们自己的意识去控制好,去表现在现实中,在谈恋爱时所表现出的诸多优点。确实,其实,恋爱这种东西,本质上跟编程是一样的,而且是有着非常强烈的共性存在,如果,这种共性真的能够产出一些必然或者是必要的情感或者是心灵之类的纽带的话,那或许,这种纽带就是看似必要的,同时也是看似重要的。
    可以通过$_REQUEST超级全局变量获取cookie信息。例如,$_REQUEST[‘sessionid’]将获取SID,其作用与相应的$_GET[‘sessionid’]或$_COOKIE[‘sessionid’]一样,但是,为清晰起见,要根据变量的来源,还是应该考虑使用最合适的超级全局变量。
    顶
    session_save_handler指令确定如何存储会话信息。其实,你有时候会发现你在聊天室聊天的时候特别无力,你聊天的时间越是多,你越是会感觉你变得越来越空虚,越来越无助。什么原因,因为你在虚幻世界中的情感也是需要你自己找寻得到你内心当中的那一片归依,然后在这一片归依上存储一些必要的,跟会话信息有关的很多东西。你其实是需要你内心中真正愿意渴望的那些东西,组合并排列在一起,然后真正意义上地融入到你的现实生活当中去。如果,你愿意寄托希望在现实中那些看似乏味并单调的事物上去的话,那或许,对于我而言,还是你也好,都可以忽视我们身边最为习以为常的那些东西,而不是经常愿意因为忽略这些东西的真正存在感,然后,放弃自己最为本真的自我。其形式为:
    session.save_handler=files|mm|sqlite|user
    此数据可以通过4种方法存储:平面文件(files),共享内存(mm),SQLite数据库(sqlite)或者用户定义函数(user)。虽然默认设置files对于许多网站来说已经足够了。但切记,会话存储文件的数量可能会达到几千个,甚至在一段时间后会达到几十万。有时候是不是有一种错觉,明明感觉自己的存钱能力很强,但是在面对那些有着数万甚至是数十万存款的,跟你一样的上班族的时候,确实,很多时候嫉妒这种东西确实是非常常有,同时也非常常见于你自己平时的焦虑中,当然,这种焦虑,我们可以通过我们自己的忽略来避免,但是,我们好像都无法真正摆脱一些什么。
    共享内存选项管理会话的速度最快,但也最不可靠,因为数据存储在RAM中。sqlite选项利用了新的SQLite扩展,通过这个轻量级数据库透明地管理会话信息。user,也就是第四个选项虽然配置最复杂,但也是最灵活,功能最强大的一个选项,因为可以创建定制处理函数,在开发人员所需的任何媒体上存储信息。
    如果session.save_handler设置为files存储选项,则session.save_path指令必须指向存储目录。其形式为:
    session.save_path=string
    session.save_path默认设置为/tmp记住,该指令不能设置为位于服务器文档根中的某个记录,否则可以轻松地通过浏览器危害这些信息的安全。此外,该目录必须是服务器守护进程可写的。
    出于效率的原因,可以使用语法N:/path来定义session.save_path,其中N是一个整数,表示可以存储会话数据的N层深度子目录的数量。如果session.save_handler设置为files,而且网站有很多会话,此时这种语法很有用,因为会话文件可以分为多个目录,而不是一个单独的目录,从而使存储更高效。如果决定利用这个特性,要注意PHP不会自动为你创建这些目录。如果使用基于UNIX的操作系统,要确保在ext/session目录中执行mod_files.sh脚本。如果使用Windows,则不支持此shell脚本,但可以很容易地使用VBScript编写一个兼容的脚本。也许对于Linux管理员而言,她或者是他和普通Windows用户真正的区别也就是到底对于计算机的操作系统有多少热情而已,从本质上来说,其实是一样的。
    顶
    顶
    顶
    网页默认只通过调用函数session_start()来启动会话。其实,在你觉得聊天好像有点过分无聊的时候,但是,也正因为这种无聊能够渗透在自己最开始在启动聊天室软件的那一个瞬间,在整个过程中其实你已经慢慢地开始学会适应通过你自己的主动来开始你所认为的虚拟世界的聊天生活。其实,在平凡无奇的生活中,我们每每希望自己能够总结一些东西,或者是收获一些东西,但是,这些东西最后能够产出什么,最后能够给我们带来一点什么其实并不是我们所能够总结和归纳的。该在现实中总结并梳理的那些东西其实并不算是东西。我们只是学会了适应我们现实中的枯燥生活,但是,当我们开始学会活学活用的时候,也必然是我们真正能够适应我们现实中真正能够适应的平凡生活的开始,仅仅,我们所欠缺的,也仅仅只是因为我们能够适应,我们能够习惯。但是,这种适应跟习惯之间的细微差别,真的有这么重要么。我想,应该不会这么快有效果,如果,现实中的会话能够真正地开启的话,那或许,在虚拟世界的会话就同样能够真正启动并启用。不过,如果要在网站中一直使用会话,也可以将session_auto_start指令设置为1来自动启动会话。其形式为:
    session_auto_start=0|1
    启用此指令的缺点是无法在会话中存储对象,因为类定义要在会话开始之前加载才能重新创建对象。由于session.auto_start会禁止这一点,所以如果要在会话中管理对象,就要禁用此指令。
    PHP默认使用PHPSESSID会话名。但你可以使用指令session.name把默认值改为任何你想要的名字。其形式为:
    session.name=string
    如果要在多次访问网站之间维护用户会话,就应当使用cookie,这样处理器可以重新得到SID,继续原来所保存的会话。如果用户数据只用于一次访问,那么URL重写就足够了。其实,你有时候会发现为什么很多时候自己的孩子在初中时期一直被老师逼着在学习,在认真读书。初中孩子的英语单词量也是在反复地背和记之中在实现总结。重写,重读其实都只是一种看似不够必要的手段。但是,这种手段或许对于小孩子而言,都应该是看似正确中的错误。确实,现在的我们,确实最需要的还是最为自发的学习和最为自然的学习。设置此指令为1表示使用cookie进行SID传播;设置为0将使用URL重写。其形式为:
    session.use_cookies=0|1
    记住,启用session.use_cookies时,不需要显式调用cookie设置函数(例如PHP的set_cookie()),因为这会由会话函数库自动处理。如果选择cookie作为跟踪用户SID的方法,还必须考虑其他几个指令。
    如果session.use.cookies被禁用,用户唯一的SID必须放在URL后面,以确保ID的传播。要实现这个目的,可以手动将变量$SID放到每个URL后面来显式地完成,也可以启用指令session.use_trans_sid来自动完成。其形式为:
    session_use_trans_sid=0|1
    自然,如果你一定要使用URL重写,就应当启用该指令,以免在重写过程中出现人为失误。
    顶
    session.cookie_lifetime指令确定会话cookie的有效期。其实,你在日常生活中有时候会经常面临一些食品的有效期即将到,但是却还没有彻底吃掉这些食品的遗憾。也许,在经历过一些现实中的蹉跎和现实中的沧桑感之后,很多能够通过自己的意识或者是意志尝试想要改变的东西,都开始升华为一种看似非常崇高的人生追求或者是人生目标的,崭新的一个方向。也许,在适应了自己能够适应的枯燥之后,整个现实中的日常生活,都看似好像能够成就为一种看似不够真实或者是真切的东西。真正所残留下的,只是到底该如何真正拿捏好自己最为本真的心意,如果能够通过这些心意尝试想要寻觅回自己在这个现实中的世界中真正的定位和真正的人生格言,那或许,真正的内心中的有效期还不够太遥远,同时也不够太长而已。其形式为:
    session.cookie_lifetime=integer
    生存期以秒为单位,所以如果cookie要存活1小时,就要将指令设置为3600。如果此指令设置为0(默认值),则cookie将一直存活到浏览器重新启动。存活,生存,这些字眼看似在日常生活中普遍并普通着,但是,真正能够很好地生存在这个看似残酷的社会中,本来所欠缺的就是到底该怎么定义好自己接下去该怎么继续生存下去的人生方向,人生方向如果偏失了,那或许,真正所能够放纵自己的真实情感能够真正实现宣泄的时候,那或许,就不单单只是存活,生存这些字眼所能够形容的。
    指令session.cookie_path确定cookie在哪个路径中是有效的。对于这个有效路径下的所有子目录,此cookie同样有效。其形式为:
    session.cookie_path=string
    例如,如果该指令设置为/,则cookie对整个网站都有效。如果设置为/books,则只有在http://www.example.com/books/路径中调用cookie才有效。
    1.设置会话cookie的有效域
    指令session.cookie_domain确定cookie在哪个域中有效。此指令是必须的,因为它能防止其他域读取你的cookie。其形式为:
    session.cookie_domain=string
    下面的例子展示了这个指令的用法:
    session.cookie_domain=www.example.com
    如果要在网站子域中使用会话,比如customers.example.com,intranet.example.com和www2.example.com,可以设置此指令为:
    session.cookie_domain=.example.com
    2.使用referer来验证会话
    如果使用URL重写来传播会话ID,这样很多人都能通过复制和散布URL来查看某个会话的状态。session.referer_check指令可以减少这种可能性,它指定一个用于验证每位用户的子串。如果没有包含子串,SID将失效。其形式为:
    session.referer_check=string
    作用域:PHP_INI_ALL:默认值:空。
    3.session.entropy_file(string)
    作用域:PHP_INI_ALL:默认值:空。
    计算机科学领域的人们都知道,看起来随机的东西往往并不真是随机的。有些人对PHP的内置SID生成过程持怀疑态度,对这些人而言,可以用这个指令来指向一个额外的信息源(entropy source),把这个信息源集成到SID生成过程中。在UNIX系统下,这个来源通常是/dev/random或/dev/urandom。在Windows系统下,安装Cygwin(http://www.cygwin.com/)会提供类似于random或urandom的功能。
    4.session.entropy_length(integer)
    作用域:PHP_INI_ALL:默认值:0。
    此指令确定从session.entropy_file所指定文件中读取的字节数。如果session.entropy_file为空,则此指令被忽略,并使用标准的SID生成模式。
    顶
    在处理会话时,如何由用户的浏览器以及位于服务器和用户之间的任何代理来缓存启用会话的页面。其实,在我原先在上海贝尔软件二次开发一个PHPWIND作为框架的论坛时,其实通过阅读源码已经发现相对应的缓存所在的源码文件夹。也许,在最开始的时候,我总以为缓存不是很重要,但其实在一个人静静地阅读框架源码的时候,有时候会非常惊喜地发现原来很多时候一个人在沉浸在某一个特殊世界的时候,往往不容易轻易忘怀很多事。同时也通过这些事的大量积累之后,很多愿意通过这个世界有所改变的东西,也开始慢慢地蜕变为一种能够升华许久的东西。在愿意通过自己的大胆尝试,想要通过自己的双手来创造一些源码的人而言,很多愿意因为这个世界有所改变的,相关的人都会因为自己的某一份偏执,学会懂得更多,同时也学会掌握更多。session.cache_limiter指令修改这些页面与缓存相关的首部,提供有关缓存首选项的说明。其形式为:
    session.cache_limiter=string
    有5个可用值,如下所示。
    none。此设置禁止随启用会话的页面传输任何缓存控制首部。
    nocache。这是默认设置。此设置确保对于每个请求,在可能提供缓存的版本之前,先将请求发送到最初的服务器。
    private。指定缓存的文档是私有的,该文档只用于最初的用户,不能与其他用户共享。
    private_no_expire。这是private的变体,它保证不会向浏览器发送任何文档过期日期。如果发送了Expire首部,又将此指令设置为private,此时各种浏览器就会糊涂,private_no_expire则是这种情况的解决方法。
    public。此设置认为所有文档都是可缓存的,但最初的文档请求可能需要验证。
    1.为启用会话的页面设置缓存过期时间,在过期跟不过期之间,其实缓存所要做到的也就是字面上的意思,让网站或者是会话的相关内容,能够暂时保存一段时间,就像面包房刚刚做好的面包一样,当然,我们其实应该意识到这种日常生活中的必要积累,有时候也能够帮助到更多人,更多看似在枯燥生活中已经看似失去信心的人。
    作用域:PHP_INI_ALL;默认值:180。
    session.cache_expire指令确定在创建新页面之前,缓存的会话页面可用的秒数(默认为180秒)。其形式为:
    session.cache_expire=integer
    如果session.cache_limiter设置为nocache,则此指令被忽略。
    2.设置会话生存期
    作用域:PHP_INI_ALL;默认值:1440。
    此指令确定有效会话的持续时间,以秒为单位(默认为1440),在此期间会话被认为是有效的。其形式为:
    session_gc_maxlifetime=integer
    到达此限制时,会话信息将被销毁,系统资源得以重新分配,默认情况下,它设置为一个特殊的值1440,即24分钟。在特殊跟不特殊之间,很多时候无法通过自己最为真实的意志去控制,同时也因为这些控制跟不控制之间细微的差别,让我们终于有点意外地发现其实我们可以让我们沉浸在很多愿意通过这个世界有所改变的世界最深处,最值得我们期待的,只是我们到底应该如何真正定义好我们的以后,如果,这种以后还能够持续到过去,现在还是将来的话。
    ?
    ?
    顶
    记住,HTTP会忘记用户过去和将来的环境。其实,过去是初级程序员,现在还是初级程序员的这种现实中的,所谓的高级软件工程师一直在现实中经历着太多的失落与彷徨。关键还是因为欠缺了对于计算机的热情,也许,我们总是有一种错觉,这种错觉就是,到底是否应该通过自己的努力尝试想要收获属于自己的那一份成功,但其实,这种成功一直都是看似稍纵即逝的。不应该通过自己的很多种错觉尝试收获现实中的一份份附带着自信的直觉。直觉跟错觉交错在一起,融汇成为了一种能够让自己一直自信或者是努力下去的正确方向。如果,这种方向是看似正向的话,那或许,这种正向就是看似正确的,同时也是能够有着指引作用的。因此,需要对每次请求显示地启动和恢复会话。两项任务可以使用session_start()函数完成。其形式为:
    boolean session_start()
    函数session_start()创建一个新会话或继续当前会话,这取决于是否拥有SID。ID其实在数据库中是一种最为平常的标识数据的方式。当然,也许,你可能会发现其实你在入职公司的时候,或许也会有一张类似的员工卡还标识有属于你自己的专属员工ID,这其实就是ID对于你而言的,在现实中的特殊也最为平常的意义。开始会话时,只需如下调用该函数:
    session_start();
    注意,无论结果如何,session_start()函数都会报告成功的结果。因此,使用任何异常处理都不起作用。每个人都曾经有过异常的时候,但其实异常也可以通过自己的冷静处理蜕变为一种升华,一种能够启迪出自己的真实潜力的升华。异常其实并不可怕,真正可怕的在于你到底该如何通过你自己的认真判断处理好这个异常并捕获好这个异常。当然,也许,你应该有一种潜意识,认为自己或许不应该通过自己的很多负面,来尝试掩盖自己身上最为平实的,看似正常的那一份份异常感。可以启用配置指令session.auto_start,从而不必执行这个函数。但要记住,这样一来,每个启用PHP的页面都会开始或继续一个会话。
    尽管可以配置PHP的会话处理指令,根据过期时间或概率自动销毁会话,但有时手工撤销会话也很有用。例如,你可能希望让用户手工注销即登出网站。当用户单击适当的链接时,可以从内存中消除会话变量,甚至从内存中完全清除整个会话,这分别通过session_unset()和session_destroy()函数完成。
    session_unset()函数清除存储在当前会话中的所有会话变量,它能有效地将会话重置为创建时的状态(没有注册任何会话变量状态)。其形式为:
    void session_unset()
    执行session_unset()确实会删除存储在当前会话中的所有会话变量,但并不会从存储机制中完全删除会话。如果希望完全销毁会话,需要使用函数session_destroy(),该函数从存储机制中完全删除会话,使当前会话失效。记住,这不会销毁用户浏览器中的任何cookie。其形式为:
    boolean session_destroy()
    如果不想在会话之后使用cookie,只需在php.ini文件中将session.cookie_lifetime设置为0。
    顶
    记住,SID将所有的会话数据绑定到某个特定用户。虽然PHP能够自动创建和传播SID,但有时候也希望手工设置和获取这个SID。其实有时候你会不会有一种错觉,这种错觉的真正含义就是,到底是否ID能够成为标识一个人或者是一个群体的真正的存在,但其实,这本来就可以通过自己的认真梳理或者是社会工作人员的认真揣摩和整理之后,让ID这种东西,变成跟身份证都很类似的东西,当然,身份证其实就是现实中的一个标识人身份的最为准确也最为恰当的方式。也许,我们其实都应该非常惊喜地看到并发现或许我们都是应该需要属于我们自己的自信和我们自己所能够拥有的这一切,这一切能够让我们在某一瞬间都意识到,原来,我们可以认为我们应该努力尝试改变现实中的枯燥生活,但,生活不单单只是因为现实中的会话是否真的能够开启或者是关闭,我们,只是欠缺了一种表现的方法和手段而已。如果,我们愿意认为我们值得通过我们自己的努力,开始愿意尝试改变这个现实中的平凡生活的话。函数session_id()能够完成这两项任务。其形式为:
    string session_id([string sid])
    函数session_id()可以设置和获得SID。如果没有参数,函数session_id()则返回当前SID。如果包括可选参数sid,当前SID将被该值替换。示例如下:
    <?php
    //开启会话
    session_start();
    // 打印会话的id
    echo “Your session identification number is”.session_id();
    ?>
    这将得到类似于下面的输出:
    Your session identification number is 967d992a949114ee9832f1c11c
    会话变量用来管理随用户一起从一个页面传到下一个页面的数据。但现在首选的方法是:只需像其他任何变量一样设置和删除会话变量即可,不过需要在$_SESSION超级全局上下文中引用这个变量。例如,假设希望设置名为username的会话变量:
    <?php
    session_start();
    $_SESSION[‘username’]=”jason”;
    printf(“Your username is %s.”,$_SESSION[‘username’]);
    ?>
    返回如下结果:
    Your username is jason.
    可以使用unset()函数删除该变量:
    <?php
    session_start();
    $_SESSION[‘username’]=”jason”;
    printf(“Your username is:%s<br/>”,$_SESSION[‘username’]);
    //通过unset函数删除会话中的username变量
    unset($_SESSION[‘username’]);
    printf(“Username now set to:%s”,$_SESSION[‘username’]);
    ?>
    这会返回:
    Your username is:jason
    Username now set to:
    其实通过返回的结果已经发现unset这个函数确实删除了会话中的username变量。
    其实对于函数session_register()和session_unregister(),这两个函数曾经分别是创建和撤销会话变量的推荐方法。这其实跟在论坛注册账号是一样的道理,确实,会话这东西,曾经也可以通过注册或者是不注册来创建和撤销,但是,也许,我们其实都有一种疑惑,这种疑惑就是,我们是否曾经在编写代码的时候查阅过曾经PHP的那一些老的网站源码,发现一些有点旧的源码的代码片段,确实,过去,现在和将来源码确实是需要不断更新和不断修改的,只是,到底是否应该因为我们自己曾经的很多种能够改变得到其他程序员或者是源码学习人员的决定之后,让我们终于发现,我们不单单只是单一和完整的。我们,也同样因为我们自己,所以,我们开始学会适应我们自己所不愿意承认的那种现实中的认真,和我们不愿意承认的守旧。不过,由于这些函数依赖于一个名为register_globals的配置指令,而在PHP4.2.0中已经默认禁用了这个指令,在PHP6.0中已经将其完全去除,所以应该像之前代码中的那样使用变量赋值和删除方法。
    这样一来,《郎朗的计算机文学》正文10万字以上了。
    顶
    顶
    顶
    顶
    顶
    无论何种存储介质,PHP都会以标准化格式(包括一个字符串)存储会话数据。存储介质其实对于现实中的人而言,马上就会想到硬盘或者是U盘之类的东西。但,其实对于一些计算机装机的师傅们而言,他们也仅仅只是知道到底该怎么安装兼容机所对应的硬盘而已。其实计算机组成原理之所以会在计算机考研408中作为一门有45分分值的课程出现或许也是有原因的。我计算机信息管理自考本科中所学的计算机原理,其实比计算机组成原理要简单很多。但,或许,这种简单跟不简单之间的差异和分别,马上就因为很多看似很特殊的原因和理由,让现实中看似在枯燥中经历平凡的,对于我们这些学习者而言有意义的书籍而言,存储介质,电路图之类的都应该被理解为不仅仅是一种更加了解硬件的手段,而不仅仅只是硬件工程师应该学习并掌握的东西。例如,由两个变量username和loggedon组成的会话内容显示如下:
    username|s:5:”jason”;loggedon|s:20:”Feb 16 2008 22:32:29”;
    各个会话变量用分号隔开,每个会话变量由3部分组成:名,长度和值。一般语法如下:
    name|s:length:”value”;
    幸好,PHP会自动处理会话的编码和解码。编码和解码其实很多时候看似好像是相反的动作,但,这种相反,很多时候不仅仅只是因为看似相反而互相排斥着存在。其实都只是为了更好地表现和保存好数据,如果,这个现实中的程序员们都开始能够学会更加开放地分享他们曾经的工作经验和做过的项目,那,或许,真正应该剩余给他们的,就是到底是否应该更加正确地去面对好接下去看上去更加枯燥,更加乏味的PHP代码和框架的学习。枯燥中经历乐趣,慢慢地通过代码更好地总结并完善好自己,确实,确实可以被称作为是一种正向的成长,如果,这种成长能够一直有效的话。有效跟无效,很多时候都是相对而言的。但是,有时还希望手工执行这些任务。这可以通过两个函数来完成:session_encode()和session_decode()。
    函数session_encode()提供了一种特别方便的方法,可以手工将所有会话变量编码为一个字符串。其形式为:
    string session_encode()
    然后可以将此字符串插入到数据库,并在以后获取,比如使用session_decode()对其解码时。假设用户有一个cookie,其中包含存储于其计算机上的用户ID。当用户请求包含下面所示代码的页面时,就可以从cookie中获取用户ID,然后把这个值赋给SID。接下来,创建一些会话变量并赋值,然后使用session_encode()对所有信息进行编码,这样就可以插入到MySQL数据库中了。
    <?php
    //初始化session会话然后创建几个session变量
    session_start();
    //设置几个session会话变量
    $_SESSION[‘username’]=”jason”;
    $_SESSION[‘loggedon’]=date(“M d Y H:i:s”);
    //将所有的session会话数据编码进一个单一的字符串然后返回相应的结果。
    $_sessionVars=session_encode();
    echo $sessionVars;
    ?>
    这会返回如下结果:
    username|s:5:”jason”;loggedon|s:20:”Feb 16 2008 22:32:29”;
    记住,session_encode()将对用户的所有会话变量编码,而不只是对执行session_encode()的脚本中注册的变量进行编码。
    顶
    顶
    顶
    boolean session_decode(string session_data)
    编码的会话数据可以通过session_decode()解码。其实有时候你会发现有些数据库其实也是加密的,而且看不到相对应的字段和相应的数据库内容。像古代的时候,通过信件的方式其实已经能够传递非常隐秘的信息,但是,这些信件还是能够被一些有心思的人获得,甚至是篡改。也许,现实中,现在步入高新科技时代的我们,都开始因为我们自己曾经的很多种考虑和很多种思维方式的组合之后,让很多人内心中的秘密都开始变得不再像是秘密。密码这种东西,我曾经的网易博客就好像被人暴力破解过,当然,我的网易博客其实没有什么值钱的东西,但是,这种暴力破解好像能够说明其实很多时候黑客在做很多看似很违法的事情的时候,也变相地因为这种加密,这种解密的必然关联之后,让现实生活中因为无法适应平凡生活的我们都开始觉得我们应该要学会更好地感谢生活,感谢现在的这个社会主义的社会,当然,其实,我们仅仅只是缺乏了一种更好地表现自己的手段和方式。如果,我们能够让我们自己学会懂得梳理并整理好这些能够带来焦虑和不安的点的话。那或许,我们就看似能够改变更多,而且还能够改变地非常恰当,非常合理。输入参数session_data表示编码后的会话变量字符串。这个函数将对变量解码,返回为最初的格式,成功时返回TRUE,否则返回FALSE。作为示例,假设在MySQL数据库中存储了一些会话数据,包括各个SID及变量$_SESSION[‘username’]和$_SESSION[‘loggedon’]。在下面的脚本中,将从表中获取此数据。并进行解码:
    <?php
    session_start();
    $sid=session_id();
    //从数据库中取回的编码好的数据就像这样:
    //$sessionVars=username|s:5:”jason”;loggedons|s:20:”Feb 16 2008 22:32:29”;
    session_decode($sessionVars);
    echo “User”.$_SESSION[‘username’].”logged on at”.$_SESSION[‘loggedon’].”.”;
    ?>
    这会返回:
    User jason logged on at Feb 16 2008 22:55:22.
    这个假想的示例只是为了说明PHP的编码和解码函数。如果你想在数据库中存储会话数据,更高效的办法是定义定制的会话处理器。将处理器直接绑定到PHP API。数据库其实很多时候不仅仅只是为了查询数据,通过SQLyog这个界面还算是可以的数据库工具来查询数据并不仅仅只是为了让创建和删除数据库变得有多方便。其实,只是为了让自己学会懂得因为计算机的很多有个性的理论性的支撑之后,能够对于之后的实践,有着更深一层次的帮助,同样还能够做到更好地馈赠于现在,未来的学习生活里。

    一般通过提供唯一标识用户的用户名和密码组合来完成用户登录,用户一旦登录,以后返回到网站时就不再需要重复这个登录过程了。通常这很方便。只需使用会话,几个会话变量和一个MySQL表就可以轻松地完成这个任务。虽然有很多方法可以实现这个特性,不过,只需检查现有的一个会话变量(即$username)就足够了。如果存在这个变量,用户就可以透明地进入网站,否则,为用户给出登录表单。
    默认情况下,session.cookie_lifetime配置指令设置为0,表示cookie在浏览器重启后就不再存在。因此,为了使会话存在一段时间,应当将这个值修改为适当的秒数。
    顶
    顶
    顶
    如下是users表
    CREATE TABLE users(
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    username VARCHAR(10) NOT NULL,
    pswd VARCHAR(10) NOT NULL,
    PRIMARY KEY(id)
    );
    其实也就是通过创建数据库表users,定义了三个字段id,username,pswd,最后定义id作为数据库表users的主键,也就是这个数据库表users每一行记录的唯一标识。其实,标识这种东西,最开始的时候不仅仅只是一种表现数据库中行或者是列的一种手段。数据其实最开始的时候在电脑中是以一个个文件,一个个文件夹的方式存在的,当然,我们其实应该清楚地意识到很多时候,看似很简短的一个数据库的建表语句,并不是非常难理解,如果想象一下如果以后数据库的建表语句能够用中文来表示的话,那会不会对于数据库管理员来说就是一种灾难,好像必然要面临接下去失业的一种灾难,当然,我们其实能够非常清楚地意识到很多时候我们大脑中所存储的那些信息量,也应该通过我们自己的判断或者是真实地思考过后,变成一种能够永久存储的信息存储在我们的大脑最深处,大脑最神秘的地方就是不管你记忆能力有多强,你在现实中所学会或者是掌握的书本上的知识或者是现实生活中通过锻炼而掌握的技能,都开始蜕变为一种非常强烈的自豪感,一种学成之后的自豪感,当然,这仅仅,仅仅只是一个现实中的,被缩小后的小我的一种成就,如果,这种成就真的能够有非常大或者是非常巨大的作用或者是推动作用的话。
    如下代码段(login.html)是一个登录表单,如果没有找到有效的会话,就会向用户显示这个登录表单:
    


    <form method=”post” action=”<?php echo $_SERVER[‘PHP_SELF’]; ?>”>
    Username:<br/><input type=”text” name=”username” size=”10” /><br/>
    Password:<br/><input type=”password” name=”pswd” size=”10”/><br/>
    <input type=”submit” value=”Login”/>
    </form>
    


    其实以上HTML代码就是定义了一个表单form,这个表单的提交方式选择用post,也就是表单所有数据填写好之后直接提交,action提示表单提交后跳转到本页面,然后定义了一个文本框Username和一个密码框Password,然后再定义了一个表单提交按钮submit,最后这个表单就这样定义好了。
    最后,用来管理自动登录过程的代码如下:
    <?php
    session_start();
    //判断一个会话session是否之前就已经初始化了?
    if(!isset($_SESSION[‘username’])){
    //如果之前的会话没有,判断用户是否已经提交了表单?
    if(isset($_POST[‘username’]))
    {
    $username=mysqli_real_escape_string($_POST[‘username’]);
    $pswd=mysqli_real_escape_string($_POST[‘pswd’]);
    //连接到MySQL服务器然后选择相对应的数据库
    mysql_connect(“localhost”,”webuser”,”secret”);
    mysql_select_db(“chapter18”);
    //在users表里寻找相对应的user
    $query=”SELECT username FROM users WHERE username=’$username’ AND pswd=’$pswd’”;
    $result=mysql_query($query);
    //判断用户user是否已经定位到了?
    if(mysql_numrows($result)==1)
    {
    $_SESSION[‘username’]=mysql_result($result,0,”username”);
    echo “You’ve successfully logged in.”;
    }
    //如果用户之前没有登录进来,显示登录的表单
    }else{
    include “login.html”;
    }
    //相对应的用户已经返回了,提供一个欢迎的提示。
    }else{
    printf(“Welcome back,%s!”,$_SESSION[‘username’]);
    }
    ?>
    如果用户要记住各种在线服务所需的用户名和密码(如检查电子邮件,图书馆续借图书,查看银行账户等等),并为此搞得焦头烂额,倘若能在情况允许时提供一种自动登录的特性,一定会受到用户的欢迎。自动登录到自己存储大量信息的大脑里或者是电脑里,很多时候,在我们愿意记忆住我们内心深处真正愿意渴望我们能够想要或者是想要得到的东西的时候,也许,我们,最需要的,仅仅只是一种看似真实,但却还是非常虚幻的,我们所能够形容的代码世界里。
    顶
    顶
    顶
    用户经常会遇到这种情况,返回到网站时,想不起来到哪里查找原先看过但忘记加入收藏的PHP教程?如果网站能够记住曾经读过的文章,无论何时都给出一个列表该有多好!其实在论坛阅读小说的时候你也会发现每一楼都会有一些零星的评论或者是其他无聊人士在论坛的涂鸦或者是发泄。其实,网站也好,特别是论坛,确实能够聚集全中国甚至是全世界的无聊人士。曾经大学时期的我也很无聊,QQ上聊天加了很多好友。现在总结一下,重新回味一下会发现其实很多时候总结一件事看似很简单,但其实一直都很不简单。其实现在很多的PHP开源代码网站并不是因为程序员的学习能力下降还是什么其他之类的原因。程序员其实之所以变得越来越浮躁确实是因为社会上出现了大量的软件开发培训公司。鼓吹培训之后年收入二三十万之类的。其实,是否学到了东西关键还是看你自己。放羊式的教学其实我也经历过。但是,如何通过放羊式的教学学会懂得让自己学会通过自学来让自己改进更多。同时还能够增进更多。其实,并不仅仅只是因为大量PHP培训机构的出现让PHP初级程序员变得越来越廉价,越来越便宜,虚假简历,让自己的软件开发培训变成在软件公司的工作经验。很多看似很简单的理论性问题其实都不算是问题。关键,是在于程序员是否能够真正用心去自学。用心去学习一些新技术,掌握一些新技能。技术好坏可以磨练,真正的兴趣,特别是对于计算机的热忱很多时候是无法用言语来形容,言语来驾驭的。其实我们最应该通过我们自己的总结学会懂得接受属于我们自己对于计算机的热情。下面的例子就要展示这个特性。
    这种情况的解决方案既简单又有效。为了记住给定用户读过的文档,可以要求用户和每个文档都用一个唯一标识符标识。对于用户,SID就能满足这个要求。要标识文档,可以使用任何方法来实现,但这个例子使用了文档的标题和URL,并假设此信息来自articles数据库表所存储的数据。显示如下:
    CREATE TABLE articles(
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    title VARCHAR(50),
    content MEDIUMTEXT NOT NULL,
    PRIMARY KEY(id)
    );
    其实也就是创建了一个articles表,定义了三个字段id,title,content,并定义该数据库表的主键为id。然后接下来的任务只是在会话变量中存储文章标识符,下面的代码实现了这个任务:
    <?php
    //开始会话
    session_start();
    //连接到数据库服务器然后选择相对应的数据库
    mysql_connect(“localhost”,”webuser”,”secret”);
    mysql_select_db(“chapter18”);
    //取回所请求的文章article id
    $articleid=mysqli_real_escape_string($_GET[‘id’]);
    //用户想要去看一篇文章,然后从数据库中取回它
    $query=”SELECT title,content FROM articles WHERE id=’$id’”;
    $result=mysql_query($query);
    //取得所查询的结果
    list($title,$content)=mysql_fetch_row($result);
    //增加文章article的标题然后链接到相对应的list列表
    $articlelink=”<a href=’article.php?id=$id’>$title</a>”;
    if(!in_array($articlelink,$_SESSION[‘articles’]))
    $_SESSION[‘articles’][]=$articlelink;
    //输出所请求大量文章的列表
    echo “

$title

$content

”;
    echo “

Recently Viewed Articles

”;
    echo “<ul>”;
    foreach($_SESSION[‘articles’] as $doc) echo “<li>$doc</li>”;
    echo “</ul>”;
    ?>
    以上代码输出如下:
    “Beginning PHP and MySQL,Third Edition” hits book stores today!
    Things are getting back to normal at the Gilmore household after Jason submitted the final chapter last Friday.Neighbors breathed a sigh of relief after hearing the lawn mower roar to life over the weekend.(其实这就是一个跟踪用户浏览过的文档。)
    顶
    顶
    顶
    在4种存储方法中,用户定义的会话处理器提供了最大程度的灵活性。但要正确地实现定制会话处理器,必须遵循一些实现规则,其实生活中有很多规则,而且这些规则看似是固定不变的,当然,其实对于编程语言来说,都有着一定的语法要求,同时也在编写的时候要遵循一定的规范,但是,我们其实可以想见,当我们愿意投入我们大量的精力去研究一个PHP框架并熟悉用这个框架来开发PHP应用程序的时候。我们开始有点惊喜地发现其实对于现实中的我们每个人而言。我们都必然因为经历过一些事,我们也必然因为现实中的种种牵绊或者是牵挂之后。我们其实应该意识到很多时候,尝试想要选择一门简单的编程语言。但在大量地选择和取舍之后,大量的编程语言的优点和缺点都在不断地使用中更新,不断地使用中总结。为什么ASP比起ASP.NET而言落后了很多。也许就是因为创造这一门编程语言的人其实最开始的时候考虑的事情不是很多。我们其实最应该关注的是我们是否已经做好了充足的准备。就算我们是高级软件工程师我们还是应该不断学习,不断更新自己的计算机理论知识。就跟我离开上海贝尔软件选择复旦计算机自考本科是一样的道理。是否学习过,是否努力尝试提升过自己,然后,在某一个特殊的时间点终于发现,原来,我可以通过学习收获更多,也可以通过学习掌握并提升更多。真正掌握或者是想要提升自己的种种在理论上也好,还是在动手能力也罢上的提高,都不仅仅只是一种手段,即便,这种手段看似好像不是很重要,但,或许,对于现在的每一个小我而言,我们能够实现属于我们自己的大我。而不论选择何种处理方法。对于新手来说,必须定义下面6个函数,每个函数分别满足PHP会话处理功能中的一个必要部分。此外,必须遵循每个函数的参数定义,而不论你的特定实现是否使用这些参数。session_set_save_handler(),这个函数能魔法般地将PHP的会话处理器行为转换为定制处理器函数所定义的行为。
    session_open($session_save_path,$session_name)。这个函数初始化在会话过程中可能用到的所有元素。它的两个输入参数$session_save_path和$session_name指示在php.ini文件中找到的配置指令。之后可以用PHP的get_cfg_var()函数获取这些配置值。
    session_close()。这个函数与一般处理器函数的操作类似,关闭session_open()初始化时打开的资源。如你所见,这个函数没有输入参数。记住,该函数并不销毁会话,那是最后要介绍的session_destroy()的任务。
    session_read($sessionID)。这个函数从存储介质中读取会话数据。输入参数$sessionID指示用于标识特定客户数据的SID。
    session_write($sessionID,$value)。这个函数将会话数据写入存储介质。输入参数$sessionID是变量名,输入参数$value是会话数据。
    session_destroy($sessionID)。这个函数可能是脚本中要调用的最后一个函数。它会销毁会话和所有相关的会话变量。输入参数$sessionID指示当前打开会话的SID。
    session_garbage_collect($lifetime)。这个函数有效地删除所有到期的会话。输入参数$lifetime指示php.ini文件中的会话配置指令session.gc_maxlifetime。
    顶
    顶
    顶
    在定义了6个定制处理器函数之后,必须将其加入到PHP的会话处理逻辑中。其实,逻辑这种东西,对于程序员而言是非常重要的。对于计算机的硕士而言,之所以要考察数学一还有计算机综合也是因为这个原因。在写代码的时候,很多时候会陷入一个误区,这个误区就是很多能够忽略的小细节或者是小bug,都能够通过自己再次阅读代码之后的认真和努力来尽力改善。能够改善看似杂乱的代码的时候,也必然会因为很多看似很琐碎的问题,让这些问题都开始出现地看似很恰当。但其实也因为这种恰当跟不合适之间的比较和分别之后,程序员跟程序员之间因为代码无法阅读而产生的分歧也会越变越多。当然,其实我们都应该意识到我们能够看似改变一部分代码,但是,这一部分代码也开始因为我们能够适当改善我们阅读代码的习惯,和写注释的习惯。习惯,并不是因为看似能够让自己陷入或者是沉浸入一个开源代码的天堂,我们都应该懂得利用我们自己能够形容或者是描述的代码天堂,让我们开始发现其实很多时候,我们应该能够通过阅读PHP电子书或者是纸质版的书本收获更多。但,这种收获很多时候也会因为时间的流逝而让我们不知不觉中遗忘。当我们能够遗忘的时候,我们开始学会懂得珍惜我们现实中曾经阅读过或者是写过的代码,然后,慢慢地,我们开始惊喜地发现,原来,不仅仅只是因为现实,不仅仅只是因为这些曾经认真编写过的代码。我们,开始能够成就一些事实的时候,我们也必然能够改变很多现实中无法做到的,但是通过编程能够做到的东西。这很容易完成,只需将处理器名传递给函数session_set_save_handler()。记住,这些名字可以是任意选择的,但是,参数个数和类型必须正确,并且必须以正确的顺序传给session_set_save_handler()函数:打开,关闭,读取,写入,销毁和垃圾回收。下面的例子显示了如何调用这个函数:
    session_set_save_handler(“session_open”,”session_close”,”session_read”,”session_write”,”session_destroy”,”session_garbage_collect”);
    在部署基于MySQL的处理器之前,必须完成以下两个任务。
    (1)创建用于存储会话数据的数据库和表。
    (2)创建6个定制处理器函数。
    如下创建了一个MySQL表sessioninfo。对于这个例子,假设该表在数据库sessions中,不过你也可以将这个表放在任何位置。
    CREATE TABLE sessioninfo(
    SID CHAR(32) NOT NULL,
    expiration INT NOT NULL,
    value TEXT NOT NULL,
    PRIMARY KEY(SID)
    );
    以上代码提供了定制的MySQL会话函数。注意,它定义了所有必要的处理器,确保为每个函数传入的参数个数正确,而不论这些函数在函数中是否真正用到。MySQL其实在我的使用过程中,其实我之所以一直使用就是因为它免费,而且这种免费的午餐能够做到并实现的数据库功能也是多样的,而且是多变的,所以,PHP和MySQL结合使用的时候,当然也就是开源代码能够真正开花结果,让所有使用的人都会开始感谢开源,感谢所有贡献过开源的人。不管曾经是什么样的身份也好,也不管是否是程序员也好。
    顶
    顶
    顶
    以下代码就是一个MySQL会话存储处理器。
    <?php
    /*
    *mysql_session_open()
    *打开一个持久的服务器连接,然后选择对应的数据库。
    */
    function mysql_session_open($session_path,$session_name){
    mysql_pconnect(“localhost”,”sessionmanager”,”secret”) or die(“Can’t connect to MySQL server!”);
    mysql_select_db(“sessions”)
    or die(“Can’t select MySQL sessions database”);
    } //终止mysql_session_open()函数
    /*mysql_session_close()
    在这个服务器连接是持久性的时候确切来说没有做任何事。注意虽然在我特定的实现中虽然这个函数没有做任何事,但是它确实应该这样来被定义。
    function mysql_session_close(){
    return 1;
    } //终止mysql_session_close()
    /*
    *mysql_session_select()
    *从数据库中读取相对应的会话数据
    */
    function mysql_session_select($SID){
    $query=”SELECT value FROM sessioninfo
    WHERE SID=’$SID’ AND expiration>”.time();
    $result=mysql_query($query);
    if(mysql_num_rows($result)){
    $row=mysql_fetch_assoc($result);
    $value=$row[‘value’];
    return $value;
    }else{
    return “”;
    }
    } //终止mysql_session_select()
    /*
    *mysql_session_write()
    *这个函数将会话数据写入数据库。
    *如果那个SID已经存在了,然后所存在的数据也会很快被会更新。
    */
    function mysql_session_write($SID,$value){
    //取回最大的会话生命期
    $lifetime=get_ cfg_var(“session.gc_maxlifetime”);
    //设置会话失效的日期
    $expiration=time()+$lifetime;
    //将会话数据插入数据库
    $query=”INSERT INTO sessioninfo VALUES(‘$SID’,’$expiration’,’$value’)”;
    $result=mysql_query($query);
    //如果这个查询失败了,这个会话就已经存在了。
    //因此,更新这个会话作为代替。
    if(!$result){
    $query=”UPDATE sessioninfo SET
    expiration=’$expiration’,value=’$value’ WHERE
    SID=’$SID’ AND expiration>”.time();
    $result=mysql_query($query);
    }
    } //终止mysql_session_write()
    /*
    *mysql_session_destroy()
    *删除所有已经拥有输入SID的会话信息(只有一行)
    */
    function mysql_session_destroy($SID){
    //删除拥有特定SID的所有会话信息
    $query=”DELETE FROM sessioninfo
    WHERE SID=’$SID’”;
    $result=mysql_query($query);
    } //终止mysql_session_destroy()
    /*
    *mysql_session_garbage_collect()
    *删除已经失效的所有会话
    */
    function mysql_session_garbage_collect($lifetime){
    //删除所有老于一个特定年龄的所有会话
    $query=”DELETE FROM sessioninfo
    WHERE sess_expiration <”.time()-$lifetime;
    $result=mysql_query($query);
    return mysql_affected_rows($result);
    } //终止mysql_session_garbage_collect()
    ?>
    定义这些函数之后,就可以调用函数session_set_save_handler()将它们加入到PHP的处理器逻辑。应当把下面的代码附加到如下代码所定义脚本的末尾处:
    session_set_save_handler(“mysql_session_open”,”mysql_session_close”,”mysql_session_select”,
    “mysql_session_write”,”mysql_session_destroy”,”mysql_session_garbage_collect”);
    为了测试这个定制处理器的实现,使用以下脚本启动一个会话,并注册一个会话变量:
    <?php
    INCLUDE “mysqlsessionhandlers.php”;
    session_start();
    $_SESSION[‘name’]=”Jason”;
    ?>
    执行此脚本后,使用mysql客户端查看sessioninfo表的内容:
    mysql>select * from sessioninfo;
    其实,在真正能够定义属于自己的计算机逻辑的时候,很多必然无法真正忘怀的东西也会慢慢出现,同时出现地非常恰当,我们其实应该发现其实我们身上有很多看似能够改正或者是纠正,但一直无法真正改变的一些缺点,然后,因为这些缺点跟优点的中和之后,看似无法改变的化学反应就这样慢慢地产生了。会话这种东西,并不是因为开启还是关闭就能够让这个概念和定义变得更加晦涩和难懂。其实,计算机这个领域,为什么知识面过一段时间就要更新,就要被重新定义,其实是有着非常多的原因和理由存在,我们不仅仅只是肤浅地尝试想要学会懂得通过计算机编程来实现我们自己的个人网站理想。当然,我们其实早就应该发现其实我们能够通过PHP实现很多不能够实现的理想或者是功能。我们开始学会懂得感谢生活的时候,我们不仅仅只是因为发现了生活中跟计算机书本上的一些共通点,让我们终于意识到很多时候,尝试想要遗忘一点东西,尝试想要收获一点东西,都不仅仅只是因为我们自己无法真正面对我们现实中在计算机书本上无法实现的理想或者是目标,我们其实都应该发现我们现实中定义出的那一件件我们不愿意真正想到或者是提及到的东西,如果,我们愿意通过我们自己的认真来梳理一些知识点的话,那或许,真正留给我们的,就不仅仅只是认真读书之后的必然总结而已了。
    顶
    顶
    顶
    有很多解决方案可以将网站的表现与逻辑几乎完全分离。其实,原先我在达内培训JAVA的时候其实授课的老师并没有非常强调界面和程序代码之间的这种必然联系。其实,界面确实不应该太让程序员责任和负担重,应该把这些任务交给美工来做。其实我在上海贝尔软件的时候我其实连美工我都是做的。什么原因,其实王军星经理的这种降低成本,然后开发企业个人网站的这种做法也还算是可取的。毕竟,上海贝尔软件之所以外包员工多也就是因为成本控制的原因。美工其实在上海贝尔软件是极其缺乏的。当然,美工其实确实应该稍微懂一点JavaScript或者是Jquery框架的一些最为简单的用法。其实很多小的软件公司,程序员有时候也要经常做一点界面美化或者是美工之类的东西。现在的我其实也终于意识到大型网站之所以系统能够做得这么健壮,就说拼多多好了,之所以能够做得还算是可以,还算是成功,就是因为它其实就是利用了人的一点贪图小利的这种性格上的普遍缺陷。同时小游戏都做得还算是可以,特别在美工上做得非常好。淘宝网其实也是类似的做法。当然,我想,其实之所以电子商务网站都能够做得这么火,做得这么完善,就是因为这些种种的原因的外部影响之后,让我们终于惊喜地发现,原来,界面跟系统确实是相辅相成的,同时,也是最不容易被忽略的一种现实。一种在代码上实现充实感的种种现实。这些解决方案称为模板化引擎。它们正在逐步消除由于缺乏层次分离而带来的难题。Smarty就是其中最流行的PHP模板化解决方案。其实,模板化引擎的目的在于分离应用程序的业务逻辑和表现逻辑。这样做有几个原因,最重要的两个原因如下所示。
    可以使用同样的代码基为不同目标生成数据:打印,Web,电子数据表,基于电子邮件的报表,等等。如果不适用模板化引擎,则需要针对每种输出目标复制并修改代码,这会带来非常严重的代码冗余,极大地降低了可管理性。
    应用程序设计人员(负责创建和维护界面的人)可以与应用程序开发人员独立工作,因为应用的表现和逻辑并非密不可分地纠缠在一起。此外,因为大多数模板化引擎使用的表现逻辑一般比应用程序所使用编程语言的语法更简单,所以,设计人员不需要为完成其工作而在语言上花费太多精力。
    但模板化引擎如何完成这种分离?大多数实现的做法与编程语法非常相似,为完成各种与界面有关的任务提供了良好定义的语法和命令集。这种表现语言嵌入在一系列模板中,每个模板包含应用程序的表现方面,用于格式化和输出应用逻辑组件提供的数据。良好定义的定界符指示了所提供的数据和表现逻辑放在模板中的位置。
    顶
    顶
    以下代码就是一个典型的Smarty模板,当然,名称其实也很奇怪,index.tpl,tpl可以理解为是一个模板,当然,这确实是一个Smarty所独有的模板。其实,很多时候,在写作的时候也可以有模板,也可以说是没有,但是,其实我们都应该发现并意识到,在觉得自己好像可以创造一点东西,特别是通过PHP不仅仅只是创造一堆所谓的开源网站,开源项目。其实并不是说开源就是一种无私分享自己技术的变相方式。PHP很多时候不仅仅被理解为是一种编程语言,确实它也可以被理解为是Linux系统下的一种脚本语言,跟Perl语言有点类似,当然,我们其实早就应该发现的一点就是,看似好像编程的时候也可以借用模板。其实所谓的Java中的Struts,Spring,Hibernate理论上来说也都是一种编程模板,是开发人员已经开发好了之后,方便所谓的代码民工进行所谓的机械化编程,编码的开始。代码民工其实并不应该是一种对于程序员的贬称,其实,这也说明了一个现实,软件开发的培训机构其实最开始鼓吹的年薪几十万,其实,这几十万真正能够做到的人,能够保持的人又有多少。如果没有兴趣,什么都是零,当然,或许,我们其实早就应该发现并意识到也许,很多时候,在高考填志愿的时候,计算机科学与技术好像是一个非常紧俏的的专业,跟英语系是一样的,但其实毕业之后转行干其他工作的也有很多很多。也许,其实我们最开始所坚持的东西,也必然因为这种坚持,而能够成就在我们愿意成就的世界里。
    <html>
    <head>
    <title>{$pagetitle}</title>
    </head>
    <body>
    {if $name eq “Kirk”}
    

Welcome back Captain!


    {else}
    

Swab the decks,mate!


    {/if}
    </body>
    </html>
    其实这个例子确实不难理解,首先,定界符(由大括号{}指示)用于告诉模板引擎要检查定界符之间的数据,并可能采取一些动作。最常见的是,此动作只是放置一个特定的变量值。例如,HTML标题标记中的$pagetitle变量指示了这个值(由逻辑部分传入)应该放在哪个位置上。再往下,又用定界符指示了要由引擎解析的if条件的开始和结束处。如果$name变量设置为Kirk,则显示一个特殊的消息;否则,显示默认消息。
    因为大多数模板化引擎解决方案(包括Smarty)提供的功能并非指示插入变量值,所以模板化引擎的框架必须能够完成大量最终对设计人员和开发人员隐藏的大量任务。毫不奇怪,最好通过面向对象编程来实现,从而可以得到封装。如下代码展示了如何使用Smarty结合逻辑层准备并提供之前的那个index.tpl模板。现在先不用担心这个Smarty类的位置,很快就会讲到这一点。在这个例子中,你要注意的是各层是完全分离的,还要理解这是如何实现的。
    <?php
    //引用了对应的Smarty类库。
    require(“Smarty.class.php”);
    //创建一个Smarty类的新的实例。
    $smarty=new Smarty;
    //赋予几个页面变量。其实也就是设定几个页面变量。
    $smarty->assign(“pagetitle”,”Welcome to the Starship.”);
    $smarty->assign(“name”,”Kirk”);
    //输出然后显示这个模板
    $smarty->display(“index.tpl”);
    ?>
    可以看到,所有实现细节都对开发人员和设计人员隐藏。
    顶
    顶
    Smarty是PHP的“半官方”的模板化引擎。它是在GNU宽通用公共许可下发布的,可能是最流行,功能最强大的PHP模板化引擎。其实,很多时候,开发人员和设计人员很多情况下无法通过自己的诸多努力尝试想要改变某一个软件开发项目。最终的目标不仅仅只是开发出项目,通过Smarty其实理论上可以做很多事。Smarty不仅仅只是让开发人员能够更加高效地开发PHP项目。也许,对于一般性的网页开发设计来说,或许ASP就已经够了。但其实,在能够通过ASP揣摩得到PHP真正值得推敲和琢磨的那些点和面的时候,我们不难发现,ASP之所以会被淘汰就是因为ASP将界面设计交给了HTML,而且所有的业务逻辑都很简单,看似简单中的直接好像证明了ASP跟PHP相比较而言的软弱性和无能性。之所以软弱,之所以无能,就是因为很多时候,作为一门简单的网页编程语言,最开始的时候确实是因为简单易学,所以ASP会流行。但是,ASP.NET的诞生其实已经说明并证明了很多事。很多通过自己现实中的诸多考虑和思索之后,程序员们,特别是一些优秀的老程序员通过PHP这一门编程语言开发了Smarty,所以,Smarty相比较而言就非常成熟,特别是在模板化开发和设计方面。其实,开发人员其实也是普通的人,通过学习,通过比较,发现很多所谓的PHP开发框架,说穿了其实都是用PHP开发出的模板。所以,我们都应该学会懂得珍惜并保有着我们内心中对于真正模板化开发框架的一种向往。所以,我们都应该懂得感谢那些曾经的,认真工作过的老程序员的心血成果。
    Smarty还提供了很多强大的功能。1.强大的表现逻辑。对于设计人员而言,他们可以很快地学会,而不需要预备的编程知识。2.模板编译。为减少开销,Smarty在默认情况下将模板转换为可比较的PHP脚本,使得后续的调用速度更快。Smarty还非常智能,在内容改变后可以重新编译。3.缓存。Smarty还提供了缓存模板的可选特性。4.高度可配置和可扩展。Smarty的面向对象架构允许修改和扩展其默认行为。5.安全。Smarty提供了很多安全特性,可以避免服务器和应用程序数据遭到设计人员有意或无意的破坏。当然,其实所有流行的模板化解决方案都遵循同样的一组相同的核心实现原则。与编程语言一样,学习了一种语言就可以更容易地掌握其他语言。
    当然了,Smarty模板和配置文件的四个目录这里介绍一下。
    templates。放置所有网站模板。
    configs。放置在特定网站中使用的所有特殊的Smarty配置文件。
    template_c。放置Smarty编译的所有模板。
    cache。在启用缓存特性的情况下,放置Smarty缓存的所有模板。
    虽然在默认情况下,Smarty认为这些目录与实例化Smarty类的脚本位于相同的目录,但建议将这些目录放在Web服务器文档根之外的位置。可以分别使用Smarty的$template_dir,$compile_dir,$config_dir和$cache_dir修改行为。所以,可以将其位置修改为:
    <?php
    //引用Smarty的类库。
    require(“Smarty.class.php”);
    //创建一个Smarty类的新的实例。
    $smarty=new Smarty;
    $smarty->template_dir=”/usr/local/lib/php/smarty/template_dir/”;
    $smarty->compile_dir=”/usr/local/lib/php/smarty/compile_dir/”;
    $smarty->config_dir=”/usr/local/lib/php/smarty/config_dir/”;
    $smarty->cache_dir=”/usr/local/lib/php/smarty/cache_dir/”;
    ?>
    顶
    顶
    使用Smarty只需要在执行脚本中使Smarty类库可用一般使用require()语句:
    require(“Smarty.class.php”);
    之后,就可以实例化Smarty类:
    $smarty=new Smarty;
    开始利用这个特性时所要做的工作只有这么多。如下代码给出了一个简单的设计模板。注意,模板中有两个变量:$title和$name。两个变量都放在大括号中,大括号是Smarty的默认定界符。这些定界符告诉Smarty要对定界符所包围的内容完成某些操作。在下面的这个例子中,唯一的动作就是用通过应用程序逻辑传入的相应值替代变量。不过,你很快将看到,Smarty还能够完成大量其他任务,例如执行表现逻辑和修改文本格式等。
    如下代码就是一个简单的Smarty设计模板(templates/welcome.tpl)
    <html>
    <head>
    <title>{$title}</title>
    </head>
    <body>
    


    Hi,{$name}.Welcome to the wonderful world of Smarty.
    


    </body>
    </html>
    还要注意,Smarty希望这个模板位于templates目录内,除非通过$template_dir修改了模板目录。
    如下代码给出相应的应用程序逻辑,它将适当的变量值传入Smarty模板。
    index.tpl模板的应用程序逻辑
    <?php
    require(“Smarty.class.php”);
    $smarty=new Smarty;
    //赋值给两个Smarty变量
    $smarty->assign(“name”,”Jason Gilmore”);
    $smarty->assign(“title”,”Smarty Rocks!”);
    //取得然后输出这个模板
    $smarty->display(“welcome.tpl”);
    ?>
    如上这个基本示例展示了Smarty能够完全分离Web应用程序逻辑层和表现层。但是,这只是Smarty全部特性集的一点皮毛。基于Smarty的脚本中都会用到display()这个方法,因为它负责获取和显示由template引用的模板。其形式为:
    void display(string template[,string cache_id[,string compile_id]])
    可选参数cache_id指定缓存标识符的名,另一个可选参数compile_id在维护同一页面的多个缓存时使用。其实,缓存这东西,在PHP开发项目的时候,其实我在PHPWIND开发论坛应用程序的时候就发现其实源代码中一直都有着cache这个文件夹。页面缓存对开发大型应用程序确实有帮助。毕竟,对于页面访问速度来说,有很多大型网站都有着极其严苛的控制,访问速度对于大型门户网站而言是非常重要,同时也非常关键的。其实就是靠着页面缓存来加速页面的加载速度。也许,对于PHP源码的热衷者来说,很多看似能够因为PHP源代码是看似开放,看似免费的。所以就忽略了对于PHP源码中每一个文件夹,其实都应该认真阅读一下,认真整理一下。也许,我们在我们能够适应开发文档或者是开发有关的电子书还有纸质书本的阅读过程中。我们都应该意识到,其实我们大脑内部,其实也是有着类似于缓存这样的缓冲之类的大脑皮层内部的褶皱,因为这些褶皱,所以,在我们需要某些知识点或者是知识面的时候,我们都能够通过这种缓存之类的东西获取并最终获得,然后,我们开始学会懂得通过源码来实现属于我们自己的个人站的理想的时候,我们就应该能够收获更多,同时也能够成长地更加成熟,适应了PHP开发框架的成熟。我们,在必经过的属于我们自己所总结的代码段和项目的时候,我们开始学会懂得通过我们自己的认真来对待计算机书籍,当然,也许,我们也应该需要通过更加深入地自学,更好地诠释出一个更加完满的我们自己。
    顶
    顶
    模板引擎的主旨是完全分离表现层和逻辑层。表现和逻辑很多时候看似好像因为一些特定的代码编写工具,当然,其实我最开始的时候在出版高专学习Dreamweaver的时候,我就有点惊喜地发现,原来那个时候ASP这一门网页编程语言看似好像能够将表现和逻辑混在一起,但其实,这种方式对于以后的再次开发或者是二次开发而言,是有着非常多的弊端存在的。其实,我们可以想见,如果在阅读书本的时候,发现书本上有很多重复或者是相同的东西,当然,这些相同的东西其实对于计算机专业硕士而言,很有可能是互相抄袭来抄袭去的,确实,计算机硕士其实说穿了就是因为要写出好的计算机相关的学术论文而存在的。我们其实都非常清楚的一点就是,我们能够通过我们自己的理解方式来理解PHP中的Smarty引擎。其实,引擎这种东西,顾名思义,就是有点类似于汽车引擎之类的东西,任何软件开发工具,如果脱离了编程语言,就开始变得非常奇怪的同时也附带着些许的晦涩和难懂。其实,我们都应该学会懂得通过我们自己的理解来更加好地驾驭好PHP这一门编程语言。框架说穿了,有很多也是有重复性,甚至是极度重复。当然,我们不仅仅只是因为最开始或许真的只能够做代码民工,如果,我们最终能够发现我们自己的兴趣爱好和我们自己的编程理想,其实,都不应该仅仅只是因为看似好像是互相冲突的。我们,确实,还是应该将编程归结于兴趣。所以,在能够实现自己的很多种看似有点复杂的理想面前,很多很枯燥乏味的编程语言的学习过程,各种的基础都开始能够成就为我们所想要得到或者是获取的那种样子。所以,我们开始觉得我们自己能够适应,但或许,这种适应不仅仅只是因为能够获得足够地平静,在编写代码中所能够适应的平静。Smarty开发人员在引擎中集成了一些简单但非常有效的应用程序逻辑。这似乎是一种理想的折衷,因为网站设计人员通常不是编程人员。(反之亦然)。Smarty的注释包围在定界标记{*和*}之间,可以包括一行或多行。以下是一个合法的Smarty注释:
    {* Some programming note *}
    当然,Smarty有一个不太传统的变量修饰符语法。当然,定界符用来指示所请求的变量输出,而在输出前,需要修饰的变量值后面可以跟一个竖线,再后面是修饰符命令,如下:
    {$var|modifier}
    capitalize函数把变量中所有单词的首字母变为大写。示例如下:
    $smarty=new Smarty;
    $smarty->assign(“title”,”snow expected in northeast”);
    $smarty->display(“article.tpl”);
    article.tpl模板包含:
    {title|capitalize}
    返回如下:
    Snow Expected In Northeast
    count_words函数统计变量中的单词总数。示例如下:
    $smarty=new Smarty;
    $smarty->assign(“title”,”Snow Expected in Northeast.”);
    $smarty->assign(“body”,”More than 12 inches of snow is expected to
    accumulate overnight in New York.”);
    $smarty->display(“countwords.tpl”);
    article.tpl模板包含:
    <strong>{$title}</strong>({$body|count_words}words)<br/>
    

{$body}


    这会返回:
    <strong>Snow Expected in Northeast</strong>(14 words)<br/>
    

More than 12 inches of snow is expected to accumulate overnight in New York.


    3.格式化日期
    date_format函数是PHPstrftime()函数的包装器,它将可以被strftime()解析的任何日期/时间格式字符串转换为某种特殊格式。下面是一个使用示例:
    $smarty=new Smarty;
    $smarty->assign(“title”,”Snow Expected in Northeast”);
    $smarty->assign(“filed”,”1172345525”);
    $smarty->display(“dateformat.tpl);
    article.tpl模板包含:
    <strong>{$title}</strong><br/>
    Submitted on: {$filed|date_format:”%B %e,$Y”}
    这会返回:
    <strong>Snow Expected in Northeast</strong><br/>
    Submitted on: June 24,2007
    顶
    顶
    4.赋默认值
    当应用层没有返回值时,default函数为指定特定变量的默认值提供了一种简单的方式。其实赋值这东西,在编程语言中其实可以被理解为是一种相等,就比如给变量赋值。等于号之前的是变量名称,等于号之后的就是变量被赋予的那个值。其实,在现实中的社会里,小孩子们最开始的时候在小学时期学习的就是加减乘除这类的看似很普通,看似很基础的数学。但,或许,这种数学对于以后中学时期学习初等数学,到大学时期学习高等数学都是有着非常大的帮助的。赋值,其实可以被理解为是一种自己给予自己的鼓励,或者是在编程的过程中遇到一些困难和挫折之后,该怎么去真正定位好自己,同时也在定位之余能够让自己彻底释放或者是发泄出来。不仅仅只是因为PHP尝试让赋值语句变得简单,在各种编程语言里,正因为有了赋值,正因为有了非常雷同的变量和变量类型,所以,编程语言就能够变得非常丰满。也许,以后或许会出现用中文编程的编程语言,也可能不是一门编程语言,是一个中文的开发程序的框架。中文编程,看似好像有点不够现实,但或许,只要高级程序员能够稍微认真一点,结合中国的实际开发出这种编程语言的话,那或许,不仅仅只是因为汇编语言能够给大量的编程语言以指导,我们,或许,真的应该沉默在我们愿意沉默的程序代码里,而不仅仅只是因为看似适应了这种沉默。例如:
    $smarty=new Smarty;
    $smarty->assign(“title”,”Snow Expected in Northeast”);
    $smarty->display(“default.tpl”);
    default.tpl模板包含:
    <strong>{$title}</strong><br/>
    Author:{$author|default:”Anonymous”}
    这会返回:
    <strong>Snow Expected in Northeast</strong><br/>
    Author:Anonymous
    5.删除标记符
    strip_tags函数删除变量字符串中的标记符。也许,在编程的时候你会感到烦躁或者是不安,也许是因为程序代码没有注释,或者是因为代码太难以阅读,当然,这个时候作为程序员,作为开发者的你可以选择删除部分代码,或者是加入一些属于你自己的有个性的代码。当然,前提是这段代码还是能够编译并解释通过。其实,很多时候HTML代码所无法给我们带来的东西,也许通过Smarty就能够立即实现,或者是类似于PHP一样地实现。例如:
    $smarty=new Smarty;
    $smarty->assign(“title”,”Snow<strong>Expected</strong> in Northeast”);
    $smarty->display(“striptags.tpl”);
    striptags.tpl模板包含:
    <strong>{$title|strip_tags}</strong>
    这会返回:
    <strong>Snow Expected in Northeast</strong>
    5.截取字符串
    truncate函数将变量字符串截取为指定数量的字符。虽然默认为80个字符,但可以通过提供一个输入参数来改变截取的长度。可以指定一个字符串(可选),追加到截取后的字符串后面,如省略号(...)。此外,可以指定到达指定的字符数限制后立即截取,或者还需要考虑单词的边界(参数为TRUE,则按确切的限制截取,FALSE则截取到达到限制后最近的单词边界)。例如:
    $summaries=array(
    “Snow expected in the Northeast over the weekend.”,
    “Sunny and warm weather expected in Hawaii.”,
    “Softball-sized hail reported in Wisconsin.”
    );
    $smarty=new Smarty;
    $smarty->assign(“summaries”,$summaries);
    $smarty->display(“truncate.tpl”);
    truncate.tpl模板包含:
    {foreach from=$summaries item=summary}
    {$smmary|truncate:35:”...”}<br/>
    {/foreach}
    这会返回:
    Snow expected in the Northeast...
    Sunny and warm weather expected...
    Softball-sized hail reported in...
    顶
首页 上一页[2] 本页[3] 下一页[4] 尾页[4] [收藏本文] 【下载本文】
  小说文学 最新文章
长篇小说《程咬金日记》寻出版、网剧、动漫
亲身经历我在泰国卖佛牌的那几年(转载)
噩梦到天堂——离婚四年成长史
午夜咖啡馆
原创长篇小说:城外城
长篇小说《苍天无声》打工漂泊望乡路底层小
郭沫若用四字骂鲁迅,鲁迅加一字回骂,世人
原创先秦历史小说,古色古香《玉之觞》
北京黑镜头(纪实文学)
长篇连载原创《黑潭》
上一篇文章      下一篇文章      查看所有文章
加:2021-06-29 10:19:09  更:2021-06-29 10:20:52 
 
古典名著 名著精选 外国名著 儿童童话 武侠小说 名人传记 学习励志 诗词散文 经典故事 其它杂谈
小说文学 恐怖推理 感情生活 瓶邪 原创小说 小说 故事 鬼故事 微小说 文学 耽美 师生 内向 成功 潇湘溪苑
旧巷笙歌 花千骨 剑来 万相之王 深空彼岸 浅浅寂寞 yy小说吧 穿越小说 校园小说 武侠小说 言情小说 玄幻小说 经典语录 三国演义 西游记 红楼梦 水浒传 古诗 易经 后宫 鼠猫 美文 坏蛋 对联 读后感 文字吧 武动乾坤 遮天 凡人修仙传 吞噬星空 盗墓笔记 斗破苍穹 绝世唐门 龙王传说 诛仙 庶女有毒 哈利波特 雪中悍刀行 知否知否应是绿肥红瘦 极品家丁 龙族 玄界之门 莽荒纪 全职高手 心理罪 校花的贴身高手 美人为馅 三体 我欲封天 少年王
旧巷笙歌 花千骨 剑来 万相之王 深空彼岸 天阿降临 重生唐三 最强狂兵 邻家天使大人把我变成废人这事 顶级弃少 大奉打更人 剑道第一仙 一剑独尊 剑仙在此 渡劫之王 第九特区 不败战神 星门 圣墟
  网站联系: qq:121756557 email:121756557@qq.com