0

SEO常用工具大全

Posted by Alan on October 31, 2014 in SEO |

本文介绍一些常用的SEO工具,内容基于Zac昝辉的《SEO实战密码:60天网站流量提高20倍》一书。

1.Xenu

Xenu (/ˈziːnuː/)是一款模拟蜘蛛爬行的英文软件,界面较为简单,输入一个网址(通常为网站首页)它会延着链接去爬行其它网址,这样就可以检查网站的可收录性以及有无错误链接。通过勾选Check external links可以爬行站外链接,如只需查看本站的链接请不要勾选。

下面Include / Exclude部分包含Consider URLs beginning with this as “internal”和Do not check any URLs beginning with this两个输入框,可用于仅查询固定子域名或分类等下面的链接。

Xenu运行完成后,会列出所有的错误链接来供站长参考,同时还可以将抓取的页面生成XML网站地图。

SEO检测工具Xenu

软件下载地址:http://home.snafu.de/tilman/xenulink.html

2.Alexa

Alexa是Amazon旗下的用于查询网站排名等相关数据的工具,站长们经常使用这一免费工具查看自己和竞争对手的网站排名来进行SEO优化时的参考。早期Alexa主要通过它自身的工具条来进行数据收集,现在又加入从各ISP等处购买的数据。

当然Alexa的数据只能作为参考,且不说存在作弊的作法,其数据源本身也不能保证足够大,不过作为一款免费工具,它提供了站长跳出率、各国和全球排名、主要搜索关键词、流量来源、用户年龄、收入、地域等数据,还是可以作为不错的参考的。

亚马逊Alexa排名数据

 

Tags: , ,

0

购物季准备贴士和商家清单

Posted by Alan on October 28, 2014 in 电商经验, 翻译社区 |

Yahoo Small Business(简称YSB,呵呵这名字挺逗Why SB?)的老大Amit Kumar在Entrepreneur上写了一篇讨论Holiday Season常见的一些错误 。文章内容源自Amit的切身体验以及YSB的客服和商户开发团队。在为购物季做准备的时候,请牢记这几点建议,在文章结尾处可下载一份清单供您核对。

1. 广告和营销并驾齐驱

中小企业主需要为购物季调整广告支出和营销策略以保持竞争力。如果平常你不做PPC广告,在购物季时建议开启,如果平常你已经做PPC广告,请保证广告支出来维持竞争力。不要忘了,你的竞争对手也会花费更多的广告费。

在营销方面,提前细致规划好促销邮件和社交策略。在购物季期间,通常会发出比平常更多的邮件,尤其是在Black Friday和Cyber Monday前后。

2. 过多的结账步骤

在购物季期间, 减少客户在结账期间填写和阅读的内尤为重要,应当重新调整一下优先级。你可能要去除掉用户注册(如果你的网站重复购买率低的话),去除掉积分政策、其它网站的广告、banner以及其它与购物季无关却占据页面空间的内容。

3. 在11月进行网站更新

请勿在11月中旬后对网站进行更新或修改,包括代码更新,新功能上线,域名系统调整等影响网站可用性和速度的更新。所有的修改都应在Black Friday之前上线并测试能正常使用。

4. 缺乏指引

盲目进入的客户需要指引,将客户引向他们要购买的产品极为重要。礼品指南、店铺精选等都有助于客户发现他们所要购买的产品。还需要专门创建一个针对购物季的问答页面来回答客户会遇到的常见问题。

5. 不明晰的发货期限和退货政策
如果客户觉得不能准备收到礼品的话,他们会放弃购物车中的商品。为购物车制定一个发货截止日期并在网站和邮件中予以强调。

明确的退换货政策也相当重要,给顾客比平常更多充分的时间来进行退货和换货。这样顾客在购买时会更有安全感,你的团队也会有更充足的时间来满足客户的需求。在购物季期间可以推出一个延长退货政策。

通过避免上述错误,你在购物季销售过程中会更加的如鱼得水。预祝商祺!

2014年购物季确认清单

原文地址:http://yahoosmallbusiness.tumblr.com/post/100522475359/entrepreneur-posts-ysb-tips-on-holiday-readiness

