10位顶级PHP大师的开发原则

  1. 在合适的时候使用PHP – Rasmus Lerdorf

  没有谁比PHP的创建者Rasmus Lerdorf明白PHP用在什么地方是更合理的,他于1995年发布了PHP这门语言,从那时起,PHP就像燎原之火,烧遍了整个开发阵营,改变了互联网的世界。可是,Rasmus并不是因此而创建PHP的。PHP是为了解决web开发者的实际问题而诞生的。

  和许多开源项目一样,PHP变得流行,流行的动机并不能用正常的哲学来进行解释,甚至流行得有些孤芳自赏。它完全可以作为一个案例,一个解决各种Web问题的工具需求所引起的案例,因此当PHP刚出现的时候,这种工具需求全部聚焦到PHP的身上。

  但是,你不能奢望PHP可以解决所有问题。Lerdorf是第一个承认PHP只是一种工具的人,并且PHP也有很多力所不能及的情况。

  根据工作的不同来选择合适的工具。我跑了很多家公司,为了说服他们部署和使用PHP,但是这并不意味着PHP对所有问题都适用。它只是可以一个解决大部分问题的front-end脚步语言。

  作为一个web开发者,尝试用PHP解决所有问题是不科学的,同时也会浪费你的时间。当PHP玩不转的时候,不要犹豫,试用一下其他的语言吧。

  2. 使用多表存储提高规模伸缩性 – Matt Mullenweg

  没有人愿意质疑Matt Mullenweg在PHP方面的权威性,他开发了这个星球上最流行的blog系统,(依靠一个强大的社区力量支持): WordPress. 创建Wordpress以后,Matt和他的团队启动了WordPress.com平台,一个基于WordPress MU的免费blog站点。现在,Wordpress.com已经拥有大约400万用户, 这些用户每天提供超过 140,000篇的日志。

  如果有人知道如何让网站的规模伸缩自如,这个人一定是Matt Mullenweg。2006年的时候 Matt对Wordpress的数据结构进行了前瞻性的改进,并且解释了为什么Wordpress MU对每个blog使用独立的MYSQL表格, 而不是把所有的blog数据都塞进一个巨大的表格。

  我们测试过这个方法,但是发现如果要扩展它的伸缩性,代价太高。如果用一个整体的数据结构,在大流量面前,你将会面临服务器 硬件的问题。在MU里面。用户们都被分布到独立的表格当中,并且可以轻易地组织起来。举个例子,WordPress.com把用户的数据分散存储到4096个数据库中,这些数据库可以分散大规模的数据访问,实现流量和压力分流。

  数据表的可迁移性让代码(blog)可以运行得更快,并且让系统具备更强的伸缩性。依靠强大的缓存策略和灵活的数据库运用策略, Matt向人们展示了时下最流行的Facebook和Wordpress.com都可以在PHP下稳定运行,并且处理惊人的访问量。

  3. 千万不要相信用户 – Dave Child

  Dave Child是Added Bytes (previously ilovejackdaniels.com) 网站的核心人物,这个网站以他出色的《cheat sheets for many programming languages》而闻名。 Dave为很多英国的公司服务,并且已经在编程世界里树立起相当的权威。

  Dave为PHP开发者提供了很多深谋远虑的建议,并总结成了《writing secure code in PHP》:千万不要相信你的用户,他们甚至可能会伤害你。

  有一条web开发的基本原则,我重复多少遍都觉得不够,那就是:千万不要相信你的用户,同时要假设你网站中的每个数据单元都是从用户那里收集来的恶意代码。很多时候,你必须用javascript在客户端检验表单提交过来的内容, 如果你习惯了如此,那么,这是一个好习惯。如果安全性对你来说很重要,这就是最重要最需要学习的原则。

  Dave目前正致力于为它的《Writing Secure PHP》系列书籍整理实例,书的最后他说:

  最后,变得偏执一点吧。除非你认为你的站点永远不会受到攻击,否则就正视所有的问题,当问题真正发生的时候,你的情况会变得很糟。你需要把每个用户都看成会带来一场攻防站的黑客,想尽一切办法来保护站点的安全,同时想好相应问题的解决方案。

  4. 多使用PHP缓存 – Ben Balbo

  Ben Balbo开发了Site Point,一个为developers和designers提供指导的网站。他是墨尔本PHP开发和开源俱乐部的成员, 因此他对PHP有一定的了解,同时对PHP caching有一定的想法和经验。

  如果你拥有一个访问量很大,但更新并不频繁的站点(比如blog,基于某种CMS),或许它需要进行一些改造,这些改造不会花费太多的时间,但是对性能有突出的贡献。 如果要为一个复杂/更新频率很快的站点建立缓存机制,过程可能会很曲折,但是好处也是显而易见的。

  PHP缓存技术有很多种,Ben为我们推荐了如下一些:

  ◆缓存函数的运行结果

  ◆设置过期时间

  ◆缓存IE下载的文件

  ◆模板缓存技术

  ◆Cache_Lite

  由于PHP作为动态语言的特性,缓存机制对于更新频率并不快的站点来说非常重要。

  5. 使用IDE, Templates和Snippets加速PHP开发 – Chad Kieffer

  当Chad Kieffer从UI设计和数据库优化的工作中抽身出来的时候,他会在他的博客2 tablespoons上分享很多技术经验。由于Chad多方面的全面发展,他经常可以发现其他程序员不能发现的问题,并形成相关经验,尤其是他开发网站的方法。他参与了网站开发的各个环节,因此他的建议对于提高网站开发的大局观非常有用。

  Chad认为使用Eclipse PDT(Eclipse’s PHP development package) 这样的IDE,同时使用一些模板技术和开源项目可以有效地提高PHP的开发速度。

  紧凑的计划,长长的to do lists以及deadlines让开发人员非常苦闷。不过有些功能,比如Eclipse Templates,可以有效减少编码的时间和出错的几率。

  通常来说,任何项目都可以自动化,自动化程度越高, 你完成项目的时间就越短。花时间来开发使用频率很高的框架和模板,将会节省你以后更多时间。同时,使用像Eclipse and the PDT package这样的IDE,你会发现效率得到明显提高,IDE可以自动闭合,补全分号并且可以在本地debug。

  6. 利用好PHP的过滤函数 – Joey Sochacki

  或许Joey Sochacki并不像Matt Mullenweg那样有名 ,但他也是一个经验丰富的开发者,并且通过他的博客Devolio分享了很多技术经验

  Joey发现在编写php代码的过程中有很多地方需要进行过滤,但却并没有太多的coder关注php的内置过滤函数。

  过滤数据是我们经常需要做的事情,但是很多功能丰富的PHP内置过滤函数却不为人知。使用类似filter_* 的PHP内置函数,我们几乎可以处理所有的过滤任务,包括数据类型验证/URL/email和IP地址验证/特殊字符处理等等。

  过滤是一件复杂的事情,但是我相信joey的发现会给你很多启发,让你认识到PHP强大的过滤功能。

  7. 使用PHP框架 – Josh Sharp

  对于是否应该使用Zend, CakePHP, Code Igniter, 或者 其他PHP框架,一直存在着很多争议,但是在web开发者的心中,他们有自己衡量的标准。

  Josh Sharp自己创建了一家提供面包和黄油服务的网站,因此他对于使用PHP框架来开发网站有一定的经验。他认为使用一个PHP框架来进行项目开发(use a PHP framework ),可以有效地节省时间,并且减少出错的几率。为什么?因为他觉得PHP实在是太好上手了。

  PHP的易于使用有时候也有缺陷,因为并不严格的语法,经常会导致很多错误代码的诞生。但如果使用一个PHP框架,出错的几率就会大大减少。

  PHP框架可以让你的代码结构更加规范,并且节省大量时间。

  8. 不要使用PHP框架 – Rasmus Lerdorf

  与Josh的观点恰恰相反,PHP的鼻祖Rasmus Lerdorf却认为最好不要使用PHP框架,为什么?因为不基于框架的PHP性能更好。Rasmus在Drupalcon 2008的演讲上,用“Hello World”的例子来对比了一些框架PHP和简单PHP之间的性能,结果显示框架PHP的性能要远远落后。

  9. 使用批处理 – Jack D. Herrington

  Jack Herrington对PHP世界并不陌生, 并且为大名鼎鼎的IBM developerWorks贡献过超过30篇的专搞, 同时出版过《PHP Hacks》的书,因此他是一个真正的专家。

  Herrington推荐使用批处理和Cron来代替那些可以运行在后台的程序脚步,Web用户并不愿意在线等待你的处理过程,所以有些事情更适合放到后台来处理。

  诚然,在某些情况下,这有点大材小用了,但是你可以清楚地看到,使用Cron, MySQL, PHP面向对象的方法以及Pear::DB这些便捷的工具来创建一个批处理工具并不是一件复杂的事情。

  Jack认为使用cron, PHP和MySQL在后台处理一些任务,比起多进程的业务逻辑要划算得多。

  两种方法我都尝试过,我认为Cron非常符合”Keep It Simple, Stupid” (KISS) 的原则,它让后台处理变得简单。与多进程的业务逻辑相比,它没有内存 溢出的风险。你可以创建一个简单的批处理脚本,并且在cron中运行,这个脚本会定时检查是否有任务需要处理,处理完之后就会自动退出,因此你不用担心是否有进程卡壳,或者陷入死循环。

  10. 及时启用错误报告 – David Cummings

  David Cummings有一个专门提供CMS软件服务的公司 ,并且获得过几次奖 ,他有非常丰富的PHP开发经验。David曾经写过《two PHP tips he wished he’d learned in the beginning》,其中一点就是:及时启用错误报告,这会节省大量的时间。

  我告诉人们,最重要的事情就是最大程度地开启PHP的错误报告,为什么?因为PHP可能会隐藏很多小问题:

  ◆变量没有预定义

  ◆在代码片段中引用了不可用的变量

  ◆使用了未定义的常量这些因素看起来并不是什么大事,除非你在使用面向对象的方法编写一些类库。通常,关闭错误报告将可能使你付出更大的成本来维护你的代码。

  错误报告可以帮你轻易地找到代码的问题所在,如果错误报告的等级够高,细微的错误都能被立即发现,帮助你节省整体debug的时间。

