Web安全技术(3)-浏览器的跨域访问 - 不急不徐,持之以恒。 - BlogJava

mikel阅读(965)

来源: Web安全技术(3)-浏览器的跨域访问 – 不急不徐,持之以恒。 – BlogJava

一、浏览器介绍

对于Web应用来说,浏览器是最重要的客户端。

目前浏览器五花八门多得不得了,除了Chrome、IE、Firefox、Safari、Opera这些国外的浏览器外,百度、腾讯、360、淘宝、搜狗、傲游之类的,反正能做的都做了。

浏览器虽然这么多,但浏览器内核主要就以下4种:

  1. Trident:IE使用的内核。
  2. Gecko:Firefox使用的内核。
  3. WebKit:Safair和Chrome使用的内核。WebKit由苹果发明,Chrome也用了,但是Google又开发了V8引擎替换掉了WebKit中的JavaScript引擎。
  4. Presto:Opera使用的内核。

国内的浏览器基本都是双核浏览器,使用基于WebKit的内核高速浏览常用网站,使用Trident内核兼容网银等网站

二、同源策略

同源策略是浏览器最基本的安全策略,它认为任何站点的内容都是不安全的,所以当脚本运行时,只被允许访问来自同一站点的资源。

同源是指域名、协议、端口都相同。

如果没有同源策略,就会发生下面这样的问题:

恶意网站用一个iframe把真实的银行登录页放到他的页面上,当用户使用用户名密码登录时,父页面的JavaScript就可以读取到银行登录页表单中的内容。

甚至浏览器的1个Tab页打开了恶意网站,另一个Tab页打开了银行网站,恶意网站中的JavaScript可以读取到银行网站的内容。这样银行卡和密码就能被轻易拿走。

三、跨域访问

由于同源策略的原因,浏览器对跨域访问做了很多限制,但有时我们的确需要做跨域访问,那要怎么办?主要有以下几种情况:

1. iframe的跨域访问

同域名下,父页面可以通过document.getElementById(‘_iframe’).contentWindow.document访问子页面的内容,但不同域名下会出现类似下面的错误:

Uncaught SecurityError: Blocked a frame with origin “http://a.com” from accessing a frame with origin “http://b.com”. Protocols, domains, and ports must match.

有两种解决方法:

1). 当主域名相同,子域名不同时,比较容易解决,只需设置相同的document.domain即可。

如http://a.a.com/a.html使用iframe载入http://b.a.com/b.html,且在a.html中有Javascript要修改b.html中元素的内容时,可以像下面的代码那样操作。

a.html

<html>
   <head>
     <script>
       document.domain = 'a.com';
       function changeIframeContent() {
         var _iframe = document.getElementById('_iframe');
         var _p = _iframe.contentWindow.document.getElementById('_p');
         _p.innerHTML = 'Content from a.html';
       }
     </script>
   </head>
   <body>
     <iframe id="_iframe" src="http://b.a.com/demo/iframe/subdomain/b.html"></iframe>
     <br>
     <input type="button" value="Change iframe content" onclick="changeIframeContent();"/>
   </body>
 </html> 

b.html

<html>
   <head>
     <script>
       document.domain = 'a.com';
     </script>
   </head>
   <body>
     <p id="_p">b.html</p>
   </body>
 </html> 

2). 当主域名不同时,就非常麻烦了。大致的方法像下面描述的那样:

  • a.com下有a.html;
  • a.html创建iframe加载b.com下的b.html,可在加载b.html时通过?或#将参数传递到b.html中;
  • b.html加载后,可以通过提取location.search或location.hash中的内容获取a.html传过来的参数;
  • b.html创建一个iframe,加载a.com下的c.html,并且参数也通过?或#传给c.html;
  • 因为c.html和a.html是相同域名,所以c.html可以使用parent.parent访问到a.html的对象,这样也就可以将b.html需要传递的参数传回到a.html中。

2. Ajax的跨域访问

Ajax主要通过XMLHttpRequest对象实现,但是如果通过XMLHttpRequest访问不同域名下的数据,浏览器会出现类似下面的错误:

XMLHttpRequest cannot load http://b.com/demo/iframe/ajax/b.html. No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://a.com’ is therefore not allowed access.

这时可由以下两种方法解决:

1). 使用<script>代替XMLHttpRequest,也就是JSONP的方法。利用<script>标签的src下加载的js不受同源策略限制,并且加载后的js运行在当前页面的域下,所以可自由操作当前页面的内容。

下面的代码演示了在a.com下的a.html通过b.com下的b.js中的内容来更新自身的p标签。

a.html

<html>
   <head>
     <script>
       function update_p (content) {
         document.getElementById("_p").innerHTML = content;
       }
       function getFromB() {
         var _script = document.createElement("script");
         _script.type = "text/javascript";
         _script.src = "http://b.com/demo/ajax/b.js";
         document.getElementsByTagName("head")[0].appendChild(_script);
       }
     </script>
   </head>
   <body>
     <p id="_p">a.html</p>
     <input type="button" value="Get from b.com" onclick="getFromB()"/>
   </body>
 </html> 

b.js

update_p("content from b.js"); 

在实际使用中,通常a.html会将update_p以callback参数名传递给b.com的服务器,服务器动态生成数据后,再用callback参数值包起来作为响应回传给a.html。

2). 在b.com的服务器返回信息中增加以下头信息:

  • Access-Control-Allow-Origin: http://a.com
  • Access-Control-Allow-Methods: GET

此时浏览器便允许a.com读取使用GET请求b.com的内容。

对于flash来说,会要求在网站根目录下放一个名为crossdomain.xml的文件,以指明允许访问的域名来源。文件中的内容类似下面的样子:

