www.nginx.cnsitemap

存档

‘php’ 分类的存档

php-fpm不输出php错误日志

2016年12月18日 没有评论

使用如下php的配置
php-fpm.conf

php.ini

通过浏览器访问发生500错误时,不记录错误日志,使用php在命令行直接执行php脚本却可以生成。
配置正确,后台能生成日志,问题就落在php脚本自身上。
查询发现php中有error_reporting(0);屏蔽了所有错误。
修改成error_reporting(E_ALL);可以生成错误信息到日志文件了。

分类: php 标签: ,

您需要安装旧 Java SE 6 运行环境才能打开“PhpStorm”

2015年11月1日 没有评论

mac安装java1.8之后打开phpstrom会报这个错误。

解决办法:
1.在终端下进入/Applications/PhpStorm.app/Contents目录,然后编辑Info.plist

2.修改JVMVersion的值为1.8
JVMVersion
1.8*

3.重新打开phpstrom

分类: php 标签:

什么是psr-0,psr-1,psr-2标准

2015年3月7日 没有评论

FIG组织在制定跟PHP相关规范,简称PSR,PSR旨在通过讨论我们代码项目的共同点以找出一个协作编程的方法。

什么是psr0强调自动加载的方式
下文描述了若要使用一个通用的自动加载器(autoloader),你所需要遵守的规范:

规范

一个完全标准的命名空间(namespace)和类(class)的结构是这样的:\()*
每个命名空间(namespace)都必须有一个顶级的空间名(namespace)("组织名(Vendor Name)")。
每个命名空间(namespace)中可以根据需要使用任意数量的子命名空间(sub-namespace)。
从文件系统中加载源文件时,空间名(namespace)中的分隔符将被转换为 DIRECTORY_SEPARATOR。
类名(class name)中的每个下划线_都将被转换为一个DIRECTORY_SEPARATOR。下划线_在空间名(namespace)中没有什么特殊的意义。
完全标准的命名空间(namespace)和类(class)从文件系统加载源文件时将会加上.php后缀。
组织名(vendor name),空间名(namespace),类名(class name)都由大小写字母组合而成。
示例

空间名(namespace)和类名(class name)中的下划线

以上是我们为实现通用的自动加载而制定的最低标准。你可以利用能够自动加载PHP 5.3类的SplClassLoader来测试你的代码是否符合这些标准。

实例

下面是一个怎样利用上述标准来实现自动加载的示例函数。

SplClassLoader实现

下面的gist是一个按照上面建议的标准来自动加载类的SplClassLoader实例。这是依据这些标准来加载PHP 5.3类的推荐方案。

什么是psr1,定义基本代码规范
本节我们将会讨论一些基本的代码规范问题,以此作为将来讨论更高级别的代码分享和技术互用的基础。

RFC 2119中的必须(MUST),不可(MUST NOT),建议(SHOULD),不建议(SHOULD NOT),可以/可能(MAY)等关键词将在本节用来做一些解释性的描述。

1. 概述

源文件必须只使用 这两种标签。

源文件中php代码的编码格式必须只使用不带字节顺序标记(BOM)的UTF-8。

一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。

命名空间(namespace)和类(class) 必须遵守PSR-0标准。

类名(class name) 必须使用骆驼式(StudlyCaps)写法 (译者注:驼峰式(cameCase)的一种变种,后文将直接用StudlyCaps表示)。

类(class)中的常量必须只由大写字母和下划线(_)组成。

方法名(method name) 必须使用驼峰式(cameCase)写法(译者注:后文将直接用camelCase表示)。

2. 文件

2.1. PHP标签

PHP代码必须只使用长标签()或者短输出式标签(<?= ?>);而不可使用其他标签。

2.2. 字符编码

PHP代码的编码格式必须只使用不带字节顺序标记(BOM)的UTF-8。

2.3. 副作用

一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。

短语副作用(side effects)的意思是 在包含文件时 所执行的逻辑与所声明的类(class),函数(function),常量(constant)等没有直接的关系。