Tags: , , ,

0

SEOVIP Zac培训之链接建设

Posted by Alan on October 26, 2014 in SEO |

本文内容总结自SEOVIP第四期培训中的外链建设部分的内容,主讲人为Zac,他是在国内较早从事SEO工作的,是早期影响力较大的SEO论坛点石互动的创始人之一,个人博客为seozac.com。很多SEO从业人员应该都知道此人,不仅因为他较早进入行业,还因为他翻译的”SEO艺术”一书,他所著的”SEO实战密码”更是请到了Google反垃圾的老大Matt Cutts作序。

闲话少说,以下是对Zac在去年SEOVIP第四期培训中有关链接建设讲课中的个人总结:

大型网站

这次讲课所列举的例子包括中文站美丽说和英文Amazon.com站,都是大型网站,前者整体架构并没有采用传统的SEO友好的面包屑导航同时采用了一定的cloaking技术在搜索引擎和客户访问时返回了不同的信息,这点在后者身上更为明显,亚马逊英文站大量的使用了canonical标签使得客户和搜索引擎访问时得到的链接完全不同,一方面保证了对客户的相关追踪,另一方面也在搜索引擎抓取时返回了包含关键词的url。美丽说采用了扁平化的结构,通过动态的sitemap页以及良好的互链(页面相互推荐)保证了充分的收录,而亚马逊采用了良好的分类层级以及业界领先的商品推荐引擎来实现充分收录。内容上美丽说作为一个以图片为主的网站在同一页面上采用更多的推荐来保持丰富的内容,亚马逊则除了描述等信息外包含了大量的评论信息。

对于以上所说的这种大型站点链接建设上更为重要的内链上的合理安排,因为大型站点通常拥有较高的知名度以及众多的合作伙伴等相关资源使其很容易获得较多的外链。合理地安排内部链接会让网站得到更充分的收录。

外链建设

  • 外部链接建设方面首先是在论坛、博客上发外链、写软文,这里建议重质不重量,一个网站的投票权是有限的,所以在同一站点上发布大量的外链实际上并没有太大的作用。
  • 购买链接虽然被搜索引擎所明令禁止,但通过线下交易实际上并不会被搜索引擎发现。建议不要在常见的交易平台上购买外链,选择一些外链较少权重较高的站点来购买外链。
  • 开放目录无疑是高质量的外部链接,在提交时不要添加商业性的内容也不写什么业界最好等相关信息,目录提交审核不通过的话可以考虑申请成为开放目录相应分类的编辑,在适当的时候再行提交。也可以通过自建目录在其他站长提交收录时与其互换链接的方式来进行外链建设。
  • 通过在线小工具来进行外链建设。可选择一些与行业有关又常用的一些小工具来获得外链,如在线单位(如英寸->厘米)转换,消耗卡路里计算器,贷款、汇款计算器等在线工具。
  • 通过插件模板获取外链。比如制作Wordpress模板然后免费分享,在底部放上链接,大多数用户可能都不会去删除这个链接,这里锚文本不建设放自己的品牌(放的话建议不要高于此类外链的20%),可以用自己的名字或其它内容作为锚文本。
  • 通过资源性内容获取外链。比如十大最xx的xx,如何… …,怎样… …以及深度分析文章(即肉容较长的文章),通常之类文章会获得较多的关注和转载。
  • 通过幽默、有趣、好玩的内容来获取外链。除了一些段子外也可以有一些如输入用户姓名替换著名新闻事件(如颁发了xx奖)的主人公名称,上传图片然后放到杂志封面等等。
  • 利益交换。除了普通的交换外链外,可以有通过送礼品让别人在博客上添加外链,甚至是发现其它网站的漏洞告知对方换取链接等方法。
  • 挖掘用户资源。送小礼品外,举办进行评选之类的活动,以学生为例,举办一个比赛活动必然会获得家长及其亲友的关注,还可请家长或学生写感想进行评选,这些都可能获得分享并获取到外链。

Tags: , , ,

0

PHP与数据库

Posted by Alan on October 21, 2014 in PHP |

PHP支持哪些数据库

PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Sybase,DB2,Oracle,PostgreSQL,Access等,这些数据库PHP都能够安装扩展来支持,一般情况下常说的LAMP架构指的是:Linux、Apache、MySql、PHP,因此Mysql数据库在PHP中的应用非常广泛,我们会进一步简单地了解Mysql的操作方法。

数据库扩展

PHP中一个数据库可能有一个或者多个扩展,其中既有官方的,也有第三方提供的。像Mysql常用的扩展有原生的mysql库,也可以使用增强版的mysqli扩展,还可以使用PDO进行连接与操作。

不同的扩展提供基本相近的操作方法,不同的是可能具备一些新特性,以及操作性能可能会有所不同。

mysql扩展进行数据库连接的方法:

$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');

mysqli扩展:

$link = mysqli_connect('mysql_host', 'mysql_user', 'mysql_password');

PDO扩展

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);

 

连接MySQL数据库

PHP要对数据库进行操作,首先要做的是与数据库建立连接,通常我们使用mysql_connect函数进行数据库连接,该函数需要指定数据库的地址,用户名及密码。

$host = 'localhost';
$user = 'code1';
$pass = '';
$link = mysql_connect($host, $user, $pass);

PHP连接数据库的方式类似于直接在命令行下通过进行连接,类似:mysql -hlocalhost -ucode1 -p,当连接成功以后,我们需要选择一个操作的数据库,通过mysql_select_db函数来选择数据库。

mysql_select_db('code1');

通常我们会先设置一下当前连接使用的字符编码,一般的我们会使用utf8编码。

mysql_query("set names 'utf8'");

通过上面的步骤,我们就与数据库建立了连接,可以进行数据操作了。

执行MySQL查询

在数据库建立连接以后就可以进行查询,采用mysql_query加sql语句的形式向数据库发送查询指令。

$res = mysql_query('select * from user limit 1');

对于查询类的语句会返回一个资源句柄(resource),可以通过该资源获取查询结果集中的数据。

$row = mysql_fetch_array($res);
var_dump($row);

默认的,PHP使用最近的数据库连接执行查询,但如果存在多个连接的情况,则可以通过参数指令从那个连接中进行查询。

$link1 = mysql_connect('127.0.0.1', 'code1', '');
$link2 = mysql_connect('127.0.0.1', 'code1', '', true); //开启一个新的连接
$res = mysql_query('select * from user limit 1', $link1); //从第一个连接中查询数据

 

插入新数据到MySQL中

当我们了解了如何使用mysql_query进行数据查询以后,那么类似的,插入数据其实也是通过执行一个sql语句来实现,例如:

$sql = "insert into user(name, age, class) values('李四', 18, '高三一班')";
mysql_query($sql); //执行插入语句

通常数据都是存储在变量或者数组中,因此sql语句需要先进行字符串拼接得到。

$name = '李四';
$age = 18;
$class = '高三一班';
$sql = "insert into user(name, age, class) values('$name', '$age', '$class')";
mysql_query($sql); //执行插入语句

在mysql中,执行插入语句以后,可以得到自增的主键id,通过PHP的mysql_insert_id函数可以获取该id。

$uid = mysql_insert_id();

这个id的作用非常大,通常可以用来判断是否插入成功,或者作为关联ID进行其他的数据操作。

取得数据查询结果

通过前面的学习,我们发现PHP操作数据库跟MySql客户端上操作极为相似,先进行连接,然后执行sql语句,再然后获取我们想要的结果集。

PHP有多个函数可以获取数据集中的一行数据,最常用的是mysql_fetch_array,可以通过设定参数来更改行数据的下标,默认的会包含数字索引的下标以及字段名的关联索引下标。

$sql = "select * from user limit 1";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);

可以通过设定参数MYSQL_NUM只获取数字索引数组,等同于mysql_fetch_row函数,如果设定参数为MYSQL_ASSOC则只获取关联索引数组,等同于mysql_fetch_assoc函数。

$row = mysql_fetch_row($result);
$row = mysql_fetch_array($result, MYSQL_NUM); //这两个方法获取的数据是一样的
$row = mysql_fetch_assoc($result);
$row = mysql_fetch_array($result, MYSQL_ASSOC);