<cross-domain-policy>
   <allow-access-from domain="*.a.com" />
 </cross-domain-policy> 

3. 使用HTML5的postMessage方法实现跨域访问

HTML5增加了跨文档消息传输,下面的例子实现了使用postMessage在不同域间传递消息:

a.html

<html>
   <head>
     <script>
       function update_b () {
         var _iframe = document.getElementById("_iframe");
 	_iframe.contentWindow.postMessage("content from a.html", "http://b.com");
       }
     </script>
   <head>
   <body>
     <iframe id="_iframe" src="http://b.com/demo/html5/b.html"></iframe>
     <br>
     <input type="button" value="Update b.html" onclick="update_b()"></input>
   </body>
 </html> 

b.html

<html>
   <head>
     <script>
       window.addEventListener("message", function (event) {
         document.getElementById("_p").innerHTML = event.data;
       }, false);
     </script>
   </head>
   <body>
     <p id="_p">b.html</p>
   </body>
 </html> 

在postMessage中要指定接收方的域名,如果发现目标页面的域名不正确,将抛出类似下面这样的错误:

Failed to execute ‘postMessage’ on ‘DOMWindow’: The target origin provided (‘http://c.com’) does not match the recipient window’s origin (‘http://b.com’).

浏览器对跨域访问的限制是出于安全考虑的,所以在使用一些方法实现跨域访问时要特别小心。

微信订阅号:
源文地址:http://blog.gopersist.com/2015/04/22/web-security-3/

分享一个德州扑克的算法 - archy_yu - 博客园

mikel阅读(1000)

来源: 分享一个德州扑克的算法 – archy_yu – 博客园

德州扑克想必很多人都玩过,当然对于新手需要说明的是,德州指的是德克萨斯州,而不是山东德州。

这几个月一直在做一个德州扑克的服务器,分享下在计算最大牌型,比牌逻辑的算法和洗牌的方法,希望对大家有帮助。

首先我们定义一下Poker类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Poker
{
    private String tag; // 图片扑克花色的表示(代表的是红桃、黑桃,梅花、方块
    private int num; // 表示扑克牌面的大
    public Poker(String tag, int num)
    {
        this.num = num;
        this.tag = tag;
    }
    public int getNum()
    {
        return num;
    }
    public void setNum(int num)
    {
        this.num = num;
    }
    public void setTag(String tag)
    {
        this.tag = tag;
    }
    public String getTag()
    {
        return tag;
    }
    
    
    public String toString()
    {
        return " tag: " + this.tag +" num: " + this.num;
    }
    
    
}

这里说明下,ABCD代表四种不同的花色,2-16代表不同的牌面,A用14代替,我想不用多解释吧!

首先是洗牌这块,我们奔着不重复造轮子的思想,借用Collections.shuffle(List)接口,去将52张牌打乱顺序,然后随机随机抽取。

首先是,获取每个玩家的最大牌型,即从N张扑克中取出5张最大的,我们从N张牌中抽出5张牌,有N多种算法,这里给出一个算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private static Map<Integer, List<Poker>> SevenToFiveGroups(List<Poker> map)
    {
        Map<Integer, List<Poker>> group = new HashMap<Integer, List<Poker>>();
        int num = 0;
        for (int a = 0; a < 3; a++)
        {
            for (int b = a + 1; b < 4; b++)
            {
                for (int c = b + 1; c < 5; c++)
                {
                    for (int d = c + 1; d < 6; d++)
                    {
                        for (int e = d + 1; e < 7; e++)
                        {
                            List<Poker> pukeGroup = new ArrayList<Poker>();
                            pukeGroup.add(map.get(a));
                            pukeGroup.add(map.get(b));
                            pukeGroup.add(map.get(c));
                            pukeGroup.add(map.get(d));
                            pukeGroup.add(map.get(e));
                            group.put(num++, pukeGroup);
                        }
                    }
                }
            }
        }
        num = 0;
        return group;
    }

在取得所有可能的组合之后,我们从这些组合中得到最大的一副手牌。为 了得到最大的一副手牌,我们计算每付(五张牌)手牌的大小。首先对这五张牌进行排序,从大到小,手牌的大小为一个Long整形的数,手牌等级占两位(比如 高牌为10,一对为11,二两为12,以此类推),五张扑克,每张扑克的数值占两位,所以手牌的大小是一个12位的整数,

比如图1.2的一副牌

手牌等级 第一张牌 第二张牌 第三张牌 第四张牌 第五张牌
10 A(A) U(B) 10(C) 9(D) 7(C)

图1.2

这副手牌的大小为 101412100907

需要注意的是,在遇到有对子的是情况,无论是两对还是三双,都要进行特殊排 序,葫芦和三双的情况下,要把三个一样的大的牌排到前面,然后再排对子,这样才能保证在比较牌大小的情况下,正确比较出大小。还有就是在遇到A2345这 样的顺子的情况下,要讲A排在最后,因为34567的顺子是比A2345大的。当然这两种情况是属于比较特殊情况,需要特别处理。

对应程序的算法为:

首先计算手牌的等级,如果是顺子或者同花就不用说了,对子三双葫芦起始是相对比较难比较的,这里给出一个算法,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int Pukelevel = -1;
        int flag = 0;
        for (int i = 0; i < list.size(); i++)
        {
            for (int j = i + 1; j < list.size(); j++)
            {
                if (list.get(i).getNum() == list.get(j).getNum())
                {
                    flag++;
                }
            }
        }
        switch (flag)
        {
        case 6:
                         四条
        case 4:
                         葫芦
        case 3:
            三条
        case 2:
            两队
        case 1:
            一对
        case 0:
            高牌
        }             

this.level即牌型, 就是这样计算出来的,然后就是计算这副手牌的大小了!

1
2
3
4
5
6
7
8
9
10
11
12
13
long lon = 1000000000L * 10;
        this.pkValue = 0L;
        for(int i = 0 ; i < this.list.size() ; i++)
        {
            int interval = 1;
            for(int j = i ; j < this.list.size() - 1 ; j ++)
            {
                interval *= 10;
                interval *= 10;
            }
            this.pkValue += this.list.get(i).getNum() * interval;
        }
        this.pkValue += this.level * lon;

剩下的就是对所有的情况,进行排序;所有玩家比较的时候,也是这样的情况!

希望对大家有帮助。

CSS3 :nth-child() 选择器

mikel阅读(877)

CSS 选择器参考手册
实例

规定属于其父元素的第二个子元素的每个 p 的背景色:

p:nth-child(2)
{
background:#ff0000;
}

亲自试一试
浏览器支持
IE Firefox Chrome Safari Opera

所有主流浏览器均支持 :nth-child() 选择器,除了 IE8 及更早的版本。
定义和用法

:nth-child(n) 选择器匹配属于其父元素的第 N 个子元素,不论元素的类型。

n 可以是数字、关键词或公式。

提示:请参阅 :nth-of-type() 选择器,该选择器选取父元素的第 N 个指定类型的子元素。
亲自试一试 – 实例
实例 1

Odd 和 even 是可用于匹配下标是奇数或偶数的子元素的关键词(第一个子元素的下标是 1)。

在这里,我们为奇数和偶数 p 元素指定两种不同的背景色:

p:nth-child(odd)
{
background:#ff0000;
}
p:nth-child(even)
{
background:#0000ff;
}

亲自试一试
实例 2

使用公式 (an + b)。描述:表示周期的长度,n 是计数器(从 0 开始),b 是偏移值。

在这里,我们指定了下标是 3 的倍数的所有 p 元素的背景色:

p:nth-child(3n+0)
{
background:#ff0000;
}

亲自试一试

Unable to save result set in wp-db.php错误修复

mikel阅读(990)

Unable to save result set in wp-db.php的1813行错误,是因为wp_options表的数据出现损坏导致的,所以

直接对表wp_options进行修复即可

在phpmyAdmin中,选择wp_options表,选择“操作”里面的“修复表”执行即可

 

15款优秀移动APP产品原型设计工具 | 人人都是产品经理

mikel阅读(1436)

Prototyping on Paper

来源: 15款优秀移动APP产品原型设计工具 | 人人都是产品经理

首先,一款优秀的移动APP产品原型设计工具应该具备:

①.支持移动端演示(随时随地演示给BOSS,厕所&食堂&电梯…以体现我是那么的敬业——长点工资必备)

②.组件库(高效复用,谁用谁知道)

③.可以快速生成全局流程(程序猿看不懂拆解的,给丫的看这个)

④.在线协作(多个PM狗一起用)

⑤.手势操作、转场动画、交互特效…(这些都不需要,留给专业的交互、视觉,搞那么虚的不如多想想产品流程逻辑做做减法、写写xxRD啥的)

这些年,产品狗们折腾过的原型工具:

1. POP(Prototyping on Paper)

优秀移动APP产品原型设计工具之POP

算是移动App原型设计神器 ,很多公司在用:quora、sina、豆瓣、36氪、ifanr…

操 作轻巧简单:先用手机拍下草图原型(存到POP app内);然后开始编辑图片的哪个区域(按钮)链接到什么页面,添加跳转链接热区,就可以在iPhone上给小伙伴们演示了,并且POP内嵌的交互动作 如侧滑、展开、消失等,即可满足一般的动态演示需要。不太明白?

 

2、Pencil Project 
优秀移动APP产品原型设计工具之Pencil Project
Pencil是一款开源的可以用来制作图表和GUI原型的工具,可以作为一个独立的app,也可以作为Firefox插件。内置模版可以帮你绘制桌面和移动界面中用到的各种各样的用户界面,包括流程图、UI和一般的通用图形。

通过它内置的模板,你可以创建可链接的文档,并输出成为HTML文件、PNG、OpenOffice文档、Word文档、PDF。Pencil Project还包含大量移动app模版。

 

3.Axure

优秀移动APP产品原型设计工具之Axure

大 家都很熟悉了,这里主要说下移动端的演示,这样才充分表达原型意图。按F5生成原型的时候,在“Mobile/Device”选项中可以设置适配移动设备 的特殊原型(Axure 6.5以下版本),再用移动设备访问你生成的原型链接即可(该页面创建一个桌面快捷方式)。

 

4、Proto.io
优秀移动APP产品原型设计工具之proto
Proto.io是一个专用的手机原型开发平台——可以构建和部署全交互式的移动程序的原型,并且可以模拟出相似的成品。它可以运行在大多数的浏览器中,并提供了3个重要的接口:dashboard、编辑器以及播放器。

dashboard 可以用来管理项目。编辑器是构建原型的环境,由一组设计和开发原型的工具组成,另外还可以构建交互。播放器用来观看原型,并与原型进行交互,并提供了相关 工具来标注和保留反馈信息。你可以直接在真实的移动设备上对原型进行测试。并且可以使用iOS或Android上的浏览器以全屏模式运行原型。

 

5、Moqups
优秀移动APP产品原型设计工具之Moqups
是一个非常好的、免费的HTML5应用,通过它可以创建可爱朴素的线框图、实体模型和UI概念。该程序使用起来非常简单,并且有内置的模板可以直接使用(模板包括单选按钮、链接、图像占位符、文本框以及滑块等)。

它还提供了iPhone和iPad模板,以及iOS相关的按钮、提示框、picker、菜单、开关以及键盘等。你可以设置网格的尺寸,并预览和分享你的线框图。Moqups提供了一个很有用的功能就是对齐网格,可以使对象精准对齐。

 

6、UXPin
优秀移动APP产品原型设计工具之UXPin
UXPin是DeSmart团队开发的一个简易快速的实体模型和在线可点击原型创作工具。它基于优秀的用户体验设计原则,在构建原型中,它提供了一个完整的工具包(该工具包具有良好的用户设计模式和元素)来从头构建一个出色的原型。

UXPin 具有响应式的断点功能,创建的响应式原型和线框图可以运行在不同的设备和分辨率上。另外该软件还提供了版本控制和迭代功能,可以轻松的共享预览,直观的注 解和实时的协同编辑和聊天。该软件拥有大量具有吸引力的用户界面元素风格(包括web,iOS,Android等),并且具有快速、灵敏的响应拖放接口。

 

7、Omnigraffle
优秀移动APP产品原型设计工具之Omnigraffle
OmniGraffle是由The Omni Group制作的一款带有大量模版可以用来快速绘制线框图、图表、流程图、组织结构图以及插图等类型图的app,也可以用来组织头脑中思考的信息,曾获得2002年的苹果设计奖。

它采用拖放的所见即所得界面,你可以用钢笔工具绘制自定义的模版或者图形,此外还自带Graffletopia提供的多个iPhone、iPad以及Android模版。

 

8、JustinMind
优秀移动APP产品原型设计工具之justmind
JustinMind是由西班牙JustinMind公司出品的原型制作工具,可以输出Html页面。与目前主流的交互设计工具axure,Balsamiq Mockups等相比,Justinmind Prototyper更为专属于设计移动终端上app应用。

JustinMind 可以帮助开发者设计更丰富、更具交互新的移动产品线框图,包含了iPhone、Android 以及iPad常用手势,滑动、缩放、旋转,甚至捕捉设备方向等,从而创造出更具交互性的原型。另外,它可以导出原型信息到Microsoft Word,生成规范的文档。

此外,你还可以自定义小组件,创建自定义组件库,并进行分类,不管对象是iPhone、iPad、黑莓、Android还是其他。

 

9、FluidUI
优秀移动APP产品原型设计工具之FluidUI
Fluid UI是一款用于移动开发的Web原型设计工具,可以帮助设计师高效地完成产品原型设计。Fluid UI 内置超过1700款的线框图和手机UI控件,并且还会经常进行更新。

Fluid UI无设备限制,无平台限制(Windows、Mac以及Linux系统),支持Chrome和Safari浏览器(Chrome浏览器上的app也可离 线使用)。你可以使用Fluid Player来预览你的设计,收集意见和反馈。还可以以PNG、PDF方式输出。

Fluid UI使用方法简单,采取拖拽的操作方式,不需要程序员来写代码。另外,Fluid UI资源库非常丰富,有针对iOS、Android以及Windows 8的资源。如果你觉得库存资源不能满足你的需求,你也可以自行添加。

 

10、Protoshare
优秀移动APP产品原型设计工具之Protoshare
ProtoShare:在线网站开发协同制作工具是一个十分便捷的在线原型制作工具,侧重于团队协作。团队成员可以通过这个工具对工作进行审查,并及时提供反馈,对线框图或内容进行建议。

作 为一个强大的线框图和原型平台,Protoshare提供了大量移动工具集(有来自中心资源库的大量移动模版和大量2D、3D动画过渡)。通过“拖放”界 面,你可以快速创建交互式的线框图和移动原型,然后发送至iPhone、iPad或者Android设备进行测试,体验app的功能实现情况。

另外,Protoshare还支持分享和反馈功能,项目成员可以标记和跟踪的反馈信息来做出决定。而大量的资源库意味着你可以使用模版和获得的反馈创建移动产品线框图,进而演变为高保真的原型。

 

11、 Wireframe
优秀移动APP产品原型设计工具之Wireframe
Wireframe是一款具有“点击-拖-放”界面且超简单的线框图创作工具。双击实现编辑功能,有限的界面意味着你会把精力集中于你的想法上。还给每个线框图分配了特有的URL,便于标记和分享。
Wireframe有浏览器窗口和移动手机两个模版选项,移动版有纵向和横向两个选择。线框图的每个元素都可以编辑和转换。

 

12、InVision
优秀移动APP产品原型设计工具之InVision
InVision是一个便捷的产品原型生成工具,用户制作一个在线原型只需要四部:创建一个工程、上传视觉设计稿、添加链接以及生成在线原型。

确 切说,InVision提供的不是准确的线框图,而是一个快速原型的环境,可以把你的UX/UI草图快速连接起来。数字型的线框图和高保真的设计可以帮你 测试app的工作情况,同时该工具还支持协作和分享功能,生成的在线原型可以支持任何人在产品原型的任何地方评论,便于准确的交流。

针对iOS 开发,InVision还增添了其他功能,比如自定义主屏幕icon和自定义加载页面。

 

13、Mokk.me 
优秀移动APP产品原型设计工具之Mokk.me

Mokk.me 是一个简单快速的原型工具,通过界面上简单的拖放操作,不用了解单线编程就能创作一个可以分享、测试以及多平台的app。目前,Mokk.me正在测试 中,但它是一个简单的基本的工具,任何人可以用它来创建app的布局。你可拖、放或者编辑小工具,可以搭建和连接页面,还可以选择过渡动画。它的特点还在 于页面和按钮、图片小工具、文本输入以及复选框形式。
另外,你可以借助HTML、CSS以及JavaScript完成app其他一些功能,一旦你创建了原型,你还可以进行分享,在iOS 和Android上进行测试。

 

14、iPlotz 
优秀移动APP产品原型设计工具之iPlotz

iPlotz 是一款可以用来创建可点击、可导航的原型和线框图工具,适合网站开发者和移动app开发者。你可以在一个可调整的页面拖放元件,然后连接起来,增加其他屏 幕或者页面的热点链接。你可以选择使用iPhone/iPad模版或者Android模版,任何模版都有独一无二的元件设置。

iPlotz界面明白易懂,支持协同工作、可分享的编辑权限、任务管理以及评价系统。另外,项目可以以IPML、JPG、PNG、PDF以及HTML形式输出。

 

15.Adobe Illustrator 俗称AI

优秀移动APP产品原型设计工具之Illustrator

这是adobe的一款矢量图设计软件,推荐给设计师转型过来的PM(没兴趣的跳过),电商圈不推荐再去费力学习其他软件,达到沟通的目的提高效率是王道。上图是设计出来的原型成品,可以结合上面提到的POP去演示,so easy。

写在最后:萝卜白菜各有所爱,没有最好的工具,只有最顺手的,最终的目的只有一个——沟通。

 

原文来自:互联网分析沙龙

MySQL:日期函数、时间函数总结 - ggjucheng - 博客园

mikel阅读(981)

current_timestamp()

来源: MySQL:日期函数、时间函数总结 – ggjucheng – 博客园

 MySQL 获得当前日期时间 函数

获得当前日期+时间(date + time)函数:now()

复制代码
mysql> select now();

+---------------------+
| now() |
+---------------------+
| 2008-08-08 22:20:46 |
+---------------------+
复制代码

获得当前日期+时间(date + time)函数:sysdate()
sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值。看下面的例子就明白了:

复制代码
mysql> select now(), sleep(3), now();

+---------------------+----------+---------------------+
| now() | sleep(3) | now() |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:21 | 0 | 2008-08-08 22:28:21 |
+---------------------+----------+---------------------+
复制代码

sysdate() 日期时间函数,一般情况下很少用到。

 

MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()

复制代码
mysql> select current_timestamp, current_timestamp();

+---------------------+---------------------+
| current_timestamp | current_timestamp() |
+---------------------+---------------------+
| 2008-08-09 23:22:24 | 2008-08-09 23:22:24 |
+---------------------+---------------------+
复制代码

MySQL 日期转换函数、时间转换函数

MySQL Date/Time to Str(日期/时间转换为字符串)函数:date_format(date,format), time_format(time,format)

复制代码
mysql> select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s');

+----------------------------------------------------+
| date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') |
+----------------------------------------------------+
| 20080808222301 |
+----------------------------------------------------+
复制代码

MySQL 日期、时间转换函数:date_format(date,format), time_format(time,format) 能够把一个日期/时间转换成各种各样的字符串格式。它是 str_to_date(str,format) 函数的 一个逆转换。

 

MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)

