Tag Archives: PHP

小跑一圈。。。。。

晚上回寝室的时候,小跑了30分钟左右,感觉十分的nice。以后要多坚持每天晚上小跑半个小时啊,这样才有可能回到年初时候的苗条啊。

还有一个事情就是我的WordPress出猫病了,因为WordPress是ZZ帮我架的,加上我一直以后就没怎么去插入研究过WordPress,所以导致不是很熟悉。但是一直也是相安无事啊,终于,这两天抽经了,admin里面的左侧栏的那些小图标的图片不知道为神马无缘无故的变了,十分恶心。找不出原因,连搜索都不好搜索,最后问ZZ是不是也这样,ZZ说不是,因为ZZ用的E文版,叟噶,难道我是怪胎。想想还是换成E文的吧,直接问了大猫,大猫说直接修改配置文件config.inc.php里面的定义的一个关于语言的常量就OK了,我想都不想直接注释掉,因为估计默认的都是E文的,不用指定,果然乳此。再进admin,也不抽经了。

这段时间给销售部的人弄了个管理后台的小平台,因为考虑到sql太多,而且我sql的水平又不是很高(囧勒个囧啊),再加上一直想用用缓存和错误处理神马的,因此就加入了文件缓存,因为最开始时想放到外网的,后来大猫说放内网比较安全,so,放内网了,在电脑帝zz的教导下,完成了,然后搭环境,配置环境,一大堆的事情。但是销售员使用的时候还是出了问题,缓存出了问题,也就是说没有生成一个对应用户id的缓存文件,而是生成一个公用的,那么肯定最先登录的用户的信息就被缓存起来了,想想还真是杯具思密达啊,这样一来,我得解决掉这个问题。

还有一个问题就是管理权限的问题,这两天也都写上去吧,到时如果有可能的话,直接memcache算了,不用文件缓存,效率应该会更高。

然后准备开始学习Ubuntu了,不能再等了,前端也开始了,我的学习必须是多线程的。其实有时候如果我减少浏览无关网页的时间,那么时间还是很充裕的。GO,GO,GO!

php里面如何获取一个月的第一天和最后一天

今天在做项目的时候,碰到一个关于时间的问题,就是查询一个月内所有的数据,如果使用MYSQL的函数去解决的话,会碰到版本问题,那么就直接使用between吧,between第一天和最后一天,而且时间是以Unix时间戳的形式去存储的。也就是说我要先获取第一天对应的Unix时间戳,然后获取最后一天的Unix时间戳,然后在SQL里面使用between。

本月的第一天的话,比较好解决,第一天就是01嘛- -。也就是说我可以使用mktime(0,0,0,date(‘m’),01,date(‘Y’))来获取本月的第一天,对应的,获取任何一个月的第一天都是很容易的事情了。

