php web开发 笔记

来源:互联网 发布:支付宝怎么绑定2个淘宝 编辑:程序博客网 时间:2024/05/16 08:33

¥ 

php的eval  第一个是安全性问题,第二是速度很慢。

看了下coolshell提出的如何避免post重复提交的方法,采用方法为:

Post/Redirect/Get 该方法是返回302状态码

另外避免重新提交的还有其他方法:参见,http://hi.baidu.com/etion/item/5ac3ffdd9bae934eddf9be99

看了下301和302的区别。

rot13是一种混淆算法,仅支持ascII码,针对中文需要进行扩展,比如用base64后再进行rot13

¥html后缀的文件,nginx默认一般返回都带有http协议的last modified 值,但是如果是php等脚本,就需要自己写代码来实现了。目前浏览器服务端就是采用php实现的返回last modified

文件移动保留权限,加-p选项。如果是往目录中写一个文件,需要赋予可执行权限。

$pdo和mysqli的对比,综合来看前者好。两者都能增强安全性。参考:http://blog.csdn.net/treesky/article/details/7286098

hash函数加密密码,彩虹表,为增进安全性,加上加密盐-salt,每个密码的salt都不一样,salt和hash值一块存储增加安全性,这样基本上彩虹表就没法用了。 如何建立安全的密码,下文给出多种方法:参考如下:

“假设你使用一个在相同硬件条件下一秒钟只能运行100万次的算法来代替一秒10亿次的算法,那么攻击者可能需要要花1000倍的时间来做暴力破解,60小只将会变成7年!” 

http://www.jb51.net/article/26365.htm

PHP的HASH表漏洞原理及解决方案(PHP 5.3.9RC4以下版本有次漏洞

http 什么类型的页面返回304

用php判断参数比如if-modify,脚本实现也可以。

304是页面内容无变化,通常是由于强制生成了静态HTML文件所致,服务器默认是会对一些MIMIE类型如js,css等纯文本文件做304状态返回的,当然你可以自行配置并且决定这类文件的缓存方式,apache的话需要在conf中反注释掉LoadModule expires_module modules/mod_expires.so才能开始配置。
304这种机制既能节省流量也能提高蜘蛛爬行效率,如果你实在介意,可以取消内页的静态化而配置伪静态来做,这样就不会返回304了(摘自知乎)


php-cgi是处理socket连接的,那nginx不处理socket连接吗?它只是处理http协议吗?

答案:

PHP的CGI实现了Fastcgi协议,是一个TCP或UDP协议的服务器接受来自Web服务器的请求, 当启动时创建TCP/UDP协议的服务器的socket监听,并接收相关请求进行处理。随后就进入了PHP的生命周期: 模块初始化,sapi初始化,处理PHP请求,模块关闭,sapi关闭等就构成了整个CGI的生命周期。

Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)

PHP的CGI实现了Fastcgi协议,是一个TCP或UDP协议的服务器接受来自Web服务器的请求, 当启动时创建TCP/UDP协议的服务器的socket监听,并接收相关请求进行处理。随后就进入了PHP的生命周期: 模块初始化,sapi初始化,处理PHP请求,模块关闭,sapi关闭等就构成了整个CGI的生命周期。

web服务器只是接收请求并响应请求。至于多个请求可以用一个进程来处理,那么这个是fast-cgi的功能,它跟web服务器可以不在一个机器上。每种语言都能需要实现各自的fast-cgi,比如php-fpm php-spawn.这两个fastcgi可以跟nginx和lighttpd一块使用。

 epoll这些是web服务器使用的吧,用来处理多个io socket 句柄。

PHP的CGI实现了Fastcgi协议,是一个TCP或UDP协议的服务器接受来自Web服务器的请求, 当启动时创建TCP/UDP协议的服务器的socket监听,并接收相关请求进行处理。随后就进入了PHP的生命周期: 模块初始化,sapi初始化,处理PHP请求,模块关闭,sapi关闭等就构成了整个CGI的生命周期。