select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09
select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09
select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09
select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30

可以看到,str_to_date(str,format) 转换函数,可以把一些杂乱无章的字符串转换为日期格式。另外,它也可以转换为时间。“format” 可以参看 MySQL 手册。

 

MySQL (日期、天数)转换函数:to_days(date), from_days(days)

select to_days('0000-00-00'); -- 0
select to_days('2008-08-08'); -- 733627

 

MySQL (时间、秒)转换函数:time_to_sec(time), sec_to_time(seconds)

select time_to_sec('01:00:05'); -- 3605
select sec_to_time(3605); -- '01:00:05'

 

MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)

select makedate(2001,31); -- '2001-01-31'
select makedate(2001,32); -- '2001-02-01'
select maketime(12,15,30); -- '12:15:30'

 

MySQL (Unix 时间戳、日期)转换函数

unix_timestamp(),
unix_timestamp(date),
from_unixtime(unix_timestamp),
from_unixtime(unix_timestamp,format)

下面是示例:

复制代码
select unix_timestamp(); -- 1218290027
select unix_timestamp('2008-08-08'); -- 1218124800
select unix_timestamp('2008-08-08 12:30:00'); -- 1218169800

select from_unixtime(1218290027); -- '2008-08-09 21:53:47'
select from_unixtime(1218124800); -- '2008-08-08 00:00:00'
select from_unixtime(1218169800); -- '2008-08-08 12:30:00'