如果要获取数据集中的所有数据,我们通过循环来遍历整个结果集。

$data = array();
while ($row = mysql_fetch_array($result)) {
    $data[] = $row;
}

 

查询分页数据

上面,我们了解到通过循环可以获取一个查询的所有数据,在实际应用中,我们并不希望一次性获取数据表中的所有数据,那样性能会非常的低,因此会使用翻页功能,每页仅显示10条或者20条数据。

通过mysql的limit可以很容易的实现分页,limit m,n表示从m行后取n行数据,在PHP中我们需要构造m与n来实现获取某一页的所有数据。

假定当前页为$page,每页显示$n条数据,那么m为当前页前面所有的数据,既$m = ($page-1) * $n,在知道了翻页原理以后,那么我们很容易通过构造SQL语句在PHP中实现数据翻页。

$page = 2;
$n = 2;
$m = ($page - 1) * $n;
$sql = "select * from user limit $m, $n";
$result = mysql_query($sql);
//循环获取当前页的数据
$data = array();
while ($row = mysql_fetch_assoc($result)) {
    $data[] = $row;
}

在上面的例子中,我们使用了$m与$n变量来表示偏移量与每页数据条数,但我们推荐使用更有意义的变量名来表示,比如$pagesize, $start, $offset等,这样更容易理解,有助于团队协作开发。

更新与删除数据

数据的更新与删除相对比较简单,只需要构建好相应的sql语句,然后调用mysql_query执行就能完成相应的更新与删除操作。

$sql = "update user set name = '曹操' where id=2 limit 1";
if (mysql_query($sql)) {
    echo '更新成功';
}

同样的删除可以使用类似以下的代码:

$sql = "delete from user where id=2 limit 1";
if (mysql_query($sql)) {
    echo '删除成功';
}

对于删除与更新操作,可以通过mysql_affected_rows函数来获取更新过的数据行数,如果数据没有变化,则结果为0。

$sql = "update user set name = '曹操' where id=2 limit 1";
if (mysql_query($sql)) {
    echo mysql_affected_rows();
}

 

关闭MySQL连接

当数据库操作完成以后,可以使用mysql_close关闭数据库连接,默认的,当PHP执行完毕以后,会自动的关闭数据库连接。

mysql_close();

虽然PHP会自动关闭数据库连接,一般情况下已经满足需求,但是在对性能要求比较高的情况下,可以在进行完数据库操作之后尽快关闭数据库连接,以节省资源,提高性能。

在存在多个数据库连接的情况下,可以设定连接资源参数来关闭指定的数据库连接。

$link = mysql_connect($host, $user, $pass);
mysql_close($link);

Tags: , ,

0

PHP异常处理

Posted by Alan on October 21, 2014 in PHP |

抛出一个异常

从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被执行。

既然抛出异常会中断程序执行,那么为什么还需要使用异常处理?

异常抛出被用于在遇到未知错误,或者不符合预先设定的条件时,通知客户程序,以便进行其他相关处理,不至于使程序直接报错中断。

当代码中使用了try catch的时候,抛出的异常会在catch中捕获,否则会直接中断。

 

1、基本语法
try{
//可能出现错误或异常的代码
//catch表示捕获,Exception是php已定义好的异常类
} catch(Exception $e){
//对异常处理,方法:
//1、自己处理
//2、不处理,将其再次抛出
}
2、处理处理程序应当包括:
Try – 使用异常的函数应该位于 “try”  代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
Throw – 这里规定如何触发异常。注意:每一个 “throw” 必须对应至少一个 “catch”,当然可以对应多个”catch”
Catch – “catch” 代码块会捕获异常,并创建一个包含异常信息的对象。

//创建可抛出一个异常的函数
function checkNum($number){
     if($number>1){
         throw new Exception("异常提示-数字必须小于等于1");
     }
     return true;
 }
 
//在 "try" 代码块中触发异常
 try{
     checkNum(2);
     //如果异常被抛出,那么下面一行代码将不会被输出
     echo '如果能看到这个提示,说明你的数字小于等于1';
 }catch(Exception $e){
     //捕获异常
     echo '捕获异常: ' .$e->getMessage();
 }