$php字符串详解
对于初学者来说,对于PHP字符串mbstring还是比较陌生的,下面我们就来介绍一下PHP字符串mbstring的具体应用。多国语言并存就意味着多字节,PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是1~3倍的差异了。采用PHP字符串mbstring可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用mb_strlen($str,’UTF-8′)。
$
Session
如果是不同的域呢?假如用户访问cs.test.com和daohang.test.com,两方程序都设置了session。那么session的结果
保存在同一个session文件中吗?
因为:服务器是统一管理session文件的存放的。而php引擎是根据phpsessionid的值确定要操作哪个session文件。session
文件名的格式是:"sess_[phpcookie值]"。依次寻找对应的session文件(于是在浏览器查看名为PHPSESSIONID的cookie,过
期时间是在会话结束后).所以,只要cs.test.com和daohang.test.com使用的是同一台服务器。
$
php开启错误提示
error_reporting(“E_ALL”)和ini_set(“display_errors”, “on”)的区别?后者的权限大于前者,后者是OFF的话,前者就算是E-ALL也没用。用php做网站开发的时候 , 为防止用户看到错误信息,而出现的不友好界面。故一般性会在php.ini里设置:display_errors = Off;不过在开发的时候,我们有时候需要打开错误信息。这时候,可以在php文件里设置:
1. ini_set("display_errors","On");
2. error_reporting(E_ALL);
不过有时候我们即使这样设置了 还是无法显示php里的语法错误。
这是由于php文件的语法错误导致该文件根本没有被执行,所以当然不会显示错误信息
解决方法:
假设这个php里有语法错误
你可以新建一个test.php
然后在该php里如下编辑:
ini_set("display_errors","On");
error_reporting(E_ALL);
include("目标文件");
这样,当你在运行test.php的时候 程序就会报其中的错误语法.
error_reporting(“E_ALL”)和ini_set(“display_errors”, “on”)的区别?
后者的权限大于前者,后者是OFF的话,前者就算是E-ALL也没用。

Iconv如果是编码本来是gbk,但是从utf8到gbk转,就会出现错误。。

今天弹出一个对话框
1,查了半天原来是没有进行htmlspecialchars,结果到客户端进行输出了。htmlentities() 函数把字符转换为 HTML 实体。用来将html边界标记当成普通的标记
这两个函数的功能都是转换字符为HTML字符编码,特别是url和代码字符串。防止字符标记被浏览器执行。使用中文时没什么区别,但htmlentities会格式化中文字符使得中文输入是乱码
htmlentities转换所有的html标记,htmlspecialchars只格式化& ' " < 和 > 这几个特殊符号.
$str = '<a href="demo.php?m=index&a=index&name=中文">测试页面</a>';
echo 'htmlentities指定GB2312编码:'.htmlentities($str,ENT_COMPAT,"GB2312").'';
echo 'htmlentities未指定编码:'.htmlentities($str).'';
$str = '<a href="demo.php?m=index&a=index&name=中文">测试页面</a>';
echo htmlspecialchars($str).'';
$
Php不能识别语法错误。不会自动检测异常并抛出异常,所以用throw..
$今天学习了php的__set和__get,还有面向对象的一些方法。。
上一节中,我们为每个属性做了设置和获取的方法,在PHP5 中给我们提供了专门为属 
性设置值和获取值的方法,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的, 
而是我们手工添加到类里面去的,像构造方法(__construct())一样,类里面添加了才会存在, 
可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加:
详细出处参考:http://www.jb51.net/article/20223.htm
$
if(!file_exists('abc.txt')){
        echo 'file not exists';
        exit;
}
$fp=fopen('abc.txt',"r");
while(!feof($fp)){
        $text=fgets($fp);
        if(trim($text)!=null){
                if(strstr($text,"query_number.php"))
                {
                        print 'aa';
                }
        }
}
必须加上if(!file_exists('abc.txt')){这个判断,否则不存在时会出现无限循环执行。。
$
Parse_str, 将一些字符进行了,转义,这个错误又摔倒了
    parse_str($parames,$parse_parames);
                             foreach($parse_parames as $k=>$v)
                             {
                              $parse_parames[$k]=str_replace(" ","+",$v);
                             }

parse_str()函数是对url查询字符串(url_code)进行解析并写入到数组中,如果原字符串中有+,则数组的value将+转化为空格,而数组的key将+转化为下划线。因为key不允许有空格

¥文件下载时,中文乱码问题,不同浏览器可能显示乱码。解决办法是nginx可以增加一个decode的模块。

¥!php的数组的key不能是数字字符串,数字字符串会转化成数字类型。


¥mysql可以的列字段可以区分大小写,加binary

¥mysql的列名可以包含= + - &等特殊符号,但是需要用··两个反引号引起来,查询时也需要引起来,为避免查询的时候麻烦,不通用,一般避免使用这些特殊字符做字段名

¥今天学习了下大型网站架构的技术 ,lvs squid等技术,还有yum和rpm的关系

¥PHP-spawn或php-fpm作为进程管理器跟php-cgi在一台机器上,而不是和nginx等服务端在一个机器上。可以实现跨机器。可以理解cgi就是使用标准输出和输入的模式吧,这样就跨语言了。

也就是web服务器先和php-fpm通信,php-fpm再和cgi解释器通信,起到中间层的作用

¥不管页面是什么编码,用ajax传中文都是用的utf-8的urlencode,但是如果是form传递则要看该form是什么编码。

¥apache自动对浏览器传过来的utf-8 encode的中文,先进行decode,然后再转化为我页面使用的gbk编码,apache真够智能的。

¥forum传递参数时,input必须加name属性,否则传递不了,因为浏览器是靠那么属性进行拼接的,比如name=key,value='value',get方式,浏览器就会自动拼接成&key=value&

空字符串(''),NULL和0是值相等而类型不一样!

应该很多人都还没有认清空字符串('')和NULL的关系吧!!现在我来说明一下吧:

先看一个例子:'' == NULL; '' === NULL;

运行之后会发现第一个为true,第二个为false!

为什么会这样呢?其实在PHP中空字符串和NULL都是以值为0存储的!而==只比较值,所以第一个为true

empty会检测变量是否为空、为零。当一个变量值为0,empty 认为这个变量等于空,即相当于没有设置。

比如检测$id 变量,当 $id=0 时,用empty 和 isset 来检测变量 $id 是否已经配置,两都将返回不同的结果。

双引号里的东西输入的时候能判断是否 包含 变量,如果包含 变量就一起输出

单引号里的就不一样,不判断是否有变量,就全部当成字符串 输出

PHP的函数是不区分大小写的,但是变量却是区分大小写的)