最后一天的话,也涉及到date函数,一般常用的参数都是Y-m-d等了,但是里面有一个t参数,用得比较少,具体的参数列表可以看这里。t参数,官方给出的解释是获取给定月份的总天数,换种想法的话,总天数也是最后一天了,所以,要获取本月最后一天的对应的Unix时间戳的话,可以使用date(‘t’, mktime(0,0,0,date(‘m’),date(‘d’),date(‘Y’))来获取这个月的天数,总天数也就是最后一天了。

但是貌似写法估计又好几种呢,明天再折腾一篇,把几个相关的都测试一下。

php构造函数问题

这段时间,一直在模仿TP的模式去写一个自己的框架,初始的想法非常简单,只是想学习一下TP的编程思路,顺便学习更多的一些函数,比如知道了call_user_func()。当然,学习函数只是很少的一部分,更多的是学习一种面向对象的思路。

然后还是蛮喜欢TP的数据库抽象层的,很大程度上加快了工作效率。不过我在写自己的orz的时候,并没有加入,因为想练习下自己的手写SQL语句能力。

前段时间一直出现一个很纠结的问题,就是关于类的构造函数的问题,当然,我事前并不知道是因为构造函数的问题。我是看了这篇文章以后,才清楚当初,SB的我是如何耗了那么多时间去折腾那个问题的。

因为我的写法跟TP类似,默认的首页都是class index中的index方法。因为所有的模块里面,index方法都是默认的方法,但是奇怪的问题出现了,就是我的首页会出现两个的页面,也就是说我的程序被执行了两次。

后来通过一些特殊的写法解决了问题,但是一直对于为什么会执行两次程序十分不解。早上看到那篇文章后,才知道是构造函数的问题。

php5的默认构造的函数是__construct(),但是在php5以前的php4,默认的构造函数是和类名同名的,但是在php5中虽然引进了__construct(),但是并没有抛弃以前的写法,也就是说,当一个类被实例化后,它会首先去寻找__construct()函数,如果没有,它就会寻找与类名同名的函数作为构造函数。

也正是由于这个蛋疼的问题,折腾了几个小时,看来自己的基础知识还不行啊。

php类中的一些魔术方法

这段时间一直在看ThinkPHP的源码,对于thinkphp的一些设计思路还是非常欣赏的,但是从源码里面也看出了自己的不足。因为TP是完全面向对象的,所有很多时候涉及到一些对类的操作,比如对静态成员的访问,以及抽象类的使用。那么有时候就需要用到一些魔术方法了,以前对于这些一直不是很了解,今天特地找个时间对他们一一记录下。

分别是__construct,__destruct,__call,__callStatic,__get,__set,__isset,__unset,__sleep,__wakeup,__tostring,__invoke,__clone,__set_state。

当然,主要是记录其中的一部分,而不是全不,因为貌似有些魔术方法用到的地方不多,比如__set_state,以及__wakeup等等。

__construct就是类的构造函数了,也叫做初始化函数,当类被实例化的实话,这个函数会被执行。相应的函数就是__destruct,叫做析构函数,也就是说在类使用完后会自动执行的一个函数,一般用于关闭一些消耗大的东西,或者清理一些垃圾。特别是__construct函数,基本上很多地方都用得到,我自己写的类,除了控制器没用到以外,基本上都用到了。

__call是php5新增的一个对象方法,主要的作用是监视对象中的其他方法,如果你的对象访问一个该对象中不存在的方法时,__call方法就会被自动调用。

而__get和__set也是对应的,都是用于操作静态属性的,一般来说,对象的静态属性是不能更改或者获取,只能被类本身所使用的,但是__get和__set可以帮你实现。__set是用设置一个你不能访问的类属性,而__get是用来获取一个你不能获取的类属性。

__isset是当isset()和empty()的参数是一个为被定义的属性的时候被调用,这是官方的解释,也是一个根据事件自动触发的一个魔术方法。而__unset是党unset()函数的参数是一个未被定义的属性的时候被调用。__isset和__unset都是根据对应的函数被调用的。

其他的东西就不解释了。还有一点要值得注意的时候就是,在定义类的方法的时候,一般是不能用这些魔术方法命名的,只有你定义的方法和它们有相关,那么才能够背这样命名。

php读取和操作xml的方式以及simpleXml扩展

php读取和操作xml的方式还很多的,从网上找了一些,做个总结,明天一一试下。

1.试用DOM库

DOM会把整个xml文件读入内存,然后用节点树来表示它,php内置了一个DOMdocument的类,它继承于DOMNode类,相关详细介绍在这儿

DOMdocument有一个很健全的功能,包括属性创建(createAttribute),创建新的注释节能(createComment),创建新的元素节点(createElement),创建文本节点(createNode),当然了,有很多比较细的创建方法,读取的话,一般是先载入(DOMdocument::load)xml文件,然后可以通过id属性(DOMdocument::getElementById)或者通过标签名称(DOMdocuemnt::getElementByTagName)来获取指定的元素。也可以用前面创建的子节点,导入(DOMdocuemnt::importNode)到已经load的xml文档。

当然了,DOMdocument也有一系列的属性,不一一说了。

2.simpleXml

官方的解释说是:它是一个很简单的并且易用的拓展,能够将xml文档转换成一个更加容易被迭代和选择的对象。

娘的,我en文水平确实渣,慢慢硬着头皮看吧。反正大概的意思就是有了它,我们可以更好的操作xml文档了。

安装要求

1.php版本要高于是php5以后的,以前的是不支持的。

2.并且还需要先启动一个叫libxml的拓展,不然也安装不了simplexml。libxml默认是已经启用了的。

安装

其实它simplexml启动的,除非你丫显得蛋疼去禁止它。但是在5.1.2以前的版本是需要手动去启动的,这对于虚拟空间的用户是多么的蛋疼啊,并且无需配置。

simplexml包括两部分,一个是SimpleXMLElement的类,一个simpleXML的一些内置的方法。SimpleXMLElement主要是操作xml文档的元素的。

第一步一般是解析xml文档

有一个名为simple_load_file的函数能够解析xml文档,但是simple一般是远程解析,本地的也能解析,它的返回值并不是整个xml文档,而是根元素。

唉,在床上真是不方便,明天实际去操作后,再深入的比较下,再补充吧,真蛋疼。

php中的__FILE__和$_SERVER['SCRIPT_FILENAME']的区别

下午在看thinkphp的源码的时候,发现了一个$_SERVER['SCRIPT_FILENAME']这个东东,然后查了下,发现和php的__FILE__比较相近,但是仅仅是相近,获取的结果还是不一样的。

看了官方的手册关于__FILE__的解释是当前文件的完整路径,如果在include中使用的话,那么所包含文件名会被返回。从php4.0.2开始,它总是包含一个绝对路径,低于这个版本的是一个相对路径了。

从定义可以看出,__FILE__是绝对路径,并且包含了当前的文件名,是以当前文件为参照的。

比如我在根目录下建立了两个文件,一个是index.php,一个是load.php,index.php文件include了load.php文件,那么在load.php中echo __FILE__的话,index.php输出的就是:

而$_SERVER['SCRIPT_FILENAME']则是指当前执行脚本的绝对路径。他重在执行脚本的文本作为参照,比如在前面提到的那个脚本中,结果就是:



而且里面路径描述也是不一样的,一个是执行文件,一个当前文件。还是有些不一样的。

php文件上传的原理以及操作

其实文件上传也是一挺简单的事儿,只是想把他给总结了,让后昨天晚上看了下官方的文档,感觉还是官方的介绍详细啊,有写东西离线文档是没有的。

先说原理吧,php文件上传就是把你要上传的文件先上传到服务器,让后,再通过函数将其移动到指定的位置。当然了,我们可以对上传的文件进行一系列的操作。

但是上传是个危险活儿,你不知道是谁在上传,也不知道上传了写啥鬼畜上去,所以上传之前有一些必要的判断。

那么上传的流程就是如下了:

1.给form标签的enctype属性赋值multipart/form-date,这个是必须的,而且也必须指定的,不然文件无法上传。

2.判断

这个判断一般有三个判断,一个是类型判断,一个是大小判断,一个是文件是否存在的判断。因为这三个判断是保证安全以及成功上传的前提。

3.保存上传的文件

因为文件上传的时候都被存放在一个临时的地方,所以要通过方法将其转移到指定的地方,这样调用也会很方便。

说了原理和流程,就是实际操作以及一些重要函数了。

首先就是指定文件规定类型,但是不能直接指定,必须指定MIME类型,不然php会报错,如果你要了解每个文件后缀对应的MIME类型,可以看这儿

上传的文件的信息一般都包含在一个叫$_FILES的关联数组中,它包含了五方面的信息。

$_FILES['file']['name'] =>要上传的文件的原名

$_FILES['file']['type'] =>要上传的文件的类型

$_FILES['file']['size'] =>文件的大小

$_FILES['file']['tmp_name'] =>储存的临时文件名,一般是系统默认

$_FILES['file']['error'] =>上传相关的错误代码

错误代码可以是一串数字,也可以是一些常量。比如0->UPLOAD_ERR_OK->上传成功。你可以在这儿看到详细的对应。

在转移文件之前,最好使用is_uploaded_file()函数来测试临时文件是否是通过HTTP POST上传的,也可以检测文件是否存在,一般用文件的临时名作为参数。让后就是使用move_uploaded_file()函数来转移上传的文件,这个函数有两个参数,第一个是指定要转移的文件,第二个是指定要转移的文件。要转移的文件一般是临时文件,所以用临时文件名(tmp_name)来指定。而第二参数一般也作为新的文件名,存进数据库,以后就可以调用了。

这里要说的一个就是大文件上传,在不借助第三方工具的情况下,可以通过设定php.ini的参数来完成,一个是upload_max_filesize,这个是指定上传的最大限制,默认是2M,还有一个就是max_input_time,它指定了表单提交的最长时间限制,因为一般大文件上传比较好时,所以这个也是必须的。

表单还可以有一些其他的控制,比如post_max_size是控制表单能接受的最大值,而memory_list可以指定每个php页面能占有的最大内存,默认是8M,max_input_time可以指定每个PHP页面接受数据的最长时间,默认是60秒。

但是设定了这些的前提是,你的php.ini文件要可写的,如果用的虚拟主机,特别是国内的,就别想,VPS到时可以。

好鸟,本来想贴代码,包括多文件上传的,想想还是明天弄吧。

php的文件操作总结

写在前面,唐朝的歌,听了有种让人想哭的感觉。

这短时间,因为在开发一个比较系统的针对生产型企业的CMS,想把功能做得完善点,还加入了SEO的元素,页面的可控程度很高,也正好把有些知识点巩固一下。今天准备两更,这个总结下文件操作,下一更就总结下昨天晚上的文件上传。

其实这些都是比较基础的东西,只是一直一来我的基础就不太好,而且怎么说呢,只是不是灰常的系统。

文件操作一般可以分为四个步骤:

1.打开文件

打开文件是通过内置的fopen()函数来完成,它有两个参数,第一个是文件名,包括文件的地址,第二个是打开的方式,方式有四种,分别是r,w,a,x四种。

r指打开的文件只读,如果要读写的话,写成r+就好了。

w是只写,它会打开并清空文件的内容,如果文件不存在就会创建文件。如果要改成读写的话,只要写成w+就好。

a是追加,就是像文件的末端追加内容,如果文件不存在就会创建文件,

x是只写,但是和w不一样,因为如果规定是x的话,文件一般都是不存在的,如果存在就会返回false。

fopen如果无法打开文件,返回的值是0,不是false。

2.读取文件

读取文件有一个fread()的函数可以用来操作,它有两个参数,一个要打开的文件,第二个是长度,这个长度是以字节来计算的。他经常与filesize()函数一起使用,而filesize函数就是返回文件的大小。

3.写入文件

写入文件一般使用fwrite()函数来使用,它有三个参数,第一个是要操作的文件,第二个是要写入的内容,第三个是可选的,是规定最大的写入字节,

4.关闭文件

一般在操作完了文件以后,都会关闭文件。而关闭文件还是比较简单的,可以使用fclose()函数。他的参数就是前面打开的文件对象。

其他操作:

1.删除文件,创建文件夹

删除文件可以使用unlink()函数,只要在参数里面指定文件就好。创建文件夹(目录)一般是使用mkdir()函数的,它有四个参数,第一个是要创建的目录名,一般是一个路径。第二个是规定目录的权限,默认是0777。第三个和第四个不常用,不说。windows平台下,mkdir只需要指定路径参数就好,而linux可以改变权限。

2.文件判断

这个其实一般如果代码要写得很严谨,我觉得还是有写用处的。

is_file函数用来查看指定的文件是否是个常规文件。

is_dir函数判断指定文件名是否是一个目录。

is_readable函数用来判断指定的文件是否可读,同样的is_writeable函数就是判断文件是否可写了。

当然了,php的文件操作还行,虽然没有python的强大,但是毕竟针对的方向不一样。

php的时间日期函数总结

1.date/time

date就是提取服务器上的时间,并可以格式化。它有两个参数,第一个是必须的,也就是format,它规定了函数会的格式。它返回的格非常多,满足了日常的需求,比如最简单的年月日,date(‘Y-m-d’)可以是xxxx-xx-xx格式,大小写敏感的。他可以精确到秒。

但是这个函数一般配合date_default_timezone_set()来使用,因为date提取的是服务器上的时间,而date_default_time_set就是指定时区的。当然了,也可以用date_default_timezone_get()来获取时区。

2.mktime

取得给定日期的Unix时间戳。他有很多个参数,都是时间相关的。

mktime([int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]])

分别是小时,分钟,秒,月,日,年,最后一个无视吧。

date()函数生产的日期可以转化为Unix时间戳格式,而mktime生成的Unix时间戳也可以转化为date类型的日期格式。

3.strtotime

这个函数尝试将一个英文文本的日期时间描述为一个Unix时间戳。有两个参数,第一个是规定要解析的时间字符串,第二个参数是用来计算返回值的时间戳,为空的话,默认为当前时间。

4.checkdate

用来检验日期是否有效的。有三个参数,分别是month,day,year,如果是正确格式,则返回true,否则返回false。

貌似常用的就这么几种吧,还有一些感觉用的不多。