上面代码将获得类似这样一个错误:

捕获异常:: 异常提示-数字必须小于等于1

例子解释:

上面的代码抛出了一个异常,并捕获了它:

创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
在 “try” 代码块中调用 checkNum() 函数。
checkNum() 函数中的异常被抛出
“catch” 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息

异常处理类

PHP具有很多异常处理类,其中Exception是所有异常处理的基类。

Exception具有几个基本属性与方法,其中包括了:

message 异常消息内容
code 异常代码
file 抛出异常的文件名
line 抛出异常在该文件的行数

其中常用的方法有:

getTrace 获取异常追踪信息
getTraceAsString 获取异常追踪信息的字符串
getMessage 获取出错信息

如果必要的话,可以通过继承Exception类来建立自定义的异常处理类。

//自定义的异常类,继承了PHP的异常基类Exception
class MyException extends Exception {
    function getInfo() {
        return '自定义错误信息';
    }
}

try {
    //使用异常的函数应该位于 "try"  代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
    throw new MyException('error');//这里规定如何触发异常。注意:每一个 "throw" 必须对应至少一个 "catch",当然可以对应多个"catch"
} catch(Exception $e) {//"catch" 代码块会捕获异常,并创建一个包含异常信息的对象
    echo $e->getInfo();//获取自定义的异常信息
    echo $e->getMessage();//获取继承自基类的getMessage信息
}

捕获异常信息

在了解了异常处理的基本原理之后,我们可以通过try catch来捕获异常,我们将执行的代码放在try代码块中,一旦其中的代码抛出异常,就能在catch中捕获。

这里我们只是通过案例来了解try catch的机制以及异常捕获的方法,在实际应用中,不会轻易的抛出异常,只有在极端情况或者非常重要的情况下,才会抛出异常,抛出异常,可以保障程序的正确性与安全,避免导致不可预知的bug。

一般的异常处理流程代码为:

try {
    throw new Exception('wrong');
} catch(Exception $ex) {
    echo 'Error:'.$ex->getMessage().'<br>';
    echo $ex->getTraceAsString().'<br>';
}
echo '异常处理后,继续执行其他代码';

 

获取错误发生的所在行

在异常被捕获之后,我们可以通过异常处理对象获取其中的异常信息,前面我们已经了解捕获方式,以及获取基本的错误信息。

在实际应用中,我们通常会获取足够多的异常信息,然后写入到错误日志中。

通过我们需要将报错的文件名、行号、错误信息、异常追踪信息等记录到日志中,以便调试与修复问题。

Tags: ,

0

PHP图像处理

Posted by Alan on October 20, 2014 in PHP |

GD库简介

GD指的是Graphic Device,PHP的GD库是用来处理图形的扩展库,通过GD库提供的一系列API,可以对图像进行处理或者直接生成新的图片。

PHP除了能进行文本处理以外,通过GD库,可以对JPG、PNG、GIF、SWF等图片进行处理。GD库常用在图片加水印,验证码生成等方面。

PHP默认已经集成了GD库,只需要在安装的时候开启就行。

header("content-type: image/png");
$img=imagecreatetruecolor(100, 100);
$red=imagecolorallocate($img, 0xFF, 0x00, 0x00);
imagefill($img, 0, 0, $red);
imagepng($img);
imagedestroy($img);

绘制线条

要对图形进行操作,首先要新建一个画布,通过imagecreatetruecolor函数可以创建一个真彩色的空白图片:

$img = imagecreatetruecolor(100, 100);

GD库中对于画笔所用的颜色,需要通过imagecolorallocate函数进行分配,通过参数设定RGB的颜色值来确定画笔的颜色:

$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);

然后我们通过调用绘制线段函数imageline进行线条的绘制,通过指定起点跟终点来最终得到线条。

imageline($img, 0, 0, 100, 100, $red);

线条绘制好以后,通过header与imagepng进行图像的输出。

header("content-type: image/png");
imagepng($img);

最后可以调用imagedestroy释放该图片占用的内存。

imagedestroy($img);