PJBlog日志删除后访问页面出错的解决方案

  今天查看我这个博客的访问来源和访问入口时点击了其中一个被访页面,发现出现错误:[quote]错误 '80020009'
/blog/article.asp,行 33
[/quote]
  仔细一想,这个文章是在原来的服务器上用上个版本时忘了开启目录写权限,发布文章时文章没显示出来就多发布了几次后来删除掉的,但由于前几天转移服务器时原来的数据没及时备份出来,把老的数据处理了下,这时删除掉的不是原来删除掉的文章,导致搜索引擎收录也变化了,以至于我把备份恢复后访问到的文章是原来已经删除掉的文章。
  知道问题的起因,那解决起来就容易了。初步判断是程序里判断文章存在与否的语句出现问题。找到article.asp,从行33开始,相关代码如下:[code] If (log_View.EOF or log_View.bof) or (log_View(“log_IsDraft”) = True And not stat_Admin And memName <> log_View(“log_Author”)) Then
log_View.Close
showmsg “错误信息”, “不存在当前日志!<br/><a href=””default.asp””>单击返回</a>”, “ErrorIcon”, “”
End If
[/code]
果然,33行这个判断语句有业务逻辑上的错误。这里的意思是判断文章存在与否及是否有阅读权限。由于VBS里的Or是要把所有的条件都执行一次的,所以虽然前面已经能判断出记录不存在,但后面还是继续做判断,而在记录不存在的情况下再读取其中的字段值就会出错了。修改下判断的流程,做两步判断,先判断记录是否存在,然后再判断是否有阅读权限。修改后的代码如下:[code] If log_View.EOF or log_View.bof Then
log_View.Close
showmsg “错误信息”, “不存在当前日志!<br/><a href=””default.asp””>单击返回</a>”, “ErrorIcon”, “”
End If