select from_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008'
复制代码

 

 

MySQL 日期时间计算函数

 

MySQL 为日期增加一个时间间隔:date_add()

复制代码
set @dt = now();

select date_add(@dt, interval 1 day); -- add 1 day
select date_add(@dt, interval 1 hour); -- add 1 hour
select date_add(@dt, interval 1 minute); -- ...
select date_add(@dt, interval 1 second);
select date_add(@dt, interval 1 microsecond);
select date_add(@dt, interval 1 week);
select date_add(@dt, interval 1 month);
select date_add(@dt, interval 1 quarter);
select date_add(@dt, interval 1 year);

select date_add(@dt, interval -1 day); -- sub 1 day
复制代码

 

MySQL adddate(), addtime()函数,可以用 date_add() 来替代。下面是 date_add() 实现 addtime() 功能示例:

复制代码
mysql> set @dt = '2008-08-09 12:12:33';

mysql>
mysql> select date_add(@dt, interval '01:15:30' hour_second);

+------------------------------------------------+
| date_add(@dt, interval '01:15:30' hour_second) |
+------------------------------------------------+
| 2008-08-09 13:28:03 |
+------------------------------------------------+

mysql> select date_add(@dt, interval '1 01:15:30' day_second);

+-------------------------------------------------+
| date_add(@dt, interval '1 01:15:30' day_second) |
+-------------------------------------------------+
| 2008-08-10 13:28:03 |
+-------------------------------------------------+
复制代码

 