副作用(side effects)包含但不局限于:产生输出,显式地使用require或include,连接外部服务,修改ini配置,触发错误或异常,修改全局或者静态变量,读取或修改文件等等

下面是一个既包含声明又有副作用的示例文件;即应避免的例子:

下面是一个仅包含声明的示例文件;即应提倡的例子:

3. 空间名(namespace)和类名(class name)

命名空间(namespace)和类(class)必须遵守 PSR-0.

这意味着一个源文件中只能有一个类(class),并且每个类(class)至少要有一级空间名(namespace):即一个顶级的组织名(vendor name)。

类名(class name) 必须使用StudlyCaps写法。

PHP5.3之后的代码必须使用正式的命名空间(namespace) 例子:

4. 类的常量、属性和方法

术语类(class)指所有的类(class),接口(interface)和特性(trait)

4.1. 常量

类常量必须只由大写字母和下划线(_)组成。 例子:

4.2. 属性

本指南中故意不对$StulyCaps,$camelCase或者$unser_score中的某一种风格作特别推荐,完全由读者依据个人喜好决定属性名的命名风格。

但是不管你如何定义属性名,建议在一个合理的范围内保持一致。这个范围可能是组织(vendor)级别的,包(package)级别的,类(class)级别的,或者方法(method)级别的。

4.3. 方法

方法名则必须使用camelCase()风格来声明。

什么是PSR2定义代码风格

代码风格指南
本手册是基础代码规范(PSR-1)的继承和扩展。

为了尽可能的提升阅读其他人代码时的效率,下面例举了一系列的通用规则,特别是有关于PHP代码风格的。

各个成员项目间的共性组成了这组代码规范。当开发者们在多个项目中合作时,本指南将会成为所有这些项目中共用的一组代码规范。 因此,本指南的益处不在于这些规则本身,而在于在所有项目中共用这些规则。

RFC 2119中的必须(MUST),不可(MUST NOT),建议(SHOULD),不建议(SHOULD NOT),可以/可能(MAY)等关键词将在本节用来做一些解释性的描述。

1. 概述

代码必须遵守 PSR-1。

代码必须使用4个空格来进行缩进,而不是用制表符。

一行代码的长度不建议有硬限制;软限制必须为120个字符,建议每行代码80个字符或者更少。

在命名空间(namespace)的声明下面必须有一行空行,并且在导入(use)的声明下面也必须有一行空行。

类(class)的左花括号必须放到其声明下面自成一行,右花括号则必须放到类主体下面自成一行。

方法(method)的左花括号必须放到其声明下面自成一行,右花括号则必须放到方法主体的下一行。

所有的属性(property)和方法(method) 必须有可见性声明;抽象(abstract)和终结(final)声明必须在可见性声明之前;而静态(static)声明必须在可见性声明之后。

在控制结构关键字的后面必须有一个空格;而方法(method)和函数(function)的关键字的后面不可有空格。

控制结构的左花括号必须跟其放在同一行,右花括号必须放在该控制结构代码主体的下一行。

控制结构的左括号之后不可有空格,右括号之前也不可有空格。

1.1. 示例

这个示例中简单展示了上文中提到的一些规则:

2. 通则

2.1 基础代码规范

代码必须遵守 PSR-1 中的所有规则。

2.2 源文件

所有的PHP源文件必须使用Unix LF(换行)作为行结束符。

所有PHP源文件必须以一个空行结束。

纯PHP代码源文件的关闭标签?> 必须省略。

2.3. 行

行长度不可有硬限制。

行长度的软限制必须是120个字符;对于软限制,代码风格检查器必须警告但不可报错。

一行代码的长度不建议超过80个字符;较长的行建议拆分成多个不超过80个字符的子行。

在非空行后面不可有空格。

空行可以用来增强可读性和区分相关代码块。

一行不可多于一个语句。

2.4. 缩进

代码必须使用4个空格,且不可使用制表符来作为缩进。