If log_View(“log_IsDraft”) = True And not stat_Admin And memName <> log_View(“log_Author”) Then
log_View.Close
showmsg “错误信息”, “不存在当前日志!<br/><a href=””default.asp””>单击返回</a>”, “ErrorIcon”, “”
End If
[/code]
  测试通过。
  错误问题是解决,但随后我又考虑到一个问题,像这种从搜索引擎过来的,都是找相关信息的,如果遇到这样删除掉的文章,或者像我这样文章还在,只是id变了,最终看到的却只是文章不存在的提示,多不友好。我想可以通过来源获取相关关键字,然后搜索本站,找到相关的文章供来访者参考。由于时间关系,具体实现代码有空再写。

PHP数组的Hash冲突实例

上一篇文章, 我介绍了一个利用Hash冲突(碰撞)来对各种语言(包括,PHP, Java, Ruby等等)实施拒绝服务攻击的可能, 但是没有给出实例, 文章发出后, @Ferrari同学给出了一个另外一篇文章Supercolliding a PHP array, 文章中作者介绍了一种基于PHP的冲突实例, 以及带来的性能恶化对比. 我就借花献佛, 翻译给大家看看.

你知道不知道, 插入65536个经过构造的键值的元素到PHP数组, 会需要耗时30秒以上? 而一般的这个过程仅仅需要0.1秒..