MySQL 为日期减去一个时间间隔:date_sub()

复制代码
mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);

+----------------------------------------------------------------+
| date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |
+----------------------------------------------------------------+
| 1997-12-30 22:58:59 |
+----------------------------------------------------------------+
复制代码

MySQL date_sub() 日期时间函数 和 date_add() 用法一致,不再赘述。

 

MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)

MySQL datediff(date1,date2):两个日期相减 date1 - date2,返回天数。
select datediff('2008-08-08', '2008-08-01'); -- 7
select datediff('2008-08-01', '2008-08-08'); -- -7

MySQL timediff(time1,time2):两个日期相减 time1 – time2,返回 time 差值。

select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
select timediff('08:08:08', '00:00:00'); -- 08:08:08

注意:timediff(time1,time2) 函数的两个参数类型必须相同。

 

MySQL 时间戳(timestamp)转换、增、减函数:

timestamp(date) -- date to timestamp
timestamp(dt,time) -- dt + time
timestampadd(unit,interval,datetime_expr) --
timestampdiff(unit,datetime_expr1,datetime_expr2) --

请看示例部分:

复制代码
select timestamp('2008-08-08'); -- 2008-08-08 00:00:00
select timestamp('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01
select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01

select timestampadd(day, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00
select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00

MySQL timestampadd() 函数类似于 date_add()。
select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1
select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12

select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7
复制代码

MySQL timestampdiff() 函数就比 datediff() 功能强多了,datediff() 只能计算两个日期(date)之间相差的天数。

 

MySQL 时区(timezone)转换函数

convert_tz(dt,from_tz,to_tz)

select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

时区转换也可以通过 date_add, date_sub, timestampadd 来实现。

select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00
select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00
select timestampadd(hour, -8, '2008-08-08 12:00:00'); -- 2008-08-08 04:00:00

 

更多参考 http://www.cnblogs.com/she27/archive/2009/01/16/1377089.html

lynx安装方法

mikel阅读(1233)

lynx是在文本模式下浏览网页的一个网页浏览器类似的还有w3m等
我们可以http://lynx.isc.org/current/去下载lynx-cur.tgz文件

安装
我们现进如lynx-cur.tgz的所在目录
然后用gunzip将lynx-cur.tgz解压命令如下
[root@PHP rm]#gunzip lynx-cur.tgz
得到lynx-cur.tar文件然后在用tar命令将lynx-cur.tar解开
[root@PHP rm]#tar lynx-cur.tar
我们就可以得到lynx2-8-5目录了
现在就可以开始安装了
[root@PHP rm]# cd lynx2-8-5/ 进入lynx2-8-5目录
[root@PHP lynx2-8-5]# ./configure 编译(要耐心等待噢腰部就的重来喽)
[root@PHP lynx2-8-5]# make install 开始安装
[root@PHP lynx2-8-5]# make install -n | more 看装了哪些档案

要浏览简体中文网页就的修改如下设置
Save options to disk: [X]
Display and Character Set
Display character set : [Chinese________________________]
Assumed document character set(!): [iso-8859-1______]
CJK mode (!) : [ON_]
然后移到最下面的 Accept Changes 按下 Enter 保存就可以了
当然你的系统要支持简体中文才可以

代理的设置
为lynx挂上proxy server,改善浏览、下载速度:
vi /etc/lynx.cfg,为 http、ftp?挂上 proxy
#http_proxyhttp://some.server.dom:port/ ;
http_proxyhttp://proxy.nc.hcc.edu.tw:3128/ ;这里是代理代理服务器的地址和端口可以知己更该
#https_proxyhttp://some.server.dom:port/ ;
#ftp_proxyhttp://some.server.dom:port/ ;
ftp_proxyhttp://proxy.nc.hcc.edu.tw:3128/ ;这里是代理代理服务器的地址和端口可以知己更该

angular实现的文字上下无缝滚动 - Jennry - 博客园

mikel阅读(1158)

来源: angular实现的文字上下无缝滚动 – Jennry – 博客园

最近在学习angularJs,业余时间随便写了一个文字上下无缝滚动的例子,主要写了一个小小的指令。

css代码:主要控制样式

复制代码
<style type="text/css">
        *{margin: 0px;padding: 0px;}
        .slide {width: 200px;height:200px;border:1px solid #dcdcdc;margin: 0 auto;margin-top: 50px;overflow: hidden;}
        .slide li {height: 49px;line-height: 49px;text-align: left;padding: 0 10px;font-size: 16px;list-style: none;border-bottom: 1px dashed #dcdcdc;cursor: pointer;}
        .slide li:hover{background: #ccc;}
    </style>
复制代码

html代码:

复制代码
<body ng-app="tip">
<div ng-controller = "TipController">
    <div class="slide">
        <ul class="slideUl">
            <!-- 指令 -->
            <slide-follow id="slide" dataset-data = "datasetData"></slide-follow>
        </ul>
    </div>
</div>
</body>
复制代码

当然我们的代码都是基于页面中已经引入angular.js文件下来运行的

slide-follow是我们需要实现的指令   dataset-data = "datasetData" 是我们需要显示的文字

js代码
复制代码
<script type="text/javascript">
    var app =angular.module("tip",[]);
    app.controller("TipController",function($scope){
        // 数据可以根据自己使用情况更换
        $scope.datasetData = [
            {option : "这个是第一条数据"},
            {option : "这个是第二条数据"},
            {option : "这个是第三条数据"},
            {option : "这个是第四条数据"},
            {option : "这个是第五条数据"},
            {option : "这个是第六条数据"}
        ]
    })
    .directive("slideFollow",function($timeout){
        return {
            restrict : 'E',
            replace : true,
            scope : {
                id : "@",
                datasetData : "="
            },
            template : "<li ng-repeat = 'data in datasetData'>{{data.option}}</li>",
            link : function(scope,elem,attrs) {
                $timeout(function(){
                    var className = $("." + $(elem).parent()[0].className);
                    var i = 0,sh;
                    var liLength = className.children("li").length;
                    var liHeight = className.children("li").height() + parseInt(className.children("li").css('border-bottom-width'));
                    className.html(className.html() + className.html());

                    // 开启定时器
                    sh = setInterval(slide,4000);

                    function slide(){
                        if (parseInt(className.css("margin-top")) > (-liLength * liHeight)) {
                            i++;
                            className.animate({
                                marginTop : -liHeight * i + "px"
                            },"slow");
                        } else {
                            i = 0;
                            className.css("margin-top","0px");
                        }
                    }

                    // 清除定时器
                    className.hover(function(){
                        clearInterval(sh);
                    },function(){
                        clearInterval(sh);
                        sh = setInterval(slide,4000);
                    })


                },0)

            }
        }
    })
</script>
复制代码

首先我们在controller中定义了需要显示的文字,接下来我们就可以开始定义指令部分。

运行效果图:

文字上下会无缝滚动,当鼠标移入是,会清除定时器,停止滚动。

crontab 启动 、运行 和编辑 查看 - AriesSurfer的专栏 - 博客频道 - CSDN.NET

mikel阅读(1108)

那时候,喜欢在QQ和几个好朋友讨论诗词,后来朋友都散了,我心里的悲哀却始终不能消散。月前看以前译《浮士德》的帖子,看到自己写道:操琴欲赋为谁听,当日知交俱凋零曾不离兮竟暌违,漫相和兮长寂默—-觉人生聚散无定,当真一语成谶,心灰意冷,厌翻诗卷。五月,在落雨的树林里漫步,看到白桦的绿叶新发,慢慢觉得四季往复,老病之外,一切都有余地—-与其消沉下去,莫如做好自己,才能对朋友有助益,才有待得朋友回来的希望。因此决定继续在此地读诗写字,继续在力所能及

来源: crontab 启动 、运行 和编辑 查看 – AriesSurfer的专栏 – 博客频道 – CSDN.NET

cron服务是linux的内置服务,但它不会开机自动启动。可以用以下命令启动和停止服务:

/sbin/service crond start
/sbin/service crond stop
/sbin/service crond restart
/sbin/service crond reload

以上1-4行分别为启动、停止、重启服务和重新加载配置。

要把cron设为在开机的时候自动启动,在 /etc/rc.d/rc.local 脚本中加入 /sbin/service crond start 即可

查看当前用户的crontab,输入 crontab -l;

编辑crontab,输入 crontab -e;

删除crontab,输入 crontab -r

linux定时执行任务 - 洒洒 - 博客园

mikel阅读(1209)

来源: linux定时执行任务 – 洒洒 – 博客园

1)Linux下如何定时执行php脚本?
(2)Linux下如何设置定时任务?
(3)Crontab定时执行程序

核心提示:
键入 crontab
-e 编辑crontab服务文件
分为两种情况:(还有一种情况,当需要传递参数的时候,可以考虑用linux的curl)
第一种情况:你的php脚本中没有引入其他PHP文件,也就是说没有include,require_once等命令的PHP文件
* */1 * * * /usr/local/php/bin/php  /var/www/html/wwwroot/web/script.php (每一小时执行一次script.php)
注意,这样写需要把PHP变成可执行的脚本文件。在命令行下,脚本所在目录
chmod +x script.php
注意:你的script.php文件中一定要在开始处加上: #!/usr/local/php/bin/php -q ,下面是一个完整的script.php文件代码

复制代码
<?php
#!/usr/local/php/bin/php -q
session_start();
define( "DB_PASSWORD", "111111" ); // 服务器登陆密码
define( "DB_NAME", "db_shopping" ); // 数据库名称
define( "DB_USER", "root" ); // 服务器登陆用户
define( "DB_HOST", "127.0.0.1" ); // 服务器IP地址或名称
define( "DB_PORT", "3306" ); // 服务器登陆端口号
define( "DB_CHARSET", "utf8" ); // 数据库默认语言
define( "DB_DEBUG", false ); // 是否设置为调试模式
define( "DB_CLOSE", false ); // 是否主动关闭数据库连接
$con=mysql_connect(DB_HOST.":".DB_PORT,DB_USER,DB_PASSWORD);
mysql_query ( "SET character_set_connection = ".DB_CHARSET.", character_set_results = ".DB_CHARSET.", character_set_client = binary");
if (!$con) die("Mysql Error:".mysql_error());
mysql_select_db(DB_NAME,$con);
//$dates=date()

$sqll="insert into test(NAME,Sex,thisdate,state) values('love','0','2011-08-11','1')";
$resl=mysql_query($sqll);
echo "成功...";
?>
复制代码

/usr/local/php/bin/php的意思是:用/usr/local/php/bin/目录中的php.exe文件来执行 /var/www/html/wwwroot/web/script.php

第二种情况:你的php脚本中有引入其他PHP文件,也就是说有用到include,require_once命令的PHP文件(先写shell脚本)
上面的方法有一个问题:当script脚本中有include文件时,脚本根本找不对PHP的路径,php将会在/bin/local/php目录下找文件,当然找不到。
所以,遇见这种情况,按照下面的方法做:
在终端上输入如下命令得到sh 和 lynx 程序的路径:
whereis sh
whereis lynx
or
which sh
which lynx
随便输入一个,其中便会返回你要的路径。如果你的系统里没有lynx,试试links,w3m,或者 links2,这些是其它的文本模型浏览器。这些浏览器将会运行你的脚本。
然后你需要创建一个sh文件,用它来调用php文件,通过lynx。假设你的服务器已经安装了lynx,sh路径为 /bin/sh,lynx路径为 /usr/local/bin/lynx
#!/bin/sh
/usr/local/bin/lynx -source http://www.yoursite.com/folder/script.php
注意感叹号
把这个脚本保存为cron-lynx.sh
保存到一个你找得到的地方,比如:

你可以把它放在网站根目录。
然后再创建一个script.php的文件。当cron运行的时候,将会通过lynx来调用它。这个文件可以通过浏览器来访问。

然后编辑主机的crontab,像下面这样。
*/1 * * * * root /bin/sh /usr/www/yourdirectory/sh_scripts/cron-lynx.sh
在/bin/sh 和 /usr 间有空格。就这样就设好了,还有一点要注意的是,你的sh文件和php文件都正确无误。

===================================================================================

linux下的crontab服务:
1、crontab 是用来让使用者在固定时间或固定间隔执行程序之用
在linux平台上如果需要实现任务调度功能可以编写cron脚本来实现。
以某一频率执行任务
linux缺省会启动crond进程,crond进程不需要用户启动、关闭。
crond进程负责读取调度任务并执行,用户只需要将相应的调度脚本写入cron的调度配置文件中。
cron的调度文件有以下几个:
1. crontab
2. cron.d
3. cron.daily
4. cron.hourly
5. cron.monthly
6. cron.weekly

如果用的任务不是以hourly monthly weekly方式执行,则可以将相应的crontab写入到crontab 或cron.d目录中。
示例:
每隔一分钟执行一次脚本 /opt/bin/test-cron.sh
可以在cron.d新建脚本 echo-date.sh
内容为
*/1 * * * * root /opt/bin/test-cron.sh

2、cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,如果它不自动起来,可以用以下的方法启动、关闭这个服务:
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置

你也可以将这个服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上:
/sbin/service crond start
现在Cron这个服务已经在进程里面了,我们就可以用这个服务了

查看服务是否已经运行用 ps -ax | grep cron

3、crontab命令

查看该用户下的crontab服务是否创建成功, 用 crontab  -l 命令
命令 which php 查看linux下安装的php的路径
cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除没个用户的cron服务
crontab -e //编辑某个用户的cron服务
比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
任务调度的crond常驻命令crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此
任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

crontab命令选项:

-u指定一个用户
-l列出某个用户的任务计划
-r删除某个用户的任务
-e编辑某个用户的任务

4、cron文件语法:

分     小时    日       月       星期     命令
0-59   0-23   1-31   1-12     0-6     command     (取值范围,0表示周日一般一行对应一个任务)

记住几个特殊符号的含义:

“*”代表取值范围内的数字,
“/”代表”每”,如每2分钟:*/2
“-”代表从某个数字到某个数字,
“,”分开几个离散的数字

5、任务调度设置文件的写法
可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件
具体格式如下:
Minute Hour Day Month Dayofweek   command
分钟     小时   天     月       天每星期       命令
每个字段代表的含义如下:
Minute             每个小时的第几分钟执行该任务
Hour               每天的第几个小时执行该任务
Day                 每月的第几天执行该任务
Month             每年的第几个月执行该任务
DayOfWeek     每周的第几天执行该任务
Command       指定要执行的程序
在这些字段里,除了“Command”是每次都必须指定的字段以外,其它字段皆为可选

字段,可视需要决定。对于不指定的字段,要用“*”来填补其位置。
举例如下:
5       *       *           *     *     ls             指定每小时的第5分钟执行一次ls命令
30     5       *           *     *     ls             指定每天的 5:30 执行ls命令
30     7       8         *     *     ls             指定每月8号的7:30分执行ls命令
30     5       8         6     *     ls             指定每年的6月8日5:30执行ls命令
30     6       *           *     0     ls             指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,

以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]

30     3     10,20     *     *     ls     每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]

25     8-11 *           *     *     ls       每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]

*/15   *       *           *     *     ls         每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]