注意:代码中只使用空格,且不和制表符混合使用,将会对避免代码差异,补丁,历史和注解中的一些问题有帮助。空格的使用还可以使通过调整细微的缩进来改进行间对齐变得更加的简单。
2.5. 关键字和 True/False/Null

PHP关键字(keywords)必须使用小写字母。

PHP常量true, false和null 必须使用小写字母。

3. 命名空间(Namespace)和导入(Use)声明

命名空间(namespace)的声明后面必须有一行空行。

所有的导入(use)声明必须放在命名空间(namespace)声明的下面。

一句声明中,必须只有一个导入(use)关键字。

在导入(use)声明代码块后面必须有一行空行。

示例:

4. 类(class),属性(property)和方法(method)

术语“类”指所有的类(class),接口(interface)和特性(trait)。

4.1. 扩展(extend)和实现(implement)

一个类的扩展(extend)和实现(implement)关键词必须和类名(class name)在同一行。

类(class)的左花括号必须放在下面自成一行;右花括号必须放在类(class)主体的后面自成一行。

实现(implement)列表可以被拆分为多个缩进了一次的子行。如果要拆成多个子行,列表的第一项必须要放在下一行,并且每行必须只有一个接口(interface)。

4.2. 属性(property)

所有的属性(property)都必须声明其可见性。

变量(var)关键字不可用来声明一个属性(property)。

一条语句不可声明多个属性(property)。

属性名(property name) 不推荐用单个下划线作为前缀来表明其保护(protected)或私有(private)的可见性。

一个属性(property)声明看起来应该像下面这样。

4.3. 方法(method)

所有的方法(method)都必须声明其可见性。

方法名(method name) 不推荐用单个下划线作为前缀来表明其保护(protected)或私有(private)的可见性。

方法名(method name)在其声明后面不可有空格跟随。其左花括号必须放在下面自成一行,且右花括号必须放在方法主体的下面自成一行。左括号后面不可有空格,且右括号前面也不可有空格。

一个方法(method)声明看来应该像下面这样。 注意括号,逗号,空格和花括号的位置:

4.4. 方法(method)的参数

在参数列表中,逗号之前不可有空格,而逗号之后则必须要有一个空格。

方法(method)中有默认值的参数必须放在参数列表的最后面。

参数列表可以被拆分为多个缩进了一次的子行。如果要拆分成多个子行,参数列表的第一项必须放在下一行,并且每行必须只有一个参数。

当参数列表被拆分成多个子行,右括号和左花括号之间必须又一个空格并且自成一行。

4.5. 抽象(abstract),终结(final)和 静态(static)

当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明的前面。

而当用到静态(static)来做类声明时,则必须放在可见性声明的后面。

4.6. 调用方法和函数

调用一个方法或函数时,在方法名或者函数名和左括号之间不可有空格,左括号之后不可有空格,右括号之前也不可有空格。参数列表中,逗号之前不可有空格,逗号之后则必须有一个空格。

参数列表可以被拆分成多个缩进了一次的子行。如果拆分成子行,列表中的第一项必须放在下一行,并且每一行必须只能有一个参数。

5. 控制结构

下面是对于控制结构代码风格的概括:

控制结构的关键词之后必须有一个空格。
控制结构的左括号之后不可有空格。
控制结构的右括号之前不可有空格。
控制结构的右括号和左花括号之间必须有一个空格。
控制结构的代码主体必须进行一次缩进。
控制结构的右花括号必须主体的下一行。
每个控制结构的代码主体必须被括在花括号里。这样可是使代码看上去更加标准化,并且加入新代码的时候还可以因此而减少引入错误的可能性。

5.1. if,elseif,else

下面是一个if条件控制结构的示例,注意其中括号,空格和花括号的位置。同时注意else和elseif要和前一个条件控制结构的右花括号在同一行。

推荐用elseif来替代else if,以保持所有的条件控制关键字看起来像是一个单词。

5.2. switch,case