请看如下的例子:

  1. &lt;?php
  2. $size = pow(2, 16);
  3. &nbsp;
  4. $startTime = microtime(true);
  5. $array = array();
  6. for ($key = 0, $maxKey = ($size - 1) * $size; $key &lt;= $maxKey; $key += $size) {
  7. &nbsp;&nbsp;&nbsp;&nbsp;$array[$key] = 0;
  8. }
  9. $endTime = microtime(true);
  10. echo '插入 ', $size, ' 个恶意的元素需要 ', $endTime - $startTime, ' 秒', &quot; &quot;;
  11. &nbsp;
  12. $startTime = microtime(true);
  13. $array = array();
  14. for ($key = 0, $maxKey = $size - 1; $key &lt;= $maxKey; ++$key) {
  15. &nbsp;&nbsp;&nbsp;&nbsp;$array[$key] = 0;
  16. }
  17. $endTime = microtime(true);
  18. echo '插入 ', $size, ' 个普通元素需要 ', $endTime - $startTime, ' 秒', &quot; &quot;;

上面的例子, 在我的机器上的执行结果如下:

  1. 插入 65536 个恶意的元素需要 43.1438360214 秒
  2. 插入 65536 个普通元素需要 0.0210378170013

这个差别是不是很夸张?!

我在上一篇文章中介绍过, 经过特殊构造的键值, 使得PHP每一次插入都会造成Hash冲突, 从而使得PHP中array的底层Hash表退化成链表:

Hash collision

这样在每次插入的时候PHP都需要遍历一遍这个链表, 大家可以想象, 第一次插入, 需要遍历0个元素, 第二次是1个, 第三次是3个, 第65536个是65535个, 那么总共就需要65534*65535/2=2147385345次遍历&hellip;.

&nbsp;

那么, 这个键值是怎么构造的呢?

在PHP中,如果键值是数字, 那么Hash的时候就是数字本身, 一般的时候都是, index &amp; tableMask. 而tableMask是用来保证数字索引不会超出数组可容纳的元素个数值, 也就是数组个数-1.