通过上面的步骤,可以发现PHP绘制图形非常的简单,但很多时候我们不只是需要输出图片,可能我们还需要得到一个图片文件,可以通过imagepng函数指定文件名将绘制后的图像保存到文件中。

imagepng($img, 'img.png');

在图像中绘制文字

GD库可以进行多种图形的基本操作,常用的有绘制线条,背景填充,画矩形,绘制文字等。

跟绘制线条类似,首先需要新建一个图片与初始化颜色。

$img = imagecreatetruecolor(100, 100);
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);

然后使用imagestring函数来进行文字的绘制,这个函数的参数很多:imagestring ( resource $image , int $font , int $x , int $y , string $s , int $col ),可以通过$font来设置字体的大小,x,y设置文字显示的位置,$s是要绘制的文字,$col是文字的颜色。

imagestring($img, 5, 0, 0, "Hello world", $red);
header("content-type: image/png");
imagepng($img);
imagedestroy($img);

 

输出图像文件

前面我们已经了解到,通过imagepng可以直接输出图像到浏览器,但是很多时候,我们希望将处理好的图像保存到文件,以便可以多次使用。通过指定路径参数将图像保存到文件中。

$filename = 'img.png';
imagepng($img, $filename);

使用imagepng可以将图像保存成png格式,如果要保存成其他格式需要使用不同的函数,使用imagejpeg将图片保存成jpeg格式,imagegif将图片保存成gif格式,需要说明的是,imagejpeg会对图片进行压缩,因此还可以设置一个质量参数。

$filename = 'img.jpg';
​imagejpeg($img, $filename, 80);

 

生成图像验证码

简单的验证码其实就是在图片中输出了几个字符,通过我们前面章节讲到的imagestring函数就能实现。

但是在处理上,为了使验证码更加的安全,防止其他程序自动识别,因此常常需要对验证码进行一些干扰处理,通常会采用绘制一些噪点,干扰线段,对输出的字符进行倾斜、扭曲等操作。

可以使用imagesetpixel绘制点来实现噪点干扰,但是只绘制一个点的作用不大,因此这里常常会使用循环进行随机绘制。

for($i=0;$i<50;$i++) {
  imagesetpixel($im, rand(0, 100) , rand(0, 100) , $black); 
  imagesetpixel($im, rand(0, 100) , rand(0, 100) , $green);
}

 

给图片添加水印

给图片添加水印的方法一般有两种,一种是在图片上面加上一个字符串,另一种是在图片上加上一个logo或者其他的图片。

因为这里处理的是已经存在的图片,所以可以直接从已存在的图片建立画布,通过imagecreatefromjpeg可以直接从图片文件创建图像。

$im = imagecreatefromjpeg($filename);

创建图像对象以后,我们就可以通过前面的GD函数,绘制字符串到图像上。如果要加的水印是一个logo图片,那么就需要再建立一个图像对象,然后通过GD函数imagecopy将logo的图像复制到源图像中。

$logo = imagecreatefrompng($filename);
imagecopy($im, $logo, 15, 15, 0, 0, $width, $height);

当将logo图片复制到原图片上以后,将加水印后的图片输出保存就完成了加水印处理。

imagejpeg($im, $filename);

Tags: ,

0

PHP日期和时间

Posted by Alan on October 20, 2014 in PHP |

取得当前的Unix时间戳

UNIX 时间戳(英文叫做:timestamp)是 PHP 中关于时间与日期的一个很重要的概念,它表示从 1970年1月1日 00:00:00 到当前时间的秒数之和。

PHP提供了内置函数 time() 来取得服务器当前时间的时间戳。那么获取当前的UNIX时间戳就很简单了。

$time = time();

echo $time;//1396193923,这个数字表示从1970年1月1日 00:00:00 到我输出这个脚本时经历了1396193923秒

 

取得当前的日期

php内置了date()函数,来取得当前的日期。

函数说明:date(时间戳的格式, 规定时间戳【默认是当前的日期和时间,可选】)

返回值:函数日期和时间

例子:

//date函数,第二个参数取默认值的情况
echo date("Y-m-d");//2014-03-30

//date函数,第二个参数有值的情况
echo date("Y-m-d",'1396193923');//2014-03-30,1396193923表示2014-03-30的unix时间戳

