<?php
其他
isset() 变量是否存在
boolean empty() 检查变量是否存在,并判断值是否为非空或非0
void unset() 销毁变量
header('Content-Type: text/html; charset=utf-8');
method_exists($obj, $method)    判断对象的方法是否可用
file_exists($file)    判断文件是否存在
function_exists();
class_exists($class_name);
gettype();获取数据类型
set_magic_quotes_runtime() 0 for off, 1 for on 当遇到反斜杆、单引号,将会自动加上一个反斜杆,保护系统和数据库的安全
ini_set(,);
string getcwd ( void )  取得当前工作目录
mb_internal_encoding('utf-8')
DIRECTORY_SEPARATOR     win \, Linux /
spl_autoload_register(array('Common','autoload'));注册Common类的autoload为__autoload功能相同的方法
数据类型转换
强制转换
$i = 1;
$j = (int)$i;
settype
$i = 1;
settype($i,'float');
floatval
$i = 1;
$j = floatval ($i)

安全
function strReplace($str)
{
$strResult = $str;
if(!get_magic_quotes_gpc())//判断设置是否开启
{
$strResult = addslashes($strResult);//转换sql语句特殊字符
}
return $strResult;
}

function quotes($content)
{
//如果magic_quotes_gpc=Off,那么就开始处理
if (!get_magic_quotes_gpc())
{
//判断$content是否为数组
if (is_array($content))
{
//如果$content是数组,那么就处理它的每一个单无
foreach ($content as $key=>$value)
{
$content[$key] = addslashes($value);
}
}
else
{
//如果$content不是数组,那么就仅处理一次
addslashes($content);
}
}
//返回$content
return $content;
}

编码转换
string mb_convert_encoding ( string $str , string $to_encoding [, mixed $from_encoding ] )
iconv();

时间
date_default_timezone_set("PRC");
date("Y-m-d H:i:s");
time();
date("Y-m-d H:i:s",time()+3600)
ini_set('date.timezone', 'PRC');
msec sec microtime() 以秒返回时间戳 explode(' ', microtime())
$mtime = explode(' ', microtime());
$s = $mtime[1] + $mtime[0];
number_format($s,5);//保留5位小数

魔术方法
__construct() 当实例化一个对象的时候,这个对象的这个方法首先被调用。
__destruct() 当删除一个对象或对象操作终止的时候,调用该方法。
__get() 当试图读取一个并不存在的属性的时候被调用。
__set() 当试图向一个并不存在的属性写入值的时候被调用。
__call() 当试图调用一个对象并不存在的方法时,调用该方法。
__toString() 当打印一个对象的时候被调用
__clone() 当对象被克隆时,被调用
__isset()
__unset()
__autoload($classname)
__sleep()
__wakeup()

系统常量
__FILE__ 当前文件名
__LINE__ 当前行数
__FUNCTION__ 当前函数名
__CLASS__ 当前类名
__METHOD__ 当前对象的方法名
PHP_OS 当前系统
PHP_VERSION php版本
DIRECTORY_SEPARATOR 根据系统决定目录的分隔符 /\
PATH_SEPARATOR 根据系统决定环境变量的目录列表分隔符 ; :
E_ERROR 1
E_WARNING 2
E_PARSE 4
E_NOTICE 8
M_PI    3.141592
$_SERVER
$_ENV 执行环境提交至脚本的变量
$_GET
$_POST
$_REQUEST
$_FILES
$_COOKIE
$_SESSION
$_GLOBALS

输出
echo   //Output one or more strings
print    //Output a string
print_r()  //打印关于变量的易于理解的信息。
var_dump()  //打印变量的相关信息
var_export()  //输出或返回一个变量的字符串表示
printf("%.1f",$num)  //Output a formatted string
sprintf()  //Return a formatted string

错误处理
@1/0
error_reporting(E_ALL) 显示所有错误
error_reporting(0)
trigger_error("Cannot divide by zero", E_USER_ERROR);
try
{
throw new Exception("执行失败");
}
catch (Exception $ex)
{
echo $ex;
}

error_reporting(E_ERROR | E_WARNING | E_PARSE); 用来配置错误信息回报的等级

字符串处理
string trim("eee ") trim ('ffffe','e')  //ltrim rtrim
array explode(".", "fff.ff.f") 按指定字符切割
string implode(".", $array)  别名:join   把数组值数据按指定字符连接起来
array str_split("eeeeeeee",4) 按长度切割字符串
array split("-","fff-ff-f") 按指定字符切割
int strlen('ffffffff')  取字符长度
string substr ( string $string , int $start [, int $length ] )
substr($a,-2, 2) 截取字符
string mb_substr(string str, int start [, int length [, string encoding]])
int substr_count($text, 'is') 字符串出现的次数
string strstr($text, 'h') 第一次出现h后的字符串   //别名:strchr
int strpos($text, 'h') 第一次出现h的位置
strrpos();最后一次出现h的位置
strrchr('aa.jpg','.'); .jpg
str_replace('a', 'ttt', $t) 把$t里的'a'替换为'ttt'
strtr($t,'is','pef') 把$t中i替换成p,s替换成e,f被忽略
strtr("hi all, I said hello", array("hello" => "hi")) 把'hello'转换成'hi'
string md5_file('1.txt',false) 文件数据md5加密
string md5()
int strcmp(string str1, string str2) 字符串比较
int strcasecmp(string str1, string str2) 忽略大小写
string str_pad($i, 10, "-=", STR_PAD_LEFT) 在原字符左边补'-=',直到新字符串长度为10
STR_PAD_RIGHT
STR_PAD_BOTH
string str_repeat('1', 5) 重复5个1
void parse_str('id=11'); echo $id; 将字串符解析为变量
array preg_grep("/^(\d+)?\.\d+$/", array(11.2,11,11.2)) 匹配数据
array preg_split ("/[\s,]+/", "hypertext language,programming"); 按指定的字符切割
array pathinfo(string path [, int options]) 返回文件路径的信息
string basename ( string path [, string suffix] ) 返回路径中的文件名部分
string dirname ( string path )  $_SERVER[PHP_SELF]  返回路径中的目录部分
string nl2br("foo isn't\n bar") "foo isn't<br> bar" 把换行转成<br>
string chr ( int ascii )  chr(97) ---> a
int ord('a')  97
mixed str_word_count ( string string [, int format [, string charlist]] )
string str_shuffle ('abc') 打乱字符串顺序
string strrev($str) *         翻转一个字符串
string strtolower($str) *     将字符串 $str 的字符全部转换为小写的
string strtoupper($str) *     将字符串 $str 的字符全部转换为大写的
string ucfirst ($str)   *       将字符串 $str 的第一个单词的首字母变为大写。
string ucwords($str)    *        将字符串 $str 的每个单词的首字母变为大写。

string addslashes("I'm") I\'m 使用反斜线引用字符串 这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)
get_magic_quotes_gpc()
string stripcslashes("I\'m") I'm 将用addslashes()函数处理后的字符串返回原样
strip_tags("<p>tt</p>", '<p>') 去除html、xml、php标记,第二个参数用来保留标记
string urlencode(string str)
string urldecode(string str)
string htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES) 转换特殊字符为HTML字符编码
&lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
ENT_COMPAT –对双引号进行编码,不对单引号进行编码
ENT_QUOTES –对单引号和双引号进行编码
ENT_NOQUOTES –不对单引号或双引号进行编码
string htmlentities('<p>ff</p>', ENT_QUOTES) 转换特殊字符为HTML字符编码,中文会转成乱码