PHP的Hashtable的大小都是2的指数, 比如如果你存入10个元素的数组, 那么数组实际大小是16, 如果存入20个, 则实际大小为32, 而63个话, 实际大小为64. 当你的存入的元素个数大于了数组目前的最多元素个数的时候, PHP会对这个数组进行扩容, 并且从新Hash.

现在, 我们假设要存入64个元素(中间可能会经过扩容, 但是我们只需要知道, 最后的数组大小是64, 并且对应的tableMask为63:0111111), 那么如果第一次我们存入的元素的键值为0, 则hash后的值为0, 第二次我们存入64, hash(1000000 &amp; 0111111)的值也为0, 第三次我们用128, 第四次用192&hellip; 就可以使得底层的PHP数组把所有的元素都Hash到0号bucket上, 从而使得Hash表退化成链表了.

当然, 如果键值是字符串的话, 就稍微比较麻烦一些了, 但是PHP的Hash算法是开源的, 已知的, 所以有心人也可以做到

通过构造Hash冲突实现各种语言的拒绝服务攻击

上周的时候Dmitry突然在5.4发布在即的时候, 引入了一个新的配置项:

Added max_input_vars directive to prevent attacks based on hash collision

这个预防的攻击, 就是”通过调用Hash冲突实现各种语言的拒绝服务攻击漏洞”(multiple implementations denial-of-service via hash algorithm collision).

攻击的原理很简单, 目前很多语言, 使用hash来存储k-v数据, 包括常用的来自用户的POST数据, 攻击者可以通过构造请求头, 并伴随POST大量的特殊的”k”值(根据每个语言的Hash算法不同而定制), 使得语言底层保存POST数据的Hash表因为”冲突”(碰撞)而退化成链表.

这样一来, 如果数据量足够大, 那么就可以使得语言在计算, 查找, 插入的时候, 造成大量的CPU占用, 从而实现拒绝服务攻击.

PHP5.4是通过增加一个限制来尽量避免被此类攻击影响:

  1.   - max_input_vars - specifies how many GET/POST/COOKIE input variables may be
  2.     accepted. default value 1000

 

目前已知的受影响的语言以及版本有::

Java, 所有版本

JRuby <= 1.6.5

PHP <= 5.3.8, <= 5.4.0RC3

Python, 所有版本

Rubinius, 所有版本

Ruby <= 1.8.7-p356

Apache Geronimo, 所有版本

Apache Tomcat <= 5.5.34, <= 6.0.34, <= 7.0.22

Oracle Glassfish <= 3.1.1

Jetty, 所有版本

Plone, 所有版本

Rack, 所有版本

V8 Javascript Engine, 所有版本

不受此影响的语言或者修复版本的语言有::

PHP >= 5.3.9, >= 5.4.0RC4

JRuby >= 1.6.5.1

Ruby >= 1.8.7-p357, 1.9.x

Apache Tomcat >= 5.5.35, >= 6.0.35, >= 7.0.23

Oracle Glassfish, N/A (Oracle reports that the issue is fixed in the main codeline and scheduled for a future CPU)

CVE: CVE-2011-4885 (PHP), CVE-2011-4461 (Jetty), CVE-2011-4838 (JRuby), CVE-2011-4462 (Plone), CVE-2011-4815 (Ruby)

原文: http://www.ocert.org/advisories/ocert-2011-003.html

2011 年 20 个最棒的免费 HTML5 网站模板

  HTML5 现在很火你知道吗,如果不知道你就比我小编辑还 out 了,别再觉得 HTML5 为时尚早了,现在开始学才不晚。

1. Free Website Template Slider Typography

2. Free Communication HTML5 wesite template

3. HTML5 website template for airline company

4. TheHoleInOne HTML5 template

5.Free Science HTML5 template

6.&nbsp; Free HTML5 Template For Hosting&nbsp; Website

7. CowboyUp HTML5 Template

8. HTML5 Templates For Real Estate Websites

9. HTML5 Portfolio Website Template

10. Website Template For Business Company

11. BoldAs HTML5 Template