30   6     */10         *     *     ls       每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls 命令。 ]

每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件

50   7       *             *     *     root     run-parts     /etc/cron.daily   [ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]

6、 新增调度任务

新增调度任务可用两种方法:
1)、在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
2)、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。

7、 查看调度任务
crontab -l //列出当前的所有调度任务
crontab -l -u jp   //列出用户jp的所有调度任务

8、 删除任务调度工作
crontab -r   //删除所有任务调度工作

9、 任务调度执行结果的转向
例1:每天5:30执行ls命令,并把结果输出到/jp/test文件中
30 5 * * * ls >/jp/test 2>&1
注:2>&1 表示执行结果及错误信息。

编辑/etc/crontab 文件配置cron
cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次 /etc/crontab,因此我们配置这个文件也能运用cron服务做一些事情。
用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号

HOME=/ //使用者运行的路径,这里是根目录
# run-parts

01   *   *   *   *     root run-parts /etc/cron.hourly         //每小时执行/etc/cron.hourly内的脚本

02   4   *   *   *     root run-parts /etc/cron.daily         //每天执行/etc/cron.daily内的脚本

22   4   *   *   0     root run-parts /etc/cron.weekly       //每星期执行 /etc/cron.weekly内的脚本

42   4   1   *   *     root run-parts /etc/cron.monthly     //每月去执行/etc/cron.monthly内的脚本
大家注意”run-parts”这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了

例如:
1) 在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
2)直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务
11 2 21 10 * rm -rf /mnt/fb

10.计划让你误执行PHP脚本
因为php脚本中可能有包含(require,include)以及相对路径,绝对路径,所以最好是先cd,然后再执行。如下:

*/10 * * * * cd /var/www/cron && /usr/bin/php /var/www/cron.php