数组
$a = array();
$a = array(1,2,3);
$a = array('name'=>'zhangsan');
int count( mixed var [, int mode] ) 别名:sizeof() 取数组长度
string implode(".", $array)  别名:join   把数组值数据按指定字符连接起来
array explode(".", "fff.ff.f") 按指定字符切割
array range(0, 6, 2) 返回数组 array(0,2,4,6) 第一个参数为起使数,第二个参数为结束数,第三个参数为数据增加步长
void unset ( mixed var [, mixed var [, ...]] )
array array_pad ($a, 5, 's')用's'将数组填补到指定长度
bool shuffle ( array $array )  将数组打乱
mixed array_rand ( array input [, int num_req] )从数组中随机取出一个或多个单元的索引或键名
array array_count_values ( array input )统计数组中所有的值出现的次数
array array_combine ( array keys, array values ) 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
bool array_key_exists ( mixed key, array search )检查给定的键名或索引是否存在于数组中
mixed array_search ( mixed needle, array haystack [, bool strict] )在数组中搜索给定的值,如果成功则返回相应的键名
bool is_array ( mixed var )
bool in_array ( mixed needle, array haystack [, bool strict] )检查数组中是否存在某个值
number array_sum ( array array )计算数组中所有值的和
array array_unique ( array array )移除数组中重复的值

mixed array_shift ( array &array )将数组开头的单元移出数组
int array_unshift ( array &array, mixed var [, mixed ...] )在数组开头插入一个或多个单元
int array_push($a, "3", 1) 把'3'、'1'压入$a,将一个或多个单元压入数组的末尾(入栈),第二个参数开始就是压入的数据
mixed array_pop ( array &array )将数组最后一个单元弹出(出栈)

mixed reset ( array &array )将数组的内部指针指向第一个单元
mixed current ( array &array ) 返回数组中的当前单元 值
mixed next ( array &array )
mixed prev ( array &array )
mixed end ( array &array ) 返回数组中的最后一个单元 值
mixed key ( array &array ) 返回数组中的当前个单元 键

array array_keys ( array input [, mixed search_value [, bool strict]] ) 返回数组中所有的键名
array array_values ( array input ) 返回数组中所有的值
array array_splice ( array $input, int offset [, int length [, array replacement]] ) 把数组中的一部分去掉并用其它值取代
array array_merge ( array array1 [, array array2 [, array ...]] )合并一个或多个数组
array array_flip ( array trans )交换数组中的键和值
int extract( array var_array [, int extract_type [, string prefix]] ) 从数组中将变量导入到当前的符号表
array compact ( mixed varname [, mixed ...] ) 建立一个数组,包括变量名和它们的值

bool sort ( array &array [, int sort_flags] )从最低到最高重新安排
bool natsort($a)    用“自然排序”算法对数组排序
bool rsort ( array &array [, int sort_flags] )对数组进行逆向排序(最高到最低)
bool asort ( array &array [, int sort_flags] )对数组进行排序并保持索引关系
bool arsort ( array &array [, int sort_flags] ) 对数组进行逆向排序并保持索引关系
bool ksort ( array &array [, int sort_flags] )对数组按照键名排序
bool krsort ( array &array [, int sort_flags] )对数组按照键名逆向排序

usort(array array, callback cmp_function)  使用用户自定义的比较函数对数组中的值进行排序
回调函数返回值作用:
0 不做操作
-1 将$a所在单元先前移动
1 位置不发生变化

如果usort($a ,"cmp"); 中的$a数组只有2个值的情况下,很简单,cmp()第一个参数为$a[1],cmp()第二个参数为$a[0]; 通过cmp比较,返回1则$b>$a , $a[0],$a[1]按原序列排; 返回-1 则反之,$a[0], $a[1]互换位置;返回 0则表示两个数字大小一样,如果是文字的按照第一个字母的ASCII值比较.
如果usort($a ,"cmp"); 中的$a数组超过2个值的情况, 则需要通过递归完成排序

array array_filter ( array input [, callback callback] ) 用回调函数过滤数组中的单元
bool array_walk ( array &array, callback funcname [, mixed userdata] ) 对数组中的每个成员应用用户函数
array array_map ( callback callback, array arr1 [, array ...] )将回调函数作用到给定数组的单元上

array array_fill ( int start_index, int num, mixed value ) 用给定的值填充数组
array_fill(5, 3, 'a')-->array(5=>'a',6=>'a',7=>'a')
array array_chunk ( array input, int size [, bool preserve_keys] )将一个数组分割成多个