12. HTML5 Music Website Template

13. HTML5 Template For Design Company Website


14. ArchiteXtrue HTML5 Template

15. Eductation Website Template For Learn Center

16. Static Facebook template For Music Band Page

&nbsp;17) Free Travel Website Template

18) Free Business Website Template

19) Free Website Template Web Design Studio

20) Free Music Website Template

在php中使用mysqli中的预处理和事务处理语句操作MySql

使用mysqli中的预处理和事务处理语句,效率和安全都比mysql有保障

预处理:
prepare($sql); //放到数据库

$stmt->bind_param(“sdis”,$name,$price,$num,$desn); //给占位符传值,类型-变量(不能是值)

$name=”zhangsan”;
$price=56.56;
$num=66;
$desn=”good”;

$stmt->execute(); //执行

echo “最后ID”.$stmt->insert_id;
$stmt->close();

/*=================select语句=================*/

$sql=”select id,name,price,num,desn from shops where id>?”; //准备一条语句放到服务器中

$stmt=$mysqli->prepare($sql); //放到数据库

$stmt->bind_param(“i”,$id); //给占位符传值,类型-变量(不能是值)

$stmt->bind_result($id,$name,$price,$num,$desn); //绑定结果集

$id=99;

$stmt->execute(); //执行

$stmt->store_result(); //一次性讲结果都取过来,才能移动指针和获取总数

//字段信息
$result=$stmt->result_metadata();

while($field=$result->fetch_field()){
echo $field->name;
}
echo “
“;

//记录信息
$stmt->data_seek(2);

while($stmt->fetch()){
echo “$id–$name–$price–$num–$desn
“;
}
echo “记录总数:”.$stmt->num_rows;

$stmt->free_result();

$stmt->close();

?>

事务处理:

set_charset(“utf8″); //设置字符集

$mysqli->autocommit(0); //关闭自动提交

$error=true;
$price=50;
$sql=”Update zhanghaodb set yue=yue-{$price} where name=’zhangsan’”;
$result=$mysqli->query($sql);

if(!$result){
$error=false;
echo “从张三转出失败
”;
}else{
if($mysqli->affected_rows==0){
$error=false;
echo “张三的钱没有变化”;
}else{
echo “张三的钱转出成功
”;
}
}

$sql=”Update zhanghaodb set yue=yue+{$price} where name=’lisi’”;
$result=$mysqli->query($sql);

if(!$result){
$error=false;
echo “从李四转入失败
”;
}else{
if($mysqli->affected_rows==0){
$error=false;
echo “李四的钱没有变化”;
}else{
echo “李四的钱转入成功
”;
}
}

if($error){
echo “转账成功!”;
}else{
echo “转账失败!”;
$mysqli->rollback(); //回滚
}

$mysqli->autocommit(1); //开启自动提交
$mysqli->close();
?>

一次执行多条SQL语句:

50;”;
$sqls.=”delete from shops where id < 20″; if($mysqli->multi_query($sqls)){
echo “多条语句执行成功!
”;
echo “最后插入的ID:”.$mysqli->insert_id.”
”;
//echo “影响的行数:”.$mysqli->affected_rows; //不准确!
}else{
echo “ERROR”.$mysqli->errno.”—”.$mysqli->error;
}

/*===========有结果集:select===========*/
$sqls=”select current_user();”;
$sqls.=”desc shops;”;
$sqls.=”select * fron shops”;

if($mysqli->multi_query($sqls)){
echo “多条语句执行成功!
”;
do{
$result=$mysqli->store_result(); //获取结果集

echo ‘

’;
echo ‘
’;
while($field=$result->fetch_field()){
echo ‘

’;
}
echo ‘

’;

while($row=$result->fetch_assoc()){
echo ‘

’;
foreach($row as $col){
echo ‘

’;
}
echo ‘

’;
}
echo ‘

’.$field->name.’
’.$col.’ 

’;

if($mysqli->more_results()){ //判断还有没有结果集
echo “

”;
}

}while($mysqli->next_result()); //取得下一个结果集
}else{
echo “ERROR”.$mysqli->errno.”—”.$mysqli->error;
}