判断字符串是否存在用strpos,必须用恒等号===false才行,因为位置0==false

$

今天搞了一个小时愣是没解决掉:

Fatal error:  Call toundefined function mcrypt_module_open() in

http://blog.chinaunix.net/uid-327644-id-2132835.html

这篇文章有介绍。。

如果在php.ini中加上这个配置,会出现警告重复加载某个模块,如果去掉这个配置,就没警告了,不过总算配好了。需要加载3个相关文件才可以。并且用yum会自动修改php.ini配置文件,无需在进行修改。

$

Php异常和java,python的异常,试图通过异常捕获notice,但是不对.也就是php极少使用异常.PHP5只能处理严重的逻辑异常,其他的异常都得用户自己抛出.这是PHP5跟其他语言(如JAVA)的区别

PHP5的异常不像其他语言一样可以不抛出异常而能捕捉到所有的异常,换句话说,在PHP5中异常被划分为2个部分,即系统异常和用户定义异常.
(1) 系统异常;
即PHP5语言本身已经定义的异常,用户可以不必要抛出此类异常也能捕捉到此类异常;
(2)用户自定义异常;
即PHP5允许用户自己定义异常,允许用户抛出自己定义的异常;
(3) PHP5只能处理严重的逻辑异常,其他的异常都得用户自己抛出.这是PHP5跟其他语言(如JAVA)的区别

$

正则表达式

preg_match,的正则表达式要加上斜线或其他两边相同的间隔符,不加不对。。
$a=preg_match("/正则表达式/", $str);
 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'

$

Glabal和define的区别,一个放内存,一个放硬盘吗?
http://blog.csdn.net/dreamfine/article/details/8117136

$
函数中的变量如果加上static,外界访问不到,但是用global外界可以访问。
一个文件里写php变量,如果不声明global,那么另一个文件的构造函数中引用不到。改成类的静态变量就行了。


原创粉丝点击