取得日期的Unix时间戳

UNIX 时间戳(英文叫做:timestamp)是 PHP 中关于时间与日期的一个很重要的概念,它表示从 1970年1月1日 00:00:00 到当前时间的秒数之和。

PHP提供了内置函数strtotime实现功能:获取某个日期的时间戳,或获取某个时间的时间戳。例如:

echo strtotime('2014-04-29');//1398700800,这个数字表示从1970年1月1日 00:00:00 到2014年4月29号经历了1398700800秒

echo strtotime('2014-04-29 00:00:01');//1398700801,这个数字表示从1970年1月1日 00:00:00 到2014-04-29 00:00:01时经历了1398700801秒

大家发现上面的规律了吗,其实strtotime('2014-04-29')相当于strtotime('2014-04-29 00:00:00')

 

将格式化的日期字符串转换为Unix时间戳

strtotime函数预期接受一个包含美国英语日期格式的字符串并尝试将其解析为 Unix 时间戳。

函数说明:strtotime(要解析的时间字符串, 计算返回值的时间戳【默认是当前的时间,可选】)
返回值:成功则返回时间戳,否则返回 FALSE

比如

echo strtotime("now");//相当于将英文单词now直接等于现在的日期和时间,并把这个日期时间转化为unix时间戳。这个效果跟echo time();一样。
echo strtotime("+1 seconds");//相当于将现在的日期和时间加上了1秒,并把这个日期时间转化为unix时间戳。这个效果跟echo time()+1;一样。
echo strtotime("+1 day");//相当于将现在的日期和时间加上了1天。
echo strtotime("+1 week");//相当于将现在的日期和时间加上了1周。
echo strtotime("+1 week 3 days 7 hours 5 seconds");//相当于将现在的日期和时间加上了1周3天7小时5秒。

格式化格林威治(GMT)标准时间

gmdate 函数能格式化一个GMT的日期和时间,返回的是格林威治标准时(GMT)。

举个例子,我们现在所在的中国时区是东八区,领先格林威治时间8个小时,有时候也叫GMT+8,那么服务器运行以下脚本返回的时间应该是这样的:
当前时间假定是2014-05-01 15:15:22
echo date('Y-m-d H:i:s', time()); //输出为:2014-05-01 15:15:22 
echo gmdate('Y-m-d H:i:s', time()); //输出为:2014-05-01 07:15:22 因为格林威治时间是现在中国时区的时间减去8个小时,所以相对于现在时间要少8个小时

Tags: , ,

0

PHP文件处理

Posted by Alan on October 20, 2014 in PHP |

读取文件内容

PHP具有丰富的文件操作函数,最简单的读取文件的函数为file_get_contents,可以将整个文件全部读取到一个字符串中。

$content = file_get_contents('./test.txt');

file_get_contents也可以通过参数控制读取内容的开始点以及长度。

$content = file_get_contents('./test.txt', null, null, 100, 500);

PHP也提供类似于C语言操作文件的方法,使用fopen,fgets,fread等方法,fgets可以从文件指针中读取一行,freads可以读取指定长度的字符串。

$fp = fopen('./text.txt', 'rb');
while(!feof($fp)) {
    echo fgets($fp); //读取一行
}
fclose($fp);

 

$fp = fopen('./text.txt', 'rb');
$contents = '';
while(!feof($fp)) {
    $contents .= fread($fp, 4096); //一次读取4096个字符
}
fclose($fp);

使用fopen打开的文件,最好使用fclose关闭文件指针,以避免文件句柄被占用。

判断文件是否存在

一般情况下在对文件进行操作的时候需要先判断文件是否存在,PHP中常用来判断文件存在的函数有两个:is_filefile_exists.

$filename = './test.txt';
if (file_exists($filename)) {
    echo file_get_contents($filename);
}

如果只是判断文件存在,使用file_exists就行,file_exists不仅可以判断文件是否存在,同时也可以判断目录是否存在,从函数名可以看出,is_file是确切的判断给定的路径是否是一个文件。

$filename = './test.txt';
if (is_file($filename)) {
    echo file_get_contents($filename);
}