$mysqli->close();
?>

15本Web开发人员应该拥有的免费电子书籍

  当今互联网已经成为每一个人的信息知识来源。假如你想学习任何事情,可以很容易在互联网上轻松找到相关的信息,即使它是很简单的事情。在互联网上有成千上万的教程和指南可以用来学习与工作相关的技术和内容。

  Web开发人员同样也经常通过互联网获取关于HTML和编码的相关知识。为了帮助这些开发人员,以下是我们收集的一些优秀电子书供大家学习。

1. HTML5 Quick Learning Guide

如果您想学习HTML5,这本电子书将帮助您学习所有HTML5的基本标签元素。

2. Head First HTML with CSS and XHTML

有了这本电子书,你可以使用HTML和CSS技术轻松地创建基于标准的网页。

3. Best Practices for Developing a Web Site

这是一个很好的电子书,将引导你建立一个网站和计划项目,无论你正在开发一个内部网站或外包项目。

4. HTML Wtf?

这本书简要概述了由HTML5带来的变化。

5. HTML And XHTML

一个了解HTML和XHTML的简单而全面的指南。

6. Javascript Programming for The Absolute Beginner

对JavaScript不了解?不要担心,这本书将帮助你学习JavaScript,即使你不知道任何关于JavaScript的知识。

7. Dive into Accessibility

这本电子书回答了一些关于如何建设一个网站的简单问题。

8. Getting Real

这本电子书介绍了在建设一个网站时需要注意的一些问题。

9. Web Design in a Nutshell

这本书包含了CSS与XHTML编码和Web设计所有相关的信息。

10. Foundations of Ajax

本书介绍了Ajax技术到现有应用或新开发应用程序所需要所有工具。

11. Up to Speed on HTML5 and CSS 3

介绍关于新兴的HTML5和CSS3标准。

12. Learning PHP 5

这本将帮助你学习PHP5拥有的一些高级功能,如面向对象功能和对XML与Web Services的支持等。

13. 20 Things I Learned about Browsers and The Web

这本书包含了所有你想了解的关于网站、Cookie和历史记录等知识。

14. Web Style Guide: 3rd Edition

这本书将告诉你如何使你的网站更容易让大家使用。

15. Essential Javascript and JQuery Design Patterns

通过这本电子书,你将学习到如何使用Javascript和jQuery设计模式。

  有时间再帮大家收集下载地址。

刷百度下拉框的关键词的一些技巧

百度下拉框百度下推荐菜单地效果。这中间有一些技巧:

所以在设置引导关键词得时候用:关键词+品牌词公司名称-特定字符或号码地形式。
1.词得排序:关键词排前面品牌词公司名放后面这是百度下拉框词条得最基本得特征。只有这一步做对了才有可能出现在百度下拉框。但是量太少了也不行
2.有得人认为刷新次数越多就越好。这其实是一个错误地想法因为这存在一个过量地问题。因为这样得话百度就认为关注度不高当然不会推荐进去至于如何掌握正确地量这里就不多说了这不是一两句话说地清楚的,自己也做优化有一段时间了有一些经验之谈也有实际地案例,有兴趣可以咨询。量要把握适中。