下面是一个switch条件控制结构的示例,注意其中括号,空格和花括号的位置。case语句必须要缩进一级,而break关键字(或其他中止关键字)必须和case结构的代码主体在同一个缩进层级。如果一个有主体代码的case结构故意的继续向下执行则必须要有一个类似于// no break的注释。

5.3. while,do while

下面是一个while循环控制结构的示例,注意其中括号,空格和花括号的位置。

下面是一个do while循环控制结构的示例,注意其中括号,空格和花括号的位置。

5.4. for

下面是一个for循环控制结构的示例,注意其中括号,空格和花括号的位置。

5.5. foreach

下面是一个foreach循环控制结构的示例,注意其中括号,空格和花括号的位置。

5.6. try, catch

下面是一个try catch异常处理控制结构的示例,注意其中括号,空格和花括号的位置。

6. 闭包

声明闭包时所用的function关键字之后必须要有一个空格,而use关键字的前后都要有一个空格。

闭包的左花括号必须跟其在同一行,而右花括号必须在闭包主体的下一行。

闭包的参数列表和变量列表的左括号后面不可有空格,右括号的前面也不可有空格。

闭包的参数列表和变量列表中逗号前面不可有空格,而逗号后面则必须有空格。

闭包的参数列表中带默认值的参数必须放在参数列表的结尾部分。

下面是一个闭包的示例。注意括号,空格和花括号的位置。

参数列表和变量列表可以被拆分成多个缩进了一级的子行。如果要拆分成多个子行,列表中的第一项必须放在下一行,并且每一行必须只放一个参数或变量。

当列表(不管是参数还是变量)最终被拆分成多个子行,右括号和左花括号之间必须要有一个空格并且自成一行。

下面是一个参数列表和变量列表被拆分成多个子行的示例。

把闭包作为一个参数在函数或者方法中调用时,依然要遵守上述规则。

7. 结论

本指南有意的省略了许多元素的代码风格。主要包括:

全局变量和全局常量的声明

函数声明

操作符和赋值

行间对齐

注释和文档块

类名的前缀和后缀

最佳实践

以后的代码规范中可能会修正或扩展本指南中规定的代码风格。

分类: php 标签:

php或js判断网站访问者来自手机或者pc端源码

2015年3月6日 没有评论

之前写过如何通过nginx来识别手机访问还是pc访问

很多时候也可以通过逻辑程序来进行判断,如PHP、JS是常用的两种识别访问设备类型的常用方法。

原理都是采用识别访问客户端的HTTP_USER_AGENT,然后进行关键字匹配进行确定设备类型,对于伪造HTTP头的就区分不出来了。

区分设备类型然后要做的就是能够针对不同设置显示出易于阅读的网页,具体可以研究响应式布局技术。

响应式布局

本文主要介绍如何通过php或js来识别终端类型。

php识别手机或者PC访问源码

方法二

js区分手机或PC访问源码

方法一

方法二

分类: php 标签:

spl_autoload_register替代__autoload()

2015年3月5日 1 条评论

PHP5.1.2起废弃了__autoload,那么为什么要用spl_autoload_register来取代__autoload()

最重要的原因是autoload只能定义一个自动加载函数,spl_autoload_register可注册多个自动加载函数到函数栈,实例话对象时会按顺序依次调用之前注册过的加载器来自动加载类定义文件。看起来没什么用,但当多个工程混合使用时有自己不懂同的自动加载类实现时,就能体现出优势了。

__autoload()是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。
printit.class.php

index.php

访问index.php会输出hello world。在index.php中,没有包含printit.class.php,在实例化PRINTIT时,自动调用__autoload函数,参数$class的值即为类名PRINTIT,此时printit.class.php就被包含到index.php中,避免到处都是include或require,程序更加简洁。

spl_autoload_register()

bool spl_autoload_register ([ callback $autoload_function ] )
将函数autoload_function注册到SPL提供的__autoload函数栈中。
如果该栈中的函数尚未激活,则激活它们。
如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中。
因为spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload()或spl_autoload_call()。