更加精确的可以使用is_readableis_writeable在文件是否存在的基础上,判断文件是否可读与可写。

$filename = './test.txt';
if (is_writeable($filename)) {
    file_put_contents($filename, 'test');
}
if (is_readable($filename)) {
    echo file_get_contents($filename);
}

写入内容到文件

与读取文件对应,PHP写文件也具有两种方式,最简单的方式是采用file_put_contents。

$filename = './test.txt';
$data = 'test';
file_put_contents($filename, $data);

上例中,$data参数可以是一个一维数组,当$data是数组的时候,会自动的将数组连接起来,相当于$data=implode('', $data);

同样的,PHP也支持类似C语言风格的操作方式,采用fwrite进行文件写入。

$fp = fopen('./test.txt', 'w');
fwrite($fp, 'hello');
fwrite($fp, 'world');
fclose($fp);

 

取得文件的修改时间

文件有很多元属性,包括:文件的所有者、创建时间、修改时间、最后的访问时间等。

fileowner:获得文件的所有者
filectime:获取文件的创建时间
filemtime:获取文件的修改时间
fileatime:获取文件的访问时间

其中最常用的是文件的修改时间,通过文件的修改时间,可以判断文件的时效性,经常用在静态文件或者缓存数据的更新。

$mtime = filemtime($filename);
echo '修改时间:'.date('Y-m-d H:i:s', filemtime($filename));

 

取得文件的大小

通过filesize函数可以取得文件的大小,文件大小是以字节数表示的。

$filename = '/data/webroot/usercode/code/resource/test.txt';
$size = filesize($filename);

如果要转换文件大小的单位,可以自己定义函数来实现。

function getsize($size, $format = 'kb') {
    $p = 0;
    if ($format == 'kb') {
        $p = 1;
    } elseif ($format == 'mb') {
        $p = 2;
    } elseif ($format == 'gb') {
        $p = 3;
    }
    $size /= pow(1024, $p);
    return number_format($size, 3);
}

$filename = '/data/webroot/usercode/code/resource/test.txt';
$size = filesize($filename);

$size = getsize($size, 'kb'); //进行单位转换
echo $size.'kb';

值得注意的是,没法通过简单的函数来取得目录的大小,目录的大小是该目录下所有子目录以及文件大小的总和,因此需要通过递归的方法来循环计算目录的大小。

删除文件

跟Unix系统命令类似,PHP使用unlink函数进行文件删除。

unlink($filename);

删除文件夹使用rmdir函数,文件夹必须为空,如果不为空或者没有权限则会提示失败。

rmdir($dir);

如果文件夹中存在文件,可以先循环删除目录中的所有文件,然后再删除该目录,循环删除可以使用glob函数遍历所有文件。

foreach (glob("*") as $filename) {
   unlink($filename);
}

Tags: ,

0

创意美食分享

Posted by Alan on October 20, 2014 in 个人随笔 |

马来西亚的一位妈妈发觉女儿总是不喜欢吃饭,于是常常变成花样给她做“童话餐”,女儿胃口大增,每次都是吃的一干二净。看得我口水流出来了[馋嘴]有时间的妈妈们不妨考尝试下。

Tags: ,

0

给女儿一句恋爱忠告

Posted by Alan on October 20, 2014 in 个人随笔 |

Buzzfeed上面采访了24位女性,让她们作为过来人给自己的女儿留一句恋爱的忠告,节选部分以备以后使用:
找一个觉得你不化妆都很漂亮的人

初次心碎你可能觉得天崩地裂生命终结,其实不是… 还有更好的在等着你

感情也许变幻莫测,但家人却永远伴你身边

如果你的家人和朋友都不喜欢你那位,听听他们的意见(他们可能是对的)

约会的事儿别太担心,活出自己独特的一面就好,只要活的耀眼,你们总会找到彼此

如果连你自己都没把自己当回事,那没人会把你当回事

找一个能接受你缺点的人

如果你想取悦所有人,那你自己将永不会开心

不要把快乐的源依附在别人身上,快乐是自己给自己的

Tags:

Copyright © 2012-2014 Alan Hou All rights reserved.