smarty
模板引擎将不分析
<!--{literal}-->
<script>
function t() {
}
</script>
<!--{/literal}-->
读取配置文件
<!--{config_load file="config.s"}-->
<!--{#site_url#}-->
<!--{$smarty.config.site_url}-->
引入文件
<!--{include file="index2.html"}-->
<!--{include_php file="/path/to/load_nav.php"}--> $trusted_dir 指定目录下的文件
捕获模板输出的数据
<!--{capture name='eee'}-->
fffffffff
<!--{/capture}-->
<!--{$smarty.capture.eee}-->
循环
<{section name=loop loop=$News_IN}>
<{$News_IN[loop].NewsID}>
<{/section}>

<!--{section name=t loop=$data}-->
<tr>
<td><!--{$data[t].username}--></td>
</tr>
<!--{/section}-->

<{foreach from=$newsArray item=newsID key=k}>
新闻编号:<{$newsID.newsID}><br>
新闻内容:<{$newsID.newsTitle}><br><hr>
<{/foreach}>
判断
<!--{if true}-->
1111
<!--{else}-->
22222222
<!--{/if}-->
时间
{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
%Y年%m月%d日 乱码
<!--{$smarty.now|date_format:"%Y年%m月%d日 %H时%M分%S秒"}-->
修改插件:plugins/modifier.date_format.php
$format = mb_convert_encoding($format,'gbk','utf-8');
return mb_convert_encoding(strftime($format, $timestamp),'utf-8','gbk');

局部不缓存
html:
<!--{cacheless  a="aaa" b="bbbb"}-->
<!--{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}-->
<!--{/cacheless}-->
php:
$smarty->register_block('cacheless', 'smarty_block_dynamic', false);//true:缓存,false:不缓存
function smarty_block_dynamic($param, $content, &$smarty)
{
return $content;
}

php:
function insert_kk()//方法名前必须有"insert"
{
return date('Y-m-d H:i:s');
}
html:
<!--{insert name="kk"}-->
自定义方法
注册方法
php
$smarty->register_function('test1', 'test');
function test($p)
{
return 'ffffffffff';
}
html:
<!--{test1 name="ff"}-->
------------------------------------------------
方法自定义
插件文件方式定义方法
function.test.php 文件存在plugins目录下,方法名:smarty_function_test($params, &$smarty)
function smarty_function_test($params, &$smarty)
{
return 'fff';
}
html调用:
<!--{test name='aa' p='ff'}-->
----------------------------------------------------
插入方法
插件文件:insert.kk.php文件存于plugins目录下
function smarty_insert_kk()
{
return date('Y-m-d H:i:s');
}
php:
function insert_kk()//方法名前必须有"insert"
{
return date('Y-m-d H:i:s');
}
html:
<!--{insert name="kk"}-->
-------------------------------------------------
管道符自定义方法
插件文件方式定义方法
modifier.test.php 文件存在于plugins目录下,方法名: function smarty_modifier_test($str, $str2)
function smarty_modifier_test($str, $str2)
{
return $str.$str2;
}
html调用:
<!--{'ff'|test:'tt'}-->

php:
function eee($a)
{
return 'ffffffffffffff';
}
html:
<!--{''|@eee}-->
if语句
eq相等,==
ne、neq不相等,
gt大于
gte、ge大于等于,
lte、le 小于等于,
not非, mod求模。
is [not] div by是否能被某数整除,
is [not] even是否为偶数,
$a is [not] even by $b 即($a / $b) % 2 == 0
is [not] odd是否为奇
$a is not odd by $b即($a / $b) % 2 != 0

XML
sax
xml:
<--?xml version="1.0" encoding="utf-8"?-->
<books>
<book>
<author>Jack Herrington</author>
<title>PHP Hacks</title>
<publisher>O'Reilly</publisher>
</book>
<book>
<author>Jack Herrington</author>
<title>Podcasting Hacks</title>
<publisher>O'Reilly</publisher>
</book>
<book>
<author>作者</author>
<title>标题</title>
<publisher>出版者</publisher>
</book>
</books>
php:
$g_books = array();
$g_elem = null;

function startElement( $parser, $name, $attrs )
{
global $g_books, $g_elem;
if ( $name == 'BOOK' ) $g_books []= array();
$g_elem = $name;
}

function endElement( $parser, $name )
{
global $g_elem;
$g_elem = null;
}

function textData( $parser, $text )
{
global $g_books, $g_elem;
if ( $g_elem == 'AUTHOR' ||
$g_elem == 'PUBLISHER' ||
$g_elem == 'TITLE' )
{
$g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text;
}
}

$parser = xml_parser_create();

xml_set_element_handler( $parser, "startElement", "endElement" );
xml_set_character_data_handler( $parser, "textData" );

$f = fopen( '1.xml', 'r' );

while($data = fread( $f, 4096 ))
{
xml_parse( $parser, $data );
}

xml_parser_free( $parser );

foreach( $g_books as $book )
{
echo $book['TITLE']." - ".$book['AUTHOR']." - ";
echo $book['PUBLISHER']."<br>";
}
DomDocument()
xml:
<--?xml version="1.0" encoding="utf-8"?-->
<books>
<book>
<author>Jack Herrington</author>
<title>PHP Hacks</title>
<publisher>O'Reilly</publisher>
</book>
<book>
<author>Jack Herrington</author>
<title>Podcasting Hacks</title>
<publisher>O'Reilly</publisher>
</book>
<book>
<author>作者</author>
<title>标题</title>
<publisher>出版者</publisher>
</book>
</books>
php读取:
$doc = new DOMDocument();
$doc->load( "1.xml");

$books = $doc->getElementsByTagName( "book" );
foreach( $books as $book )
{
$authors = $book->getElementsByTagName( "author" );
$author = $authors->item(0)->nodeValue;

$publishers = $book->getElementsByTagName( "publisher" );
$publisher = $publishers->item(0)->nodeValue;

$titles = $book->getElementsByTagName( "title" );
$title = $titles->item(0)->nodeValue;

echo "$title - $author - $publisher<br>";
}
php生成:
$books = array();
$books [] = array(
'title' => 'PHP Hacks',
'author' => 'Jack Herrington',
'publisher' => "O'Reilly"
);
$books [] = array(
'title' => 'Podcasting Hacks',
'author' => 'Jack Herrington',
'publisher' => "O'Reilly"
);

$doc = new DOMDocument();
$doc->formatOutput = true;
$dom->encoding = 'utf-8';
$r = $doc->createElement( "books" );
$doc->appendChild( $r );

foreach( $books as $book )
{
$b = $doc->createElement( "book" );
$author = $doc->createElement( "author" );
$author->appendChild($doc->createTextNode( $book['author'] ));
$b->appendChild( $author );

$title = $doc->createElement( "title" );
$title->appendChild($doc->createTextNode( $book['title'] ));
$b->appendChild( $title );

$publisher = $doc->createElement( "publisher" );
$publisher->appendChild($doc->createTextNode( $book['publisher'] ));
$b->appendChild( $publisher );
$r->appendChild( $b );
}

echo $doc->saveXML();
echo $doc->save('222.xml');
SimpleXML
xml:
<books>
<book>
<author>Jack Herrington</author>
<title>PHP Hacks</title>
<publisher>O'Reilly</publisher>
</book>
</books>
php:
$xml = new SimpleXMLElement('1.xml', NULL, TRUE);
echo $xml->book[0]->author."___".$xml->book[0]->title."___".$xml->book[0]->publisher;

正则
ereg系列的正则表达式不需要定届符,preg系列的才需要,并且定界符可以自己选择,只有前后一对就行,比如我们一般使用/符号,但是如果里面有/需要匹配那么就需要使用\/来表示,当/需要出现多次的时候,这样就不方便,我们就可以使用其他的定界符,比如|

正则特殊字符
. \ + * ? [ ^ ] $ ( ) { } = ! < > | :
由原子(普通字符,如英文字符)、
元字符(有特殊功用的字符)
模式修正字符
一个正则表达式中,至少包含一个原子

全部符号解释
\  将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
^  匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$  匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
*  匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+  匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?  匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n}  n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,}  n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}  m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
?  当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
.  匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
(pattern)  匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
(?:pattern)  匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'indust(?:ry|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern)  正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)  负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y  匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz]  字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz]  负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z]  字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z]  负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
\b  匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B  匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx  匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\d  匹配一个数字字符。等价于 [0-9]。
\D  匹配一个非数字字符。等价于 [^0-9]。
\f  匹配一个换页符。等价于 \x0c 和 \cL。
\n  匹配一个换行符。等价于 \x0a 和 \cJ。
\r  匹配一个回车符。等价于 \x0d 和 \cM。
\s  匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S  匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t  匹配一个制表符。等价于 \x09 和 \cI。
\v  匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w  匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W  匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn  匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.
\num  匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。
\n  标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm  标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml  如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un  匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。
例子
/\b([a-z]+)\b/i 单词数量
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/  将一个URL解析为协议、域、端口及相对路径
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章节的位置
/[-a-z]/ A至z共26个字母再加一个-号。
/ter\b/ 可匹配chapter,而不能terminal
/\Bapt/ 可匹配chapter,而不能aptitude
/Windows(?=95 |98 |NT )/ 可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次的检索匹配。
^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$ Email 合法格式检查
^[0-9]+$ 纯数据检查
^[0-9a-z]{1}[0-9a-z\-]{0,19}$ 用户名检查,字母和数字开始,只能含字母、数字、横杠

模式修正符
i 忽略大小写
s 如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符
e 只用在preg_replace(),在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。
如:
$p = '/\[colorFont\](.+?)\[\/colorFont\]/ie';
$t = '"<img src='color.php?t=".urlencode("\1")."\'/>"';
ecoh preg_replace($p,$t,$string);
这里必须加上e修正,才能将匹配到的内容用urlencode处理
U 贪婪模式,最大限度匹配
如:/a[\w]+?e/U匹配abceadeddd中的abceade而不是abce,如果不加U修正,则匹配abce
A 强制从字符串开头匹配,即自动在模式开头加上^
m 当设定了此修正符,“行起始” ^ 和“行结束” $ 除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。
D 模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前。如果设定了 m 修正符则忽略此选项
例子
匹配中文
preg_match_all('/[^\x00-\x80]+/', '中华s人s民', $a)
如果你的文件是gb2312的,用/[\xa0-\xff]{2}/
如果是utf8的,用/[\xe0-\xef][\x80-\xbf]{2}/
匹配邮箱地址
preg_match('/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/', 'shao@gmail.com')
替换空白字符
$s = preg_replace('/[\s\v]+/','','    sss sdd ss ');
替换
$string = "April 15, 2003";
$pattern = "/(\w+) (\d+), (\d+)/i";
$replacement = "\${1}1,\${3}1-$2";
echo preg_replace($pattern, $replacement, $string);
匹配帐号是否合法(字母开头,允许5-6字节,允许字母数字下划线)
preg_match('/^[a-zA-Z][a-zA-Z0-9_]{4,5}$/', 'a011a')
匹配数字
/^-\d*$/ 匹配负整数
/^-?\d*$/ 匹配整数
匹配浮点数
preg_match("/^-?(\d*.\d*|0.\d*|0?.0+|0)$/", "11")
匹配电话号码
preg_match("/^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7}){1,1}(\-[0-9]{1,4}){0,1}$/","0511-22345678-11")
匹配手机号码
preg_match("/^1(3|5)\d{9}$/","13717897211")

文件处理
文件属性
file_exists('1.php') 文件或目录是否存在
filesize() 取得文件大小
is_readable() 判断给定文件名是否可读
is_writable() 判断给定文件名是否可写
is_executable() 判断给定文件名是否可执行
filectime() 获取文件的创造时间
filemtime() 获取文件的修改时间
fileatime() 获取文件的访问时间
stat() 获取文件大部分属性值
解析目录
basename() 返回路径中的文件名部分
dirname() 返回目录
pathinfo() 返回目录名、基本名和扩展名的关联数组
遍历目录
opendir() 打开指定目录
readdir() 读取指定目录
closedir() 关闭指定目录
rewinddir() 倒回目录句柄
$dir_handle=opendir('.');
while($file=readdir($dir_handle))
{
echo filesize($file).'___'.$file.'<br>';
}
closedir($dir_handle);
建立和删除目录
mkdir() 创建目录
rmdir() 删除空目录
文件操作
fopen()
fclose()
fwrite() 写入文件
fputs() fwrite的别名
file_put_contents($文件名,$内容) 把内容存成文件
file_get_contents() 从文件读出内容
文件读取
fread()
stream_get_contents()  和 file_get_contents()一样,但需要先fopen()文件
fgets() 从文件指针中读取一行
feof() 测试文件指针是否到了文件结束的位置
fgetc() 从文件指针中读取字符
file() 把整个文件读入一个数组中
readfile() 读入一个文件并写入到输出缓冲
ftell()返回文件指针的当前位置
fseek() 移动文件指针到指定的位置
rewind() 移动文件指针到文件的开头
flock() 文件锁定
copy() 复制文件
unlink() 删除文件
ftruncate() 将文件截断到指定的长度
rename() 重命名文件或目录
文件控制
chgrp
chmod ( string $filename , int $mode )
chown
保存读取文件
-----------把内容存成文件
$cache_file = fopen('f:\1.txt', 'w+');
fwrite($cache_file, $t);
-----------把内容存成文件
$s = "内容";
file_put_contents('f:/2.txt',$s);
-----------把文件内容读成字符串
$s = file_get_contents('f:/2.txt');
echo $s;
-----------把文件内容按行读成字符串
$handle = @fopen("f:/2.txt", "r");
if ($handle)
{
while (!feof($handle))
{
$buffer = fgets($handle, 4096);
echo $buffer.'<br>';
}
fclose($handle);
}
----------

fsockopen
resource fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )

$fp = fsockopen("www.test.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
//$out = "GET / HTTP/1.1\r\n";
//$out = "GET http://www.test.com/2.php?id=333 HTTP/1.1\r\n";
$out = "POST http://www.test.com/2.php HTTP/1.1\r\n";
//header结束是两个换行
$out .= "Host: www.test.com\r\n";
$out .= "Connection: Close\r\n";
$out .= "Referer: http://www.google.com\r\n";//来源地址
$out .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3\r\n";//伪造浏览器
$out .= "Cookie: username=admin; password=admin\r\n";

$out .= "Content-type: application/x-www-form-urlencoded\r\n";//post请求,添加此行,get不需要
$str = "id=ffff&id2=eeeeeeee";//post传递的参数
$out .= "Content-Length: ".strlen($str)."\r\n\r\n";//post请求,添加此行,get不需要
$out .= $str;//post的内容,get不需要

fwrite($fp, $out);//写入文件(可安全用于二进制文件)
//fputs($fp, $out);//写入文件(可安全用于二进制文件)

//读取请求地址设置的cookie值
//下面的判断,读到空行时,说明头已经结束了,接下来是内容。
while( ($line=trim(fgets($fp))) != "" )
{
$header.=$line; /*   */
if(strstr($line,"Set-Cookie:"))
{
list($coo,$cookieLine)=explode(" ",$line);
$cookieStr[] = $cookieLine; //所有setcookie的值
}
}
var_dump($cookieStr);

//读取返回的内容项
$str = '';
while (!feof($fp)) {//测试文件指针是否到了文件结束的位置
$str .= fgets($fp, 128);//从文件指针中读取一行并过滤掉 HTML 标记
}
var_dump($str);
fclose($fp);//关闭一个已打开的文件指针
}

session/cookie
setcookie("MyCookie[foo]", 'Testing 1', time()+3600)
session_start()
ini_set('session.cookie_lifetime',0); session对应cookie存活时间
ini_set('session.save_path', 'dir');
ini_set('session.save_path', '2;session');session分两级存放
ini_set('session.name','SNS');
客户端禁用Cookie
session.use_trans_sid = 1 开启url传递sessionId php.ini
session销毁

mysql
$link = mysql_connect('localhost','root','root') or die(mysql_errno());
mysql_select_db('test') or die (mysql_errno());
mysql_query('SET NAMES gbk');
$sql = "SELECT * FROM test LIMIT 0,20";
$result = mysql_query($sql) or die(mysql_errno());
while($msg = mysql_fetch_array($result)){
print_r($msg);
}
mysql_free_result($result);
mysql_close($link);

mysqli
查询
-------------------------------过程
$db_host="localhost";   //连接的服务器地址
$db_user="root";    //连接数据库的用户名
$db_psw="root";     //连接数据库的密码
$db_name="test"; //连接的数据库名称
$mysqli=mysqli_connect($db_host,$db_user,$db_psw,$db_name);
mysqli_query($mysqli,'SET NAMES utf8');
$query="select * from users";
$result=mysqli_query($mysqli,$query);
while($row =mysqli_fetch_array($result)) //循环输出结果集中的记录
{
echo ($row['id'])."<br>";
echo ($row['username'])."<br>";
echo ($row['password'])."<br>";
echo "<hr>";
}
mysqli_free_result($result);
mysqli_close($mysqli);
-------------------------------对象
$db_host="localhost";   //连接的服务器地址
$db_user="root";    //连接数据库的用户名
$db_psw="root";     //连接数据库的密码
$db_name="test"; //连接的数据库名称
$mysqli=new mysqli($db_host,$db_user,$db_psw,$db_name);
$mysqli->query('SET NAMES utf8');
$query="select * from users";
$result=$mysqli->query($query);
if ($result)
{
if($result->num_rows>0) //判断结果集中行的数目是否大于0
{
while($row =$result->fetch_array()) //循环输出结果集中的记录
{
echo ($row[0])."<br>";
echo ($row[1])."<br>";
echo ($row[2])."<br>";
echo "<hr>";
}
}
}
else
{
echo "查询失败";
}
$result->free();
$mysqli->close();

增、删、改
$mysqli=new mysqli("localhost","root","root","sunyang");//实例化mysqli
$query="delete from employee where emp_id=2";
$result=$mysqli->query($query);
if ($result){
echo "删除操作执行成功";
}else{
echo "删除操作执行失败";
}
$mysqli->close();

绑定结果
$mysqli=new mysqli("localhost","root","root","test");      //实例化mysqli
$query="select * from users";
$result=$mysqli->prepare($query);                 //进行预准备语句查询
$result->execute();                           //执行预准备语句
$result->bind_result($id,$username,$password);         //绑定结果
while ($result->fetch()) {
echo $id.'_';
echo $username.'_';
echo $password;
echo "<br>";
}
$result->close();                             //关闭预准备语句
$mysqli->close();                             //关闭连接

绑定参数
$mysqli=new mysqli("localhost","root","root","test");          //实例化mysqli
$query="insert into users (id, username, password)   values ('',?,?)";
$result=$mysqli->prepare($query);
$result->bind_param("ss",$username,$password);            //绑定参数 I:integer D:double S:string B:blob
$username='sy0807';
$password='employee7';
$result->execute();                               //执行预准备语句
$result->close();
$mysqli->close();

绑定参数、绑定结果
$mysqli=new mysqli("localhost","root","root","test");      //实例化mysqli
$query="select * from users where id < ?";
$result=$mysqli->prepare($query);
$result->bind_param("i",$id);                 //绑定参数
$id=10;
$result->execute();
$result->bind_result($id,$username,$password);         //绑定结果
while ($result->fetch()) {
echo $id."_";
echo $username."_";
echo $password;
echo "<br>";
}
$result->close();
$mysqli->close();

多条查询语句
$mysqli=new mysqli("localhost","root","root","test");          //实例化mysqli
$query = "select id from users ;";
$query .= "select id from test ";
if ($mysqli->multi_query($query)) {                   //执行多个查询
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
echo $row[0];
echo "<br>";
}
$result->close();
}
if ($mysqli->more_results()) {
echo ("-----------------<br>");                       //连个查询之间的分割线
}
} while ($mysqli->next_result());
}
$mysqli->close();//关闭连接

pdo
setAttribute
$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); //设置属性

PDO::ATTR_CASE: 强制列名变成一种格式,详细如下(第二个参数):
PDO::CASE_LOWER: 强制列名是小写.
PDO::CASE_NATURAL: 列名按照原始的方式
PDO::CASE_UPPER: 强制列名为大写.
PDO::ATTR_ERRMODE: 错误提示.
PDO::ERRMODE_SILENT: 不显示错误信息,只显示错误码.
PDO::ERRMODE_WARNING: 显示警告错误.
PDO::ERRMODE_EXCEPTION: 抛出异常.
PDO::ATTR_ORACLE_NULLS (不仅仅是ORACLE有效,别的数据库也有效): )指定数据库返回的NULL值在php中对应的数值。
PDO::NULL_NATURAL: 不变.
PDO::NULL_EMPTY_STRING: Empty string is converted to NULL.
PDO::NULL_TO_STRING: NULL is converted to an empty string.

setFetchMode(PDO::FETCH_ASSOC)
PDO::FETCH_ASSOC -- 关联数组形式
PDO::FETCH_NUM   -- 数字索引数组形式
PDO::FETCH_BOTH  -- 两者数组形式都有,这是缺省的
PDO::FETCH_OBJ   -- 按照对象的形式,类似于以前的 mysql_fetch_object()

mysql
查询
$db = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
$db->query('set names utf8');
$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); //设置属性
$result->setFetchMode(PDO::FETCH_ASSOC);
$sql="SELECT * FROM user";
$result = $db->query($sql);
foreach ($result as $row)
{
var_dump($row);
}
$db = null;
增、删、改、事务开启
try
{
$db = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
$db->beginTransaction();
$a = $db->exec("insert into users (id, username, password) values ('', 'Joe', 'Bloggs')");
if($a == false)
{
throw new Exception("sql1执行失败");
}
$b = $db->exec("insert into users (id, username, password,kkk) values ('', 'Joe', 'Bloggs')");
if($b == false)
{
throw new Exception("sql2执行失败");
}
$db->commit();
$db = null;
}
catch (Exception $ex)
{
echo $ex;
$db->rollback();
}
预处理 插入
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $db->prepare("INSERT INTO user (username, password) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value); //插入一行
$name = 'one';
$value = '1';
$stmt->execute();//使用不同的值插入另一行
$name = 'two';
$value = '2';
$stmt->execute();
预处理 查询
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $db->prepare("select * from user where username = :name");
$stmt->bindParam(':name', $name);
$name = 'one';
$stmt->execute();
var_dump($stmt->fetchAll());

oracle
$pdo= new PDO("oci:dbname=//172.19.36.13:1521/o9i",shao,shao);

$sql="select table_name as tname from user_tables";
$query = $pdo->prepare($sql);
$query->execute();

for($i=0; $row = $query->fetch(); $i++){
#print_r($row);
echo $i." - ".$row[0]."<br/>";
echo $i." - ".$row['TNAME']."<br/>";
}

mssql
$pdo= new PDO('mssql:host=127.0.0.1/SQLEXPRESS;dbname=test','sa','123456');

缓存
Memcache
.下载memcached, http://www.danga.com/memcached/ ; 2.解压,比如放在 D:\memcached-1.2.1 ; 3.DOS下输入‘D:\memcached-1.2.1\memcached.exe -d install’,进行安装(注意‘’不要输入); 4.再次输入‘D:\memcached-1.2.1\memcached.exe -d start’启动memcached。   注意:memcached以后会随机启动。这样memcached就已经安装完毕了。

$memcache = new Memcache;
$memcache->addServer('172.19.5.199',11211);
$memcache->addServer('172.19.5.13',11211);
//$memcache->connect('localhost', 11211) or die ("Could not connect");
//$version = $memcache->getVersion();
//echo "Server's version: ".$version;
$memcache->set('key3',array(1,2,3));
var_dump($memcache->get('key3'));

ob
ob_start()
$content = ob_get_contents();
ob_clean();
$cache_file = fopen('f:\1.html', 'w+');
fwrite($cache_file, $content);

页面静态化--------------------------------------
ob_start();
$static_file = '1.html';//静态页面
$php_file = basename(__FILE__);//当前动态页面
if (!file_exists($static_file) ||
((filemtime($static_file)+10) < time()) || //缓存固定时间
filemtime($php_file) > filemtime($static_file)) //源文件已修改
{
echo '静态页面示例';
echo 'erer';
$c = ob_get_contents();
ob_clean();
file_put_contents($static_file, $c);
}
$s = file_get_contents($static_file);
echo $s;
-------------------------------------------------
ob_implicit_flush($p)  $p:0:关闭 1:开启(每次输出后都自动刷新,而不再需要去调用flush())
ob_list_handlers 列出所有使用的输出句柄
output_add_rewrite_var
output_add_rewrite_var('var', 'value');
echo '<a href="file.php">link</a>';
输出:<a href="file.php?var=value">link</a>
output_reset_rewrite_vars
output_add_rewrite_var('var', 'value');
echo '<a href="file.php">link</a>';//输出:<a href="file.php?var=value">link</a>
ob_flush();
output_reset_rewrite_vars();
echo '<a href="file.php">link</a>';//输出:<a href="file.php">link</a>

伪静态
首先:
必须要空间支持 Rewrite 以及对站点目录中有 .htaccess 的文件解析,才有效.
如何让空间支持Rewrite 和 .htaccess 的文件解析呢 往下看
第一步:要找到apache安装目录下的httpd.cof文件,在里面找到
<Directory />
Options FollowSymLinks
AllowOverride none
</Directory>
把none改all,
第二步:找到以下内容:
#LoadModule rewrite_module modules/mod_rewrite.so
改为
LoadModule rewrite_module modules/mod_rewrite.so
第三步:保存重启apache。
ok。
其次是.htaccess的书写规则:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
#打开允许符号链接
Options FollowSymLinks
RewriteRule smarty/([0-9]+)/([0-9]+) smarty/index.php?id=$1&name=$2
</IfModule>

.htaccess加入以下内容
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)list-id([0-9]+)\.html$ $1/company/search.php?sectorid2=$2
RewriteRule ^(.*)cominfo-([a-z0-9]+)\.html$ $1/member/index.php?uid=$2&type=cominfo
RewriteRule ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1/plus/list.php?typeid=$2&PageNo=$3
RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.lujin\.com$
RewriteCond %{HTTP_HOST} !^(www|bbs)\.lujin\.com$
RewriteRule ^/?$ /%{HTTP_HOST}
RewriteRule ^/([a-z0-9\-]+)\.lujin\.com/?$ /member/index.php?uid=$1 [L]
对上面的一些解释
RewriteRule ^(.*)list-id([0-9]+)\.html$ $1/company/search.php?sectorid2=$2
这条是把企业库的分类进行伪静态处理
原先假设访问地址为http://www.xxx.com/company/search.php?sectorid2=1
现在地址为http://www.xxx.com/list-id1.html

优点:1、伪静态处理加速搜索引擎收入
2、地址映射到根目录,增加权重,提高排名

RewriteRule b/([0-9]*).html$ b.php?id=$1   http://www.test.com/b/11.html  --> htpp://www.test.com/b.php?id=11
RewriteRule b/([a-z]*)/([0-9]*).html$ b.php?name=$1&id=$2

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.php100.com [NC]
RewriteRule ^/(.*) http://www.php100.com/ [L]
--------
RewriteEngine on
RewriteRule ^/test([0-9]*).html$ /test.php?id=$1
RewriteRule ^/new([0-9]*)/$ /new.php?id=$1 [R]

3、mod_rewrite 规则修正符

1) R 强制外部重定向
2) F 禁用URL,返回403HTTP状态码。
3) G 强制URL为GONE,返回410HTTP状态码。
4) P 强制使用代理转发。
5) L 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N 重新从第一条规则开始运行重写过程。
7) C 与下一条规则关联8) T=MIME-type(force MIME type) 强制MIME类型
9) NS  只用于不是内部子请求
10) NC 不区分大小写
11) QSA 追加请求字符串
12) NE 不在输出转义特殊字符   \%3d$1  等价于 =$1

序列化
__sleep()
__wakeup()
-----------------
$a = array("1"=>"a","2"=>"b","3"=>"c","4"=>"d");
$b = serialize($a);/*序列化*/
var_dump($b);
$f = unserialize($b);/*解析*/
var_dump($f);
---------------------
class S
{
public $t = 111;
public function t()
{
echo 't function';
}
}
$s = new S;
$t = serialize($s);
$e = unserialize($t);
echo $e->t();
echo $e->t;
--------------------
class S
{
public $id;
public $name;
public function f()
{
echo 'f function';
}
function __sleep()
{
$this->id = uniqid();
return array('id','name');
}
function __wakeup()
{
//$this->id = uniqid();
}
}
$s = new S();
$s->name = 'name';
$e = serialize($s);
$t = unserialize($e);
echo $t->id.'_',$t->name,' ';
echo $t->f();
----------------------------
class S
{
public $t = 111;
public function t()
{
echo 't function';
}
}
$s = new S;
$t = serialize($s);
$cache_file = fopen('f:/1.txt', 'w+');
fwrite($cache_file, $t);
/*
die;
$e = unserialize($t);
echo $e->t();
echo $e->t;
*/
$handle = @fopen("f:/1.txt", "r");
if ($handle)
{
while (!feof($handle))
{
$buffer = fgets($handle, 4096);
break;
}
fclose($handle);
}
$e = unserialize($buffer);
echo $e->t();
echo $e->t;
-----------------------------------------

ThinkPHP2.0
入口文件配置
define('STRIP_RUNTIME_SPACE', false);生成的~runtime.php文件是否去空白和注释
define('NO_CACHE_RUNTIME', true);不生成核心缓存文件

查询
按照id排序显示前6条记录
$Form    = M("Form");
$list    =    $Form->order('id desc')->limit(6)->select();

取得模板显示变量的值
$this->assign('tt', 'vvvvvvvvvvvv');
echo $this->get('tt')

成功失败提示页
if(false !==$Form->add()) {
$this->success('数据添加成功!');
}else{
$this->error('数据写入错误');
}

自动验证
array(验证字段,验证规则,错误提示,验证条件,附加规则,验证时间)
验证规则:require 字段必须、email 邮箱、url URL地址、currency 货币、number 数字
Model:: MODEL_INSERT 或者1新增数据时候验证
Model:: MODEL_UPDATE 或者2编辑数据时候验证
Model:: MODEL_BOTH 或者3 全部情况下验证(默认)

protected $_validate = array(
array('verify','require','验证码必须!'), //默认情况下用正则进行验证
array('name','','帐号名称已经存在!',0,’unique’,1), // 在新增的时候验证name字段是否唯一
array('value',array(1,2,3),'值的范围不正确!',2,’in’), // 当值不为空的时候判断是否在一个范围内
array('repassword','password','确认密码不正确',0,’confirm’), // 验证确认密码是否和密码一致
array('password','checkPwd','密码格式不正确',0,’function’), // 自定义函数验证密码格式
);

apache多域名配置
NameVirtualHost *:80
Alias /php/  "f:/php/"
<Directory "f:/php/">
Options Indexes
Order allow,deny
Allow from all
</Directory>
<VirtualHost *:80>
DocumentRoot F:/php
ServerPath F:/php
ServerAlias www.a.com
ServerName www.a.com
</VirtualHost>

<VirtualHost *:80>
ServerName www.b.com
ServerAlias www.b.com
ServerPath F:/php2
DocumentRoot F:/php2
<Directory "F:/php2">
Options Indexes
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

文件上传
/*

$_FILES['pic']['error']
0:上传成功
1:上传文件大小超出upload_max_filesize大小
2:上传文件超出页面MAX_FILE_SIZE元素设置大小
3:表示文件只上传了一部分
4:表示没有上传任何文件

is_uploaded_file();

*/
php code
set_time_limit(0);
if ($_POST['action']=="uppic"){
//$upfile=&$HTTP_POST_FILES['pic'];
$upfile = $_FILES['pic'];
var_dump($_FILES);
$upfileEx=substr($upfile['name'],-3);
//$upfileEx = strrchr($upfile['name'], '.');
$pic='img/'.date("Ymdhis").mt_rand(1000,9999).'.'.$upfileEx;//上传目录+用时间当文件名+后缀
$upTemp=move_uploaded_file($upfile['tmp_name'],$pic);
、、chmod($pic, 0755);//设定上传的文件的属性
if ($upTemp){
//上传成功
}else{
//上传失败
}
}

html
<form action="" method="post" enctype="multipart/form-data" name="form1">
<input name="MAX_FILE_SIZE" type="hidden" id="pic" value="">
<input name="pic" type="file" id="pic">
<input type="submit" name="Submit" value="提交">
<input name="action" type="hidden" id="action" value="uppic">
</form>

上传大文件 php.ini修改
upload_max_filesize = 100M  //允许上传的最大文件大小

post_max_size = 100M  //PHP可以接受的最大的POST数据大小

max_execution_time = 130 //每个脚本最大执行秒数
max_input_time = 130  //每个脚本用来分析请求数据的最大时间
memory_limit = 128M  //每个脚本能够使用的最大内存数量

php优化
If a method can be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。

echo is faster than print. echo 比 print 快。

Use echo’s multiple parameters instead of string concatenation. 使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。

Set the maxvalue for your for-loops before and not in the loop. 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。

Unset your variables to free memory, especially large arrays. 注销那些不用的变量尤其是大数组,以便释放内存。

Avoid magic like __get, __set, __autoload 尽量避免使用__get,__set,__autoload。

require_once() is expensive require_once()代价昂贵。

Use full paths in includes and requires, less time spent on resolving the OS paths. 在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。

If you need to find out the time when the script started executing, $_SERVER[’REQUEST_TIME’] is preferred to time() 如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。

See if you can use strncasecmp, strpbrk and stripos instead of regex. 检查是否能用strncasecmp,strpbrk,stripos函数代替正则表达式完成相同功能。

str_replace is faster than preg_replace, but strtr is faster than str_replace by a factor of 4. str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

If the function, such as string replacement function, accepts both arrays and single characters as arguments, and if your argument list is not too long, consider writing a few redundant replacement statements, passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments. 如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。

It’s better to use select statements than multi if, else if, statements. 使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。

Error suppression with @ is very slow. 用@屏蔽错误消息的做法非常低效。

Turn on apache’s mod_deflate 打开apache的mod_deflate模块。

Close your database connections when you’re done with them. 数据库连接当使用完毕时应关掉。

$row[’id’] is 7 times faster than $row[id]. $row[‘id’]的效率是$row[id]的7倍。

Error messages are expensive. 错误消息代价昂贵。

Do not use functions inside of for loop, such as for ($x=0; $x < count($array); $x) The count() function gets called each time. 尽量不要在for循环中使用函数,比如for ($x=0; $x < count($array); $x)每循环一次都会调用count()函数。

Incrementing a local variable in a method is the fastest. Nearly the same as calling a local variable in a function. 在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。

Incrementing a global variable is 2 times slow than a local var. 递增一个全局变量要比递增一个局部变量慢2倍。

Incrementing an object property (eg. $this->prop++) is 3 times slower than a local variable. 递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one. 递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

Just declaring a global variable without using it in a function also slows things down (by about the same amount as incrementing a local var). PHP probably does a check to see if the global exists. 仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

Method invocation appears to be independent of the number of methods defined in the class because I added 10 more methods to the test class (before and after the test method) with no change in performance. 方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

Methods in derived classes run faster than ones defined in the base class. 派生类中的方法运行起来要快于在基类中定义的同样的方法。

A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations. A similar method call is of course about 15 $localvar++ operations. 调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

Surrounding your string by ‘ instead of " will make things interpret a little faster since php looks for variables inside "…" but not inside ‘…’. Of course you can only do this when you don’t need to have variables in the string. 用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变量时才可以这么做。

When echoing strings it’s faster to separate them by comma instead of dot. Note: This only works with echo, which is a function that can take several strings as arguments. 输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。

A PHP script will be served at least 2-10 times slower than a static HTML page by Apache. Try to use more static HTML pages and fewer scripts. Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

Your PHP scripts are recompiled every time unless the scripts are cached. Install a PHP caching product to typically increase performance by 25-100% by removing compile times. 除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

Cache as much as possible. Use memcached - memcached is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load. OP code caches are useful so that your script does not have to be compiled on every request. 尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码(OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

When working with strings and you need to check that the string is either of a certain length you’d understandably would want to use the strlen() function. This function is pretty quick since it’s operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP). However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase & hashtable lookup followed by the execution of said function. In some instance you can improve the speed of your code by using an isset() trick. 当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。

Ex.(举例如下)
if (strlen($foo) < 5) { echo "Foo is too short"; }
vs.(与下面的技巧做比较)
if (!isset($foo{5})) { echo "Foo is too short"; }

Calling isset() happens to be faster then strlen() because unlike strlen(), isset() is a language construct and not a function meaning that it’s execution does not require function lookups and lowercase. This means you have virtually no overhead on top of the actual code that determines the string’s length. 调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。

When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i. This is something PHP specific and does not apply to other languages, so don’t go modifying your C or Java code thinking it’ll suddenly become faster, it won’t. ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually causes in the creation of a temporary var that is then incremented. While pre-incrementation increases the original value directly. This is one of the optimization that opcode optimized like Zend’s PHP optimizer. It is still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer. 当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。

Not everything has to be OOP, often it is too much overhead, each method and object call consumes a lot of memory. 并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

Do not implement every data structure as a class, arrays are useful, too. 并非要用类实现所有的数据结构,数组也很有用。

Don’t split methods too much, think, which code you will really re-use. 不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?

You can always split the code of a method later, when needed. 当你需要时,你总能把代码分解成方法。

Make use of the countless predefined functions. 尽量采用大量的PHP内置函数。

If you have very time consuming functions in your code, consider writing them as C extensions. 如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。

Profile your code. A profiler shows you, which parts of your code consumes how many time. The Xdebug debugger already contains a profiler. Profiling shows you the bottlenecks in overview. 评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。

mod_gzip which is available as an Apache module compresses your data on the fly and can reduce the data to transfer up to 80%. mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。

gd
打印文字
Header('Content-type: image/png');
$height = 300;
$width = 300;
//新建一个真彩色图像
$im = ImageCreateTrueColor($width, $height);
//为一幅图像分配颜色
$white = ImageColorAllocate ($im, 255, 255, 255);
$blue = ImageColorAllocate ($im, 0, 0, 64);
//区域填充 (即与 x, y 点颜色相同且相邻的点都会被填充)
ImageFill($im, 0, 0, $blue);
//划一条线
ImageLine($im, 0, 0, $width, $height, $white);
//输出字符
ImageString($im, 4, 80, 150, 'www.bwie.net', $white);
//输出中文
$font="C://WINDOWS//Fonts//simhei.ttf";
imagettftext($im,15,0,10,20,$white,$font,'中华人民共和国');
ImagePng ($im);
ImageDestroy($im);

水印文字
header("Content-type: image/jpeg");
$pic=imagecreate(80,30);
$black=imagecolorallocate($pic,255,0,0);
$white=imagecolorallocate($pic,255,255,255);
$font="simhei.ttf";
$str ='水印文字……';
imagettftext($pic,10,0,10,20,$white,$font,$str);

$filename='photo.jpg';
$im=imagecreatefromjpeg($filename);
imagecopymerge($im,$pic,0,0,0,0,80,30,50);
imagejpeg($im);
ImageDestroy($im);

缩略图
header("Content-type: image/jpeg");
$ia = getimagesize('photo.jpg');
var_dump($ia);
$image_p = imagecreatetruecolor(20, 20);
$image = imageCreateFromJpeg('photo.jpg');
imagecopyresampled($image_p, $image, 0, 0, 0, 0, 20, 20, 209, 130);
/*
bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
$dst_x 目标x坐标
$dst_y 目标y坐标
src_x  源图像x坐标
src_y 源图像y坐标
dst_w 目标图像宽度
dst_h 目标图像宽度
src_w 源图像宽度
src_h 源图像高度
*/
imageJpeg($image_p, 'temp.jpg', 100);

FCKedit
\editor\filemanager\connectors\php\config.php 配置文件
$Config['Enabled'] = true ; 开启文件上传

\editor\filemanager\connectors\php\io.php
按日期产生新文件名,修改方法 SanitizeFileName()
$s = $sNewFileName;
$ext = strrchr($s,'.');
$fn = date('YmdHis').$ext;//新文件名

去除自动添加p fckconfig.js
FCKConfig.EnterMode = 'p' ;            // p | div | br
FCKConfig.ShiftEnterMode = 'br' ;    // p | div | br

Sphinx/Coreseek
特性
高速的建立索引(在当代CPU上,峰值性能可达到10 MB/秒);
高性能的搜索(在2 – 4GB 的文本数据上,平均每次检索响应时间小于0.1秒);
可处理海量数据(目前已知可以处理超过100 GB的文本数据, 在单一CPU的系统上可处理100 M 文档);
提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法;
支持分布式搜索;
提供文档片段(摘要以及高亮)生成功能;
可作为MySQL的存储引擎提供搜索服务;
支持布尔、短语、词语相似度等多种检索模式;
文档支持多个全文检索字段(缺省配置下,最大不超过32个);
文档支持多个额外的属性信息(例如:分组信息,时间戳等);
停止词查询;
支持单一字节编码和UTF-8编码,以及对GBK和BIG5的完善支持;
支持英语、俄语词词干化和Soundex,以便进行词形学处理;
原生的MySQL支持(同时支持MyISAM 和InnoDB );
原生的PostgreSQL 支持;
支持直接模拟为MySQL服务端运行;
支持MMSeg分词引擎,用户可自定义词典;
Python数据源支持,得以获取任何已知世界和未知世界的数据.

发布包包含功能
indexer: 用于创建全文索引;
search: 一个简单的命令行(CLI) 的测试程序,用于测试全文索引;
searchd: 一个守护进程,其他软件可以通过这个守护进程进行全文检索;
sphinxapi: 一系列searchd 的客户端API 库,用于流行的Web脚本开发语言(PHP, Python, Perl, Ruby, Java).
spelldump: 一个简单的命令行工具,用于从 ispell 或 MySpell (OpenOffice内置绑定) 格式的字典中提取词条。当使用 wordforms 时可用这些词条对索引进行定制.
indextool: 工具程序,用来转储关于索引的多项调试信息。 此工具是从版本Coreseek 3.1(Sphinx 0.9.9-rc2)开始加入的。
mmseg: 工具程序和库,Coreseek用于提供中文分词和词典处理。

建立索引
indexer -c sphinx.conf --all

启动服务
searchd -c sphinx.conf

检索
search -c sphinx.conf number //检索所有数字
search --filter group_id 2 //限定group_id 为2 返回一条记录

php检索
include('sphinxapi.php');

$cl = new SphinxClient();
//设置sphinx服务器地址与端口,如果是本机则可以为localhost
$cl->SetServer( "192.168.16.6", 9312 );
//以下设置用于返回数组形式的结果
$cl->SetArrayResult ( true );
//$cl->SetMatchMode( SPH_MATCH_ANY  );//匹配模式
//$cl->SetFilter( 'group_id', array( 2 ) );

$result = $cl->Query( '研究生创业', 'test1' );  //参数 关键字  索引名

if ( $result === false ) {
echo "Query failed: " . $cl->GetLastError() . ".\n";
}
else {
if ( $cl->GetLastWarning() ) {
echo "WARNING: " . $cl->GetLastWarning() . "";
}

echo '<pre>';
print_r( $result );
}

sphinxse
CREATE TABLE t1
(
id          INTEGER UNSIGNED NOT NULL,
weight      INTEGER NOT NULL,
query       VARCHAR(3072) NOT NULL,
group_id    INTEGER,
INDEX(query)
) ENGINE=SPHINX CONNECTION="sphinx://127.0.0.1:9312/indexName";

select d.id,d.title,d.content from t1 join documents as d on t1.id = d.id and t1.query = '研究生创业';

错误:
建立索引时报错:FATAL: failed to open var/data/mysql.spl: No such file or directory, will not index. Try --rotate option
原因:把csft.conf里的路径改成绝对路径就可以啦

抓取页面数据
$str = file_get_contents('http://www.test.com/news/index.html');
$p = "/<ul class=\"new_ul55\">.*<\/ul>/sU";
preg_match_all($p, $str, $a);
var_dump($a);

snoopy

fetch($URI)
这个方法是抓取网页的内容,$URI 是要抓取网页的网址,抓取过来结果存储到 $this->results。如果你抓取的是框架,这每个 frame 都会被抓取,结果会保存到一个数组中。
fetchtext($URI)
这个方法和 fetch() 是大致相同,只是它的结果是文本,除去 HTML 标签和其他无关信息。
fetchform($URI)
这个方法只返回抓取的网页上 form 元素。
fetchlinks($URI)
这个方法只返回抓取的网页上的链接,默认返回的链接都是含有域名的链接。
submit($URI,$formvars)
这个方法提交一个表单到指定的 $URI。$formvars 是要传递的 form 变量数组。
submittext($URI,$formvars)
这个方法和 submit() 基本一致,但是它返回的是文本,除去了 html 标签和其他无关数据。
submitlinks($URI)
这个方法返回的是链接。

include 'Snoopy.class.php';
$snoopy = new Snoopy();

$snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)"; //伪装浏览器
$snoopy->referer = "http://www.163.com"; //伪装来源页地址

$snoopy->fetch('http://www.test.com/news/index.html');//抓取指定的网页
$snoopy->cookies = array('c'=>'cvvvv');//提交cookie值
//$snoopy->fetchtext($url); //除去 HTML 标签和其他无关信息
//$snoopy->fetchform($url); //返回抓取的网页上 form 元素
//$snoopy->fetchlinks($url); //抓取的网页上的链接
$snoopy->_submit_method = 'GET';//表单提交方式
$snoopy->submit('http://www.test.com/3.php',array('user'=>'admin'));//提交表单到$url。$formvars是要传递的变量数组,例:array('user' =>'admin','pwd' => 'admin');
//$snoopy->submittext('http://www.test.com/3.php',array('user'=>'admin'));//同submit,只是去除HTML标签和无关信息
//$snoopy->submitlinks('http://www.test.com/3.php',array('user'=>'admin'));//返回链接

$data = $snoopy->results;
echo $data;//打印取到的所有结果