就算好不容易做上去了对推广自身地业务也没很大地帮助所以在选词得时候不要太主观地去选择一些搜索量大得词和关注度高地词,
3.选词:劝大家一句。有地词难度大做上去不容易。这些词搜索量是大但是搜索这些词得人能成为您地客户得比例却很少,这样就发了精力却又得不到好得效果,举个例子:比如你一家济宁的网络公司如果济宁这个词得搜索量是大,但是搜济宁这个词得又有多少是来找网络方面地服务地呢,所以在选词方面一定要站在客户地角度或者说把你自己当做一个你得客户当你需要这样地产品或服务得时候,会怎么去搜索这样就更有针对性!但,4月份改版后,刷的多,反而百度不让出现了,可见百度增加了个观察期。也就是点击量太大,就会进入观察期。所以这也是为什么部分客户在我跟他设置点击量的时候说不要设置太多的原因。
那么,如何设置呢?
第一种方法、根据指数比例设置。
首先,我们要了解我们要刷的词每天到底有多少人在搜索。
例如,我们要做养猪这个词,那么,先打开:
http://index.baidu.com ,输入百度下拉框、百度相关搜索淡淡的的点点滴滴的摆动相关搜索,鼠标移动到上面,可以看到每日的指数。
指数就是每天有多少人在搜索。从指数中,发现:百度下拉框、百度相关搜索这个词,一天大概是300多人搜索。
第一种方法:用300指数乘以 30% -50% 的比例去设置,即点击数设置为 150 – 250 。
第二种方法、根据主词已存在的相关词的指数设置。
我们要了解下,他的相关搜索词,有多少指数。

Apache 虚拟目录配置方法

在httpd.conf中添加:
[html]Alias /pic “D:/server/wamp/www/pic/”
<Directory “D:/server/wamp/www/pic/”>
Options Indexes FollowSymLinks MultiViews
AllowOverride all
order allow,deny
Allow from all
</Directory> [/html]或者将以上代码保存到一个配置文件中,放到alias目录下,然后在httpd.conf中添加Include “D:/server/wamp/alias/*”
  以上方法设置的虚拟目录是全局的,所有站点都有效,如果要针对某个站点,要把代码写到相应的<VirtualHost >节点中。
  注意事项:虚拟目录后面不能加斜线“/”。否则会无法找到。

Apache VirtualHost 虚拟主机配置方法

  这几天在捣鼓PHP,第一件事就是配置Apache环境,期间并不是很顺利,所以将最终结果记录下来,以便哪天忘了可以再次参考。
  系统环境:Windows Server 2008,WAMPServer 2.1(包含Apache 2.2.17)。
  先打开Apache安装目录,然后按下面方法配置:
  1、编辑conf目录下的httpd.conf文件,查找Include conf/extra/httpd-vhosts.conf,把前面注释符号“#”删掉。
  2、编辑conf/extra/httpd-vhosts.conf,添加如下代码
[html]<VirtualHost *:80>
ServerAdmin webmaster@yourdomain.com
DocumentRoot “D:/site/work/wwwroot/”
ServerName test.my
ErrorLog “logs/test_e.log”
CustomLog “logs/test.log” common
</VirtualHost>

<VirtualHost *:80>
ServerAdmin webmaster@yourdomain.com
DocumentRoot “D:/server/wamp/www/”
ServerName localhost
ServerAlias work.my
ErrorLog “logs/localhost_e.log”
CustomLog “logs/localhost.log” common
</VirtualHost>
[/html]也可将代码直接加在httpd.conf中
  以上文件配置了两个虚拟主机,也就是常说的站点。
  解释下几个参数:NameVirtualHost *:80和中 的*为当前服务器IP,如果有固定IP可以用IP把*替换掉;ServerName这个是主域名,DocumentRoot是该站点对应的根目录;ServerAlias可以用来绑定更多的域名。未绑定的域名会默认解析到到一个站点上。
  如果站点目录所在磁盘分区是NTFS格式,光有这个文件还不行,访问站点test.my时会出现403错误,还需要编辑httpd.conf文件来开启权限
  找到<Directory “D:/server/wamp/www/”>代码若干</Directory>
(我WAMP安装在D:/server/wamp下),在这个节点后面加上:[html]<Directory “D:/site/work/wwwroot”>
#Options Indexes FollowSymLinks
AllowOverride all
order Allow,Deny
Allow from all
</Directory>[/html]其中options indexs FollowSymLinks选项是当无默认文档时允许列出站点文件列表。
  保存后重启Apache服务。至此,大功告成。