参数
autoload_function
欲注册的自动装载函数。如果没有提供任何参数,则自动注册autoload的默认实现函数spl_autoload()。

返回值
如果成功则返回 TRUE,失败则返回 FALSE。

注:SPL是Standard PHP Library(标准PHP库)的缩写。它是PHP5引入的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。SPL有两个不同的函数spl_autoload, spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。

spl_autoload_register实例

修改index.php中的__autoload换成loadprint函数。但是loadprint不会像__autoload自动触发,需要使用spl_autoload_register()注册到自动加载函数栈中,然后PHP碰到没有定义的类实例化new时就执行loadprint(),参数时类名PRINTIT。

spl_autoload_register() 调用静态方法

分类: php 标签:

PHP当前时间毫秒

2015年2月1日 没有评论

由于php中没有long类型,找了不少计算时间的函数都是浮点数的毫秒,最后发现这个好用,分享给大家
返回当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数,与java中的currentTimeMillis一样。

分类: php 标签:

phpstrom 字体 注释修改 自动换行

2015年2月1日 没有评论

修改phpstrom编辑器字体
File -> Settings -> Editor -> Colors & Fonts -> Font
默认自己是灰色的不能修改,需要另存为一个scheme name才能编辑。

修改phpstrom界面字体
File -> Settings -> Appearance & Behavior -> Appearance -> UI option
选择 Source Code Pro 字体

修改phpstrom php注释作者样式
File -> Settings -> Editor -> File and Code Templates -> Includes
PHP File Header选项

修改样式

phpstrom在缩进位置而不是行首添加注释
Settings -> Code Style -> PHP -> Other -> Code Commenting -> Line comment at first column
默认是打开的,需要将其关闭

phpstrom自动换行
File->Settings->Editor->General->Virtual Space
勾选 “ Use soft wrap in editor ” //在编辑器中自动换行

分类: php 标签:

php解析yaml

2014年2月1日 1 条评论

根据官方定义,yaml不是一种标记语言,它是一种容易被人阅读的数据序列化格式,容易与脚本语言交互,用来描述枚举数组(sequences)和关联数组(mappings).

ymal的语法:
Structure通过空格来展示。Sequence里的项用"-"来代表,Map里的键值对用":"分隔。

yaml实例

1.yaml表示sequence

每个数组元素以一个连字符和一个空格开头,为了格式化漂亮,可以写多个空格。
对应php代码

yaml的枚举数据可以出现在同一样用'[]'包括起来。

2.yaml表示hash,关联数组

yaml的关联数组key的声明后紧接着冒号,冒号后面跟着一个或多个空格。一般冒号后有一个空格就足够了,为了好看,可以自己控制数量。
关联数据对应用的php代码

关联数据也可以用'{}'包括起来写在一行表示

yaml表示嵌套结构
通过行首缩进1个或多个空格表示多层结构,如:

这里为了描述方便,第二层使用了关联数据表示,没有使用连字符'-'格式。

等同于如下php代码

yaml表示多个多多维数据,可以没有root元素

yaml定义很容易记住,需要注意的重点就是缩进必须用一个或多个空格,不能使用tab缩进。

可以配置IDE的tab为2-4个空格,这样按tab时就会插入空格,这样当使用其它编辑器打开代码是不会错乱,保持良好的缩进。

分类: php 标签: ,

mongodb非skip高效php分页类

2014年1月19日 1 条评论

mongodb分页skip+limit分页要先查出所有结果再去跳过,这样如果查询页面越往后效率越低。

如果能够通过查询条件查出每页结果的最后一条记录,在用最后一条记录作为查询条件去查下一页,这样每次都查询页面size条记录,效率子让不会差。

具体代码如下:包含mongodb.class.php, page.class.php, test.php
mongodb.class.php mongodb 操作类

page.class.php mongodb分页逻辑类

test.php 测试代码

分类: php 标签: , , ,

php获取客户端ip

2014年1月18日 没有评论

分类: php 标签: