PHP知识一:系统知识总结

这些是PHP的相关系列知识,其中系统的讲述、总结了PHP效率优化与安全、PHP精华及性能优化、PHP缓存机制与静态化设计、PHP运行机 制、PHP版本特性、PHP函数相关原理、PHP系统设计、PHP高级应用、PHP连接池方案、基础函数、PHP与WEB主要应用、PHP与MySQL关 联、PHP中全局有关、文件操作、图片操作、面象对象、FTP、正则、数组操作、实用函数等相关知识。请认真研学,应该能对你有所帮助。
 
 
PHP 与MySQL关联知识:
mysqli_connect_errno():获取连接MySQL数据库的错误号。
1045: Access denied for user'用户名'@'用户密码'(user password: YES)
2005: Unkown MySQL server host 'MySQL数据库服务器名'(11004)
2013: Loset connection to MySQL server during query
mysqli_connect_error():获取连接MySQL数据库的错误。
mysqli_close(连接数据库对象):面向过程实现内存回收方法。
连接数据库对象->close():面向对象实现数据库连接句柄内存回收方法。
数据执行结果->close():面向对象实现数据内存回收方法。
mysql_query("SQL语句"):执行SQL语句方法。
mysql_num_rows(SQL语句执行对象):返回SQL查询结果的行数。
mysql_result(SQL语句执行对象,0,"字段名"):返回二进制数据结果//通常为图片显示。
PHP运算符:算术运算符、赋值运算符、位运算符(&|^~<<>>)、比较运算符、错误控制运算符、执行运算符、递增/递减运算符、逻辑运算符、字符串运算符、数组运算符、类型运算符。
结束符使用:基于 Unix 的系统使用 \n 作为行结束字符,基于 Windows 的系统使用 \r\n 作为行结束字符,基于 Macintosh 的系统使用 \r 作为行结束字符。
 
PHP中全局有关:
session_start():开启session功能,启动会话方法。
session_unset():删除session会话方法。
session_destroy():结束session会话方法。
session_unregister("变量"):注销变更值方法。
header("Location:页面"):头文件信息跳转页面方法。
header("Location: ../");exit:返回进入父目录方法。
getenv("环境变量"):从环境变量中取得字符串。
getenv("REMOTE_ADDR"):得到客户端IP方式SERVER_NAME(主机名)|SERVER_SOFTWARE(服务器类型)|SERVER_PORT(端口)。
 $_SERVER['SERVER_NAME']  服务器名称。
 $_SERVER['SERVER_ADDR']  服务器IP地址。
 $_SERVER['REMOTE_ADDR']  客户机IP地址。
 $_SERVER['DOCUMENT_ROOT'] 服务器虚拟目录(当前项目所在目录)。
 $_SERVER['REMOTE_PORT']  服务器所使用的端口号。
 $_SERVER['REQUEST_METHOD'] 提交表单方法(未使用时默认为GET)。
 $_SERVER['HTTP_HOST']  一个得到本机访问根的方法。
 $_SERVER['HTTP_REFERER'] 得到前一页面地址。
 $_SERVER['PHP_SELF']  得到PHP本身页面地址。
 $_SERVER['SCRIPT_FILENAME'] 得到文件的全路径。
 substr($_SERVER['REQUEST_URI'],0,strpos($_SERVER['REQUEST_URI'],"?"));  得到位当前页面地址后去掉参数的地址。
 <?php echo $_SERVER['REQUEST_URI']?>、$parseurl["path"]    为纯粹得到目录位置。
 substr( $_SERVER['PHP_SELF'] , strrpos($url , '/')+1 ):   一个得到文件名的方法
全局变量总:
$_SERVER[] 用于获取全局变量的值。
$_GET[]  GET方法提交参数。
$_POST[] POST方法提交参数。
$_COOKIE[] 获取由 setcookie()函数所设置的 cookie变量的值。
$_SESSION[] 获取所有 session()变量的值。
$_REQUEST[] 获取 GET|POST参数,特别有未知具体方法的情况。
$_GLOBALS[] 获取全局变量的值。
PHP 常量:__FILE__程序文件名、__LINE__程序行数、PHP_VERSION程序的版本、PHP_OS解析器的操作系统名称、TRUE真值 (true)、FALSE伪值(false)、E_ERROR最近的错误处、E_WARNING最近的警告处、E_PARSE解析语法有潜在问题处、 E_NOTICE生不寻常但不一定是错误处、define()自行定义所需要的常量。
 
文件操作:
move_uploaded_file(文件):实现文件上传,文件上传实质:先使用copy(临时文件,目的地址)复制该文件,然后使用unlink()删除该文件。
int fopen(文件,方式):打开文件。
fwrite(打开文件对象,写入的数据):向文件写入数据,别名fput。
fclose(打开文件对象):关闭文件对象方式。
bool file_exists(文件):文件是否存在。
int copy(文件源):复制文件,失败返回false。
bool rename(原文件,新文件):修改文件名。
bool readfile(文件):读文件。
bool is_dir(文件):判断文件目录是否存在。
resource opendir(文件目录):打开目录遍历文件输出,返回句柄。
string readdir(文件):从目录句柄中读取条目,排序返回目录中下一个文件的文件名。
string closedir(文件):关闭目录句柄,必须被opendir()打开过。
string getcwd(void):获取当前文件目录。
int filectime(文件):文件创建时间。
int filemtime(文件):文件修改时间。
int filesize(文件):文件大小。
int mkdir(文件,进制方式):创建目录。
int rmdir(文件):删除文件。
string fread(文件行位置,长度):以位组方式读取文件。
string basename(文件,不显示的文件后缀):返回路径文件名部分,默认为全显示。
$_FILES[] 上传文件信息。
  $_FILES["upfile"]["name"]|["type"]|["size"]|["tme_name"]//上传后临时名称|["error"]//状态码包括错误信息。
  UPLOAD_ERR_OK//上传成功|UPLOAD_ERR_IN_SIZE//指定大小
  UPLOAD_ERR_FROM_SIZE//超出大小|UPLOAD_ERR_PARTIAL//只上传了一部分|UPLOAD_ERR_ON_FILE//上传文件没有指定文件。
file_put_contents:将一个字符串写入文件。
 
图片操作:
array getimagesize("图片位置")返回数组,[3]为[0]|宽和[1]|高:得到图片宽和高。
int imagecreatefromjpeg|png|gif|wbmp(图片):从指定URL打开一个图片资源返回文件代码。
int imagejpeg|png|gif|wbmp:将GD2图像流以图片格式保存或输出到浏览器。
array imageTTFText($im,20,0,50,40,$textcolor,$fnt,$motto):写TTF文字到图中实例。
int imagecolorallocate($im, 20, 145, 40):用于匹配指定图片的颜色。
int imagecreatetruecolor(260, 200):建立一个全彩的图片文件资源。
int imagefilledarc($im, 130, $i, 150, 100, 0, 95, imagecolorallocate($im, 20, 145, 40), IMG_ARC_PIE):绘制一个椭圆并填充。
int imagedestroy(对象):删除图形,释放内在空间。
imagefilledrectangle():用于绘制一个填充了的矩形。
int imageline($im,16,20,16,232, imagecolorallocate($im, 20, 145, 40)):绘制一条实线。
int imagestring($im,3,14,5,"Y",imagecolorallocate($im, 20, 145, 40)):在图片上水平绘制一行字符串。
 
PHP5 面象对象知识:
$obj1 = new testclone("test");//testclone为已存在的类
$obj2 = clone $obj1:实现对象的克隆。
private:私有成员,数据成员及成员函数只有该类本身成员函数可以访问,不能由该类实例化对象访问。
prototed:保护成员,限制数据成员及成员函数,只有该类和子类方法可以访问,不能由该类实例化对象访问。
public:公共成员,该类和该类的子类数据成员及成员函数可以访问,实例化对象也可以调用。
 
PHP与办公文件知识:
处理输出缓冲的主要函数:
flush():刷新缓冲区的内容并输出。函数效率高经常被使用。
ob_start():开始输出缓冲, 这时PHP停止输出, 在这以后的输出都被转到一个内部的缓冲里。
ob_get_contents():这个函数返回内部缓冲的内容: 这就等于把这些输出都变成了字符串。
ob_get_length():返回内部缓冲的长度。
ob_end_flush():结束输出缓冲, 并输出缓冲里的内容,在这以后的输出都是正常输出。
ob_end_clean(): 结束输出缓冲, 并扔掉缓冲里的内容。
ob_implicit_flush:打开或关闭绝对刷新。
wirtetoword(文件,数据):写入数据进入Word文档方法。
wirtetoexcel(文件,数据):写入数据进入Excel文档方法。
 
PHP管理FTP服务器:
int ftp_connect(连接地址,端口//一般为21):连接服务器方法。
int @ftp_login(连接对象,用户名,密码)):登录服务器方法。
ftp_pwd(连接对象):获得操作目录方法。
int ftp_put(连接对象,远程文件,本地文件,方式//FTP_ASCII|FTP_BINARY):上传文件到服务器方法。
int ftp_fput(连接对象,本地文件,远程文件,方式//FTP_ASCII|FTP_BINARY):上传已打开文件到服务器方法,指针指到文件末尾。
int ftp_get(连接对象,打开文件,远程文件,方式//FTP_ASCII|FTP_BINARY):下载文件到本地机方法。
int ftp_fget(连接对象,远程文件,打开文件,方式//FTP_ASCII|FTP_BINARY):下载已打开文件到本地机方法,指针指到文件末尾。
int @ftp_rename(连接对象,原文件名,更改的文件新名):FTP更改服务器文件名方法。
ftp_delete(连接对象,删除的文件名):FTP删除服务器文件方法。
int @ftp_mkdir(连接对象,创建的文件名):FTP创建文件目录方法。
@$array=ftp_rawlist(连接对象,文件目录名):获取FTP服务器指定目录下文件列表方式。
 
PHP 正则表达式:
 功能:匹配、检验、替换以及修改字符串。定界符://。
 常用的元字符包括: “+”, “*”,以及 “?”。其中,“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次,“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次,而“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。
 重要的元字符的使用方式:
   \s:用于匹配单个空格符,包括tab键和换行符;
   \S:用于匹配除单个空格符之外的所有字符;
   \d:用于匹配从0到9的数字;
   \w:用于匹配字母,数字或下划线字符;
   \W:用于匹配所有与\w不匹配的字符;
 独特的专用字符,即定位符:
  较 为常用的定位符包括: “^”, “$”, “\b” 以及 “\B”。其中,“^”定位符规定匹配模式必须出现在目标字符串的开头,“$”定位符规定匹配模式必须出现在目标对象的结尾,\b定位符规定匹配模式必须 出现在目标字符串的开头或结尾的两个边界之一,而“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字 符串的开头,也不能作为目标字符串的结尾。同样,我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。
 
删除对象方式:
 方法一:
 <a onclick="return confirm('数据一经删除可恢复,是否继续操作?')" href="http://blog.163.com/wangxiaoxia1221@126/blog/">删除</a>
 form 部分:<form onsubmit="return confirm('数据删除不可恢复,是否继续操作?')" name="form" method="post" action="">
 方法二:
 <a  onClick="javascript:return confirm('你确定要删除此用户么?')"  href="http://blog.163.com/wangxiaoxia1221@126/blog/">删除</a>
 form 部分:<form method="post" action="" name="form1" >
 
PHP操作数组相关函数:
range($low, $high),range($low, $high, $step);//创建顺序值的数组如:range(1,4)为(1,2,3,4)又如range('a','z')
each($array)按顺序返回数组的当前元素,并且将下一个元素设置为当前元素;
reset($array)将数组当前元素重新设置到数组开始处
list()可以用来将一个数组分解为一系列的值,如 list($a,$b)=each($array)
shuffle($array),array_rand($arg, $num_req);对数组随机排序
array_reverse($input),array_reverse($input, $preserve_keys)   返回原数组的反向排序
sort($array);对数组排序
创建数组:PHP中的数组声明跟其它语言的也有点小小的差别,但一样可以声明为一维,两维,三维及多维等。
如果要批量创建数组,则可以通过下面这个函数:array range ( mixed low, mixed high [, number step] ),如$array = range(1,6);代表array(1,2,3,4,5,6);
PHP 中输出数组的函数有比较多,常用的有:bool print_r(mixed expression [,bool return] ),void var_dump(mixed expression [, mixed expression [, ...]] )。还有像echo,print,printf都可以输出单个数组.
测试数组:有时我们需要判定一个变量是否为数组,则可以使用:bool is_array ( mixed var )。
增加或删除数组元素:int array_push ( array &array, mixed var [, mixed ...] ) 将一个或多个单元压入数组的末尾,数组的长度根据入栈变量的数目增加。
mixed array_pop ( array &array ) 将数组的最后一个元素弹出(出栈),并在结束后重置数组的指针
mixed array_shift ( array &array ) 返回数组的第一个元素.
int array_unshift ( array &array, mixed var [, mixed ...] ) 在数组的开头插入一个或多个单元
array array_pad ( array input, int pad_size, mixed pad_value ) 用值将数组填补到指定的长度,如array_pad($array,3,$var)。
定位数组元素:
 bool in_array ( mixed needle, array haystack [, bool strict] ) 检查数组中是否存在某个值
 array array_keys ( array input [, mixed search_value [, bool strict]] ) 返回数组中的所有键名,重组成一个新数组
 bool array_key_exists ( mixed key, array search ) 检查给定的key是否存在于数组中.
 array array_values ( array input ) 返回数组中所有的值
 mixed array_search ( mixed needle, array haystack [, bool strict] ) 在数组中搜索给定的值,成功则返回key.
遍历数组:
 mixed key ( array &array ) 从关联数组中取得键名
 mixed reset ( array &array ) 将数组指针重置
 array each ( array &array ) 返回数组中的键/值对并将数组向前移一步
 mixed current ( array &array ) 返回数组中的当前单元
 mixed end ( array &array ) 将数组中的指针移向最后一位
 mixed next ( array &array ) 将数组中的指针移向下一位
 mixed prev ( array &array ) 将数组中的指针移向上一位
 array array_reverse ( array array [, bool preserve_keys] ) 返回一个单元顺序相反的数组
 array array_flip ( array trans ) 将数组中的键值角色调换,除了上面的函数外还可以使用循环来对数组中的元素进行遍历,如
 foreach (array_expr as $value)
 { statement    }
 foreach (array_expr as $key=>$value)
 { statement   }// 提取每个键/值对,直到获得所有项或满足某些内部条件为止
 void list ( mixed varname, mixed ... ) 把数组中的值赋给一些变量。
确定数组大小和唯一性:
 int count ( mixed var [, int mode] ) 计算数组中单元数组或对象中属性的个数, sizeof 的同名函数
 array array_count_values ( array input ) 统计数组中所有值出现的次数
 array array_unique ( array array ) 移除数组中重复的值。
数组排序:
 bool sort ( array &array [, int sort_flags] ) 对数组进行排序
 bool natsort ( array &array ) 用自然排序法对数组进行排序
 bool natcasesort ( array &array ) 用自然排序法对数组进行排序,不区分大小写
 bool rsort ( array &array [, int sort_flags] ) 对数组进行逆向排序
 bool asort ( array &array [, int sort_flags] ) 对数组进行排序并保持索引关系
 bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]] ) 对多个数组或多维数组进行排序,可以按多个字段排序,eg:
  $data[] = array('volume' => 67, 'edition' => 2, 'date'=>2);
  $data[] = array('volume' => 67, 'edition' => 2, 'date'=>3);
  $data[] = array('volume' => 69, 'edition' => 7, 'date'=>9);
  foreach ($data as $key => $row) {
   $volume[$key]  = $row['volume'];
   $edition[$key] = $row['edition'];
   $date[$key]    = $row['date'];
  }
  array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $date, SORT_DESC, $data);
 它主用法:对多个数组排序、对多维数组排序、 对数据库结果进行排序(如上)、不区分大小写字母排序(要按照原数组的小写字母拷贝来排序)、名次排列(应用)。
 bool arsort ( array &array [, int sort_flags] ) 对数组进行逆序排序并保持索引关系
 bool ksort ( array &array [, int sort_flags] ) 对数组按键名排序
 bool krsort ( array &array [, int sort_flags] ) 对数组按键名逆序排序。
合并,拆分,接合和分解数组:
 array array_combine ( array keys, array values ) 创建一个数组,一个数组的值作为其键名,另一个数组的值作为其值
 array array_merge ( array array1 [, array array2 [, array ...]] ) 合并一个或多个数组
 array array_merge_recursive ( array array1 [, array ...] ) 递归地全部一个或多个数组
 array array_slice ( array array, int offset [, int length [, bool preserve_keys]] ) 从数组中取出一段,建立一个新的数组,如果offset为正数,拆分从距数组开关的offset位置开始,如果为负数,则拆分从距数组末尾的offset 位置开始,此时距数组开关的count(input_array)-|length|位置结束
 array array_splice ( array &input, int offset [, int length [, array replacement]] ) 把数组中的部分值去掉,并用其它值替代.offset设置同上。
 array array_intersect (array1, array2 [, array ...] ) 计算数组的交集,即是说如果第一个数组中出现过的值在接下来的几个数组中都有出现,则取出该值。
 array array_intersect_assoc ( array array1, array array2 [, array ...] ) 带索引检查数组中的交集。
 array array_intersect_key ( array array1, array array2 [, array ...] ) 使用键名比较数组中的交集。
 array array_diff ( array array1, array array2 [, array ...] ) 计算数组的差集, 即是说跟第一个数组中不同的值。
 array array_diff_assoc ( array array1, array array2 [, array ...] ) 带索引检查数组中的差集。
 array array_diff_key ( array array1, array array2 [, array ...] ) 使用键名比较数组中的差集。
其它比较有用的数组函数:
 mixed array_rand ( array input [, int num_req] ) 数组中随机取出一个或多个键,num指定个数。
 bool shuffle ( array &array ) 将数组打乱。
 number array_sum ( array array ) 计算数组中所有值的总和,关联数组忽略。
 array array_chunk ( array input, int size [, bool preserve_keys] ) 将一个数组分割成几个。
 
PHP效率优化与安全:
一:php程序效率优化的一些策略:
 1.在可以用file_get_contents替代file、 fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意 file_get_contents在打开一个URL文件时候的PHP版本问题;
 2.尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;
 3.优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);
 4.尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);
 5.循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);
 6.多维数组尽量不要循环嵌套赋值;
 7.在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;
 8.foreach效率高,尽量代替while和for循环,适合读操作,处理数组写操作时while快。类似foreach($array as $key=>$value)应该被替换成while(list($key)=each($array))。
 9.用单引号替代双引号引用字符串;
 10.“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;
 11.对global变量,应该用完就unset()掉;
 有对应的常量的时候,不要使用函数。
  <?php
  php_uname('s') == PHP_OS;
  php_version() == PHP_VERSION;
  php_sapi_name() == PHP_SAPI;
  ?>
 虽然使用不多,但是效率提升大概在 3500% 左右。
 用 $_SERVER['REQUEST_TIME']显示时间,不用调用函数。
 不要做无谓的替换,即使没有替换,str_replace 也会为其参数分配内存。很慢!解决办法:- 用 strpos 先查找(非常快),看是否需要替换,如果需要,再替换。
 善用 strncmp,当需要对比「前 n 个字符」是否一样的时候,用 strncmp/strncasecmp,而不是 substr/strtolower,更不是 PCRE,更千万别提 ereg。
过滤专题:
 PHP 过滤器用于验证和过滤转换来自非安全来源的或待处理的数据。
 如需过滤变量,请使用下面的过滤器函数之一:
  filter_var() - 通过一个指定的过滤器来过滤单一的变量
  filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
  filter_input - 获取一个输入变量,并对它进行过滤
  filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
  在下面的例子中,我们用 filter_var() 函数验证了一个整数:
   <?php
   $int = 123;
   if(!filter_var($int, FILTER_VALIDATE_INT)) {
    echo("Integer is not valid");
    }else {
     echo("Integer is valid");
    }
   ?>
 两种过滤器:Validating 和 Sanitizing。
  Validating 过滤器:用于验证用户输入、严格的格式规则(比如 URL 或 E-Mail 验证)、返回若成功预期的类型,否则返回 FALSE。
   <?php
   if(!filter_has_var(INPUT_GET, "email")) {
    echo("Input type does not exist");
   }else {
    if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) {
     echo "E-Mail is not valid";
    }else {
     echo "E-Mail is valid";
    }
   }
   //使用范例:http://localhost/study/indexs.php?email=husumiao@yahoo.com.cn
   ?>
   上面的例子有一个通过 "GET" 方法传送的输入变量 (email):检测是否存在 "GET" 类型的 "email" 输入变量、如果存在输入变量,检测它是否是有效的邮件地址。
  Sanitizing 过滤器:用于允许或禁止字符串中指定的字符、无数据格式规则、始终返回字符串。
   <?php
   $filters = array (
    "name" => array("filter"=>FILTER_SANITIZE_STRING),
    "age" => array("filter"=>FILTER_VALIDATE_INT,"options"=>array("min_range"=>1,"max_range"=>120)),
    "email"=> FILTER_VALIDATE_EMAIL,
   );
   $result = filter_input_array(INPUT_GET, $filters);
   if (!$result["age"]) {
    echo("Age must be a number between 1 and 120.<br />");
   }elseif(!$result["email"]) {
    echo("E-Mail is not valid.<br />");
   }else {
    echo("User input is valid");
   }
   ?>
   上面的例子有三个通过 "GET" 方法传送的输入变量 (name, age and email):
    设置一个数组,其中包含了输入变量的名称,以及用于指定的输入变量的过滤器
    调用 filter_input_array 函数,参数包括 GET 输入变量及刚才设置的数组
    检测 $result 变量中的 "age" 和 "email" 变量是否有非法的输入。(如果存在非法输入,)
   filter_input_array() 函数的第二个参数可以是数组或单一过滤器的 ID。如果该参数是单一过滤器的 ID,那么这个指定的过滤器会过滤输入数组中所有的值。
   如果该参数是一个数组,那么此数组必须遵循下面的规则:
    必须是一个关联数组,其中包含的输入变量是数组的键(比如 "age" 输入变量)
    此数组的值必须是过滤器的 ID ,或者是规定了过滤器、标志以及选项的数组。
  使用 Filter Callback:
  通过使用此过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。这样,我们就拥有了数据过滤的完全控制权。您可以创建自己的自定义函数,也可以使用已有的PHP函数。
   <?php
   function convertSpace($string) {
    return str_replace("_", " ", $string);
   }
   $string = "Peter_is_a_great_guy!";
   echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
   ?>
   上面的例子把所有 "_" 转换成空格:创建一个把 "_" 替换为空格的函数,调用 filter_var() 函数,它的参数是 FILTER_CALLBACK 过滤器以及包含我们的函数的数组。
 SEO专题:主要是用于搜索引擎的优化工作。
 

PHP精华:
PHP中post与get的区别:Post传输的数据量大,可以达到2M,而Get方法由于受到URL长度的限制,只能传递大约1024字节。
其它:POST数据量存在128K的大小限制、IE对URL长度的限制是2083字节(2K+35),Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。
Cookie与Session都用来保存用户私密信息都有有效期、Cookie在客户端Session在服务端,所以Session更安全。Cookie可以被禁用后Sessoin不能使用,单个Cookie在客户端的限制是3K,Session无大小限制。
聊天室设计方案:
 1、聊天记录存储在一个显示文件当中,不停地读入读出刷新该文件;
 2、聊天记录存储在数据库中,页面框架使用Ajax定时读取。
 3、聊天记录存储在一个文本文件当中,消息页面不往文本文件当中插入信息后读取。
func_get_args():任意参数数目的函数。
 eg: function foo() {$args = func_get_args();foreach ($args as $k => $v) {  echo "arg".($k+1).": $v\n";}}
Glob():查找文件,比 scandir() 函数更强大的版本,可以按照某种模式搜索文件。
 eg: $files = glob('*.php');print_r($files);Array(    [0] => phptest.php    [1] => pi.php)
  $files = glob('*.{php,txt}', GLOB_BRACE);print_r($files);Array([0] => phptest.php    [1] => pi.php ...  [4] => log.txt    [5] => test.txt)
  $files = glob('../images/a*.jpg');print_r($files);Array(    [0] => ../images/apple.jpg    [1] => ../images/art.jpg)
 realpath():获得每个文件的完整路径。
  $files = glob('../images/a*.jpg');$files = array_map('realpath',$files);print_r($files);Array([0] => C:\wamp\www\images\apple.jpg ...)
通过侦测脚本的内存使用情况,有利于代码的优化。PHP 提供了一个垃圾收集器和一个非常复杂的内存管理器。脚本执行时所使用的内存量,有升有跌。
memory_get_usage()、memory_get_peak_usage():得到当前的内存使用情况、等……。
memory_limit():获得任意时间点的最高内存使用量。
getrusage()):CPU 使用信息,函数不适用于 Windows 平台,eg:
 print_r(getrusage());
 Array
 (
  [ru_oublock] => 0
  [ru_inblock] => 0
  [ru_msgsnd] => 2
  [ru_msgrcv] => 3
  [ru_maxrss] => 12692
  [ru_ixrss] => 764
  [ru_idrss] => 3864
  [ru_minflt] => 94
  [ru_majflt] => 0
  [ru_nsignals] => 1
  [ru_nvcsw] => 67
  [ru_nivcsw] => 4
  [ru_nswap] => 0
  [ru_utime.tv_usec] => 0
  [ru_utime.tv_sec] => 0
  [ru_stime.tv_usec] => 6269
  [ru_stime.tv_sec] => 0
 )
 */[/code]这可能看起来有点神秘,除非你已经有系统管理员权限。以下是每个值的具体说明(你不需要记住这些):
 ru_oublock: block output operations
 ru_inblock: block input operations
 ru_msgsnd: messages sent
 ru_msgrcv: messages received
 ru_maxrss: maximum resident set size
 ru_ixrss: integral shared memory size
 ru_idrss: integral unshared data size
 ru_minflt: page reclaims
 ru_majflt: page faults
 ru_nsignals: signals received
 ru_nvcsw: voluntary context switches
 ru_nivcsw: involuntary context switches
 ru_nswap: swaps
 ru_utime.tv_usec: user time used (microseconds)
 ru_utime.tv_sec: user time used (seconds)
 ru_stime.tv_usec: system time used (microseconds)
 ru_stime.tv_sec: system time used (seconds)
要知道脚本消耗多少CPU功率,看user time’system time两个参数值。秒和微秒部分默认是单独提供。你可以除以100万微秒,并加上秒参数值,得到一个十进制总秒数。
PHP 提供了获取当前行号 (__LINE__)、文件路径 (__FILE__)、目录路径 (__DIR__)、函数名 (__FUNCTION__)、类名 (__CLASS__)、方法名 (__METHOD__) 和命名空间 (__NAMESPACE__) 等有用的魔术常量。
 require_once(dirname(__FILE__) . '/config/database.php'):当包含其他脚本文件时,使用 __FILE__ 常量(或者使用 PHP5.3 新具有的 __DIR__ 常量)。
 my_debug("some debug message", __LINE__):使用 __LINE__ 使得调试更为轻松,你可以跟踪到具体行号。
uniqid():生成唯一标识符。
 eg: echo uniqid('foo_');foo_4bd67d6cd8b8f;
  echo uniqid('',true);4bd67d6cd8b926.12135106;
  echo uniqid('bar_',true);bar_4bd67da367b650.43684647
 这个函数将产生比 md5() 更短的字符串,能节省一些空间。
serialize()、unserialize():需要在数据库或文本文件存储一个复杂变量,格式化字符串并转换成数组或对象的好方法。
json_encode()、json_decode():原生的 PHP 序列化,这将更为行之有效,尤其与 JavaScript 等许多其他语言兼容。然而对于复杂的对象,某些信息可能会丢失。
gzcompress()、gzuncompress():PHP 中字符串压缩也是可能的,但不涉及任何压缩文件.
 eg: $string ="Lorem ipsum dolor sit amet, consectetur.";
  $compressed = gzcompress($string);
  echo "Original size: ". strlen($string)."\n";
  /* prints Original size: 800 */
  echo "Compressed size: ". strlen($compressed)."\n";
  /* prints Compressed size: 418 */
  $original = gzuncompress($compressed);
 这种操作的压缩率能达到 50% 左右。另外的函数 gzencode() 和 gzdecode() 能达到类似结果,通过使用不同的压缩算法。
register_shutdown_function(): 可以让你在某段脚本完成运行之前,执行一些指定代码。如果你调用过 exit() 函数,有些代码将无法运行。此外,如果有一个致命的错误,或者脚本被用户意外终止,它可能无法再次运行。当你使用 register_shutdown_function() 函数,代码将继续执行,不论脚本是否停止运行。
 eg: $start_time = microtime(true);
  register_shutdown_function('my_shutdown');
  function my_shutdown() {
  global $start_time;
  echo "execution took: ".
     (microtime(true) - $start_time).
     " seconds.";
  }
命令行运行PHP文件:进入命令行后输入php C:\www\index.php,之前要修改php.ini文件,设置php_exif.dll文件开启在php_mbstring.dll文件之后才可。
判断文件格式:
 方法一:
  $file_src = fopen($restore_file, "r");
  $file_bin = fread($file_src, 2);
  $strInfo = @unpack("D2chars", $file_bin);
  $typeDode = intval($strInfo['chars1'] . $strInfo['chars2']);
  $typeDode值有:zip 8075、tar 109121、7z 55122、gz 31139、exe 7790、rar 8297、jpg 255216、gif 7173、bmp 6677、png 13780。
 方法二:用strrpos方法查找最后.位置来进行。
PHP性能优化:
 程序优化:
 1、最好是使用字符串连接与单引号,而不是双引号字符串。
 2、不要随便复制变量。
 3、尽量使用echo输出字符串。
 4、尽量不要使用连接符,输出多个变量时可以用逗号分开。
 5、尽量使用switch代替if else。
 6、不做无畏的替换,先用strpos查找再做替换,不要做替换效率高200%,需要替换只慢0.1%左右。
 7、慎用@操作符。
 8、包含其它文件时尽量使用绝对路径与相对路径。
 9、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
 10、$row[’id’] 的速度是$row[id]的7倍。
 11、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替,foreach效率更高,尽量用foreach代替while和for循环。
 12、注销那些不用的变量尤其是大数组,以便释放内存。
 13、尽量避免使用__get,__set,__autoload。
 14、require_once()代价昂贵,requre比它都要好。
 16、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。
 17、函数代替正则表达式完成相同功能,在可以用PHP内部字符串操作函数的情况下,不要用正则表达式。
 18、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
 19、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
 20、打开apache的mod_deflate模块,可以提高网页的浏览速度。
 21、数据库连接当使用完毕时应关掉,不要用长连接。
 22、错误消息代价昂贵。
 23、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。
 24、递增一个全局变量比递增一个局部变量慢2倍、递增一个对象属性($this->prop++)要比递增一个局部变量慢3倍、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
 25、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
 26、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。
 27、派生类中的方法运行起来要快于在基类中定义的同样的方法。
 28、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。
 29、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。
 30、调用isset()恰巧比strlen()快,strlen($foo) < 5与!isset($foo{5}。
 31、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
 32、并非要用类实现所有的数据结构,数组也很有用。
 33、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码? 当你需要时,你总能把代码分解成方法。
 34、尽量采用大量的PHP内置函数。
 35、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。
 36、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。
 36、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。
 37、在可以用file_get_contents替代file、fopen、feof、fgets等方法的情况下,file_get_contents效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题。
 38、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的。
 39、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作。
 40、循环内部不要声明变量,尤其是大变量:对象。
 41、多维数组尽量不要循环嵌套赋值。
 42、用i+=1代替i=i+1。符合c/c++的习惯,效率还高。
 43、对global变量,应该用完就unset()掉。
 44、在参数中,传递数组时应用 rechanging 比应用 global 要高效(个人发现rechanging并不存在)。
 45、那个源代码用于得到程序列表对应的网址。
  $urlarray=explode('/',$HTTP_SERVER_VARS['REQUEST_URI']);
  $urlcount=count($urlarray);unset($urlarray[$urlcount-1]);
  $ofstarurl='http://'.$HTTP_SERVER_VARS['HTTP_HOST'].implode('/',$urlarray);
 46、在循环中判断时,数value判断应用恒等(==)要比等于(===)高效。
 47、查询时尽量应用 in 少用 limit。
 48、rand和mt_rand两者都是提供产生随机数的功能,前者为libc标准的rand。后者为Mersenne Twister中已知特性作为随机数发生器,它可以产生随机数值的平均速度比libc提供快四倍。
 49、在zend里面,N目前取值是32。因此,我们编写php程序的时候,函数调用层次最好不要超过32。
 工具及策略优化:
 1、 安装Zend Optimizer优化的工作,php.ini文件中加入 zend_optimizer.optimization_level=15zend_extension=&quot;/path/to/ZendOptimizer.so&quot; zend_loader.enable=Off。
 2、内存缓冲方式,在php文件被首次请求的时候,通过将你的PHP源代码的中间代码存储在web服务器的内存中,对于以后同样的请求,都直接提供内存中的“编译”版本。
 3、Web内容的压缩,大多数的浏览器都支持gzip的内容压缩,浏览器在接收的时候就会自动解压数据。php.ini文件中的auto_prepend和auto_append中调用这些函数。
 4、LAMP优化:清理服务器磁盘碎片、开启硬盘DMA、调整缓冲区刷新参数、优化输入输出、减少虚拟终端机的数量、……。
 5、PHP 脚本而言,主要的瓶颈是 CPU ,对于静态页面而言,瓶颈是内存和网络。
 6、Apache 处理 PHP 脚本的速度要比静态页面慢 2-10 倍。
 7、把基于文件的会话切换到基于共享内存的会话。编译 PHP 时采用 --with-mm 选项,在 php.ini 中设置 set session.save_handler=mm 。这个简单的修改能让会话管理时间缩短一半。
 8、采用最新版本的 Apache ,并把 PHP 编译其中,或者采用 DSO 模式,尽量不要采用 CGI 方式。
 9、网络拥挤,CPU 资源不够用,采用 PHP 的 HTML 压缩功能:output_handler = ob_gzhandler。
 10、在写一些类或函数的时候, 大数组不要放在程序里, 应该用file_get_contents方法读取
 11、做缓存的方式, file_get_contents再unserialize要比require和include快。
 以上所有的方法都是针对单机而言的,如果你觉得系统还是不够快,可以采用集群,负载均衡,缓冲技术。采用 Squid 作为缓冲,配置 Squid 的方法。
提高PHP的速度方式:
 一是代码优化:使用Zend Optimizer来自动帮助完成这些繁杂的工作。
 二是使用缓存:包括Zend Cache、APC和Afterburner Cache、memcache。
 三是压缩网页内容:Mod_gzip是1种开放源代码的、标准的Apache模块,也叫互联网内容加速模块。
 四是编程时使用效率相对较高的代码。
服务器支持在线人数知识:
 CPU 处理多个进程,并非是在同一刻进行的(可以精确到1/1000秒),而是串行处理的。CPU通常把1秒的时间分割成N份,然后按照顺序,分别用1秒钟的第 1份处理第1个进程,用第2份处理第2个进程……用第N个份处理第N个进程,也就是说CPU的处理能力,不是在于这1秒钟内提交了多少申通,而是在于系统 把CPU处理工工作的时间分了多少的。通常系统默认可以支持256个进程,而CPU将1秒分成100份的话,那么剩余的156个进程就要在下一秒钟执行 了,网卡得到请求信息后,将请求信息送入内存进行排队,所以通常内存大的话,会感觉支持在线人数多一些,而实质上是与CPU划分时间片有关的,性能越高的 CPU划分的时间片就可能越多,即处理速度就快。在此所说的一个进程并非只是一个请求,一个进程通常可以包含100个相同请求,这样计算的话,CPU在1 秒钟内可处理请求数为100*100=10000,然而我们知道,大部分用户不可以在1分钟内只提交一次请求,即只点击一个链接。
 带宽的大小是 支持同时在线人数最关键的因素之一,服务器按照保证的最大带宽是5M(即5Mbit/s),相应的,服务器的数据最高传输速度应为5Mbit/s- 1024/8=540KB.1分钟流量大约640*60=38400KB。假设每个用户1分钟内始终占用10KB的流量,即该1分钟内支持占用这样的流量 的同时在线访问人数为3840人。(图片类和视频类站点尖此例,因为此类站点每个用户在1分钟内占用的流量大多数超过10KB。)但是,并不能保斑点每个 用户在1分钟内只有一个到该站的链接,假如每个用户在1分钟内有两个到该站的链接(每个链接始终占用10KB的流量),那么支持的在线人数应该在2000 以下。综上所述,一台中低端服务器通常支持在线人数最高为2000人左右,而且只适合普通WEB服务器和文字型论坛,不包括图片类、下载类、视频类等。其 实一台服务器如果在线人数能够达到这么多,那运营者也肯定是赚了不少钱,也就需要增加机器和带宽了。
 当页面内存在框架时,那么每多一个框架就要多一倍的在线数量,因为这相当于用户同一时间向服务器请求了多个页面。
 提高解决在线人数办法:
  1:去掉垃圾的插件版,用标准版!
  2:尽量不要采用框架的形式制作页面!
  3:不要放任何的音乐、电影、下载!
  4:防止盗连情况的发生!
  5:升级购买支持更多在线人数的空间!
  6:如果是无插件的纯论坛,而您的在线显示却只有IIS数的一半以下,您又不能确定到底是什么占用了连接,您可以联系我们,我们会您协助做网站访问日志,以便找出其他非法连接(超过一半以上和非纯论坛的用户不提供此服务)。
 服务器访问人数超过最大极限时就要考虑做服务器集群和LVS(匀衡负载)了。
PHP运行机制:
 Java解决方案中,JSP和Servlet是作为独立的Java应用程序执行的,它们在初始化之后就驻留内存,通过特定的接口和Web服务器通信,完成相应工作。因此可使用数据库连接池缓存技术。
 ASP.NET的机制与此类似。虽然也是一种解释型语言,但是仍然提供了Application对象来存放应用程序级的全局变量,它依托于ASP解释器在IIS中驻留的进程,在整个应用程序的生命期有效。
 PHP 是一种纯解释型在服务端执行的可以内嵌HTML的脚本语言,尤其适合开发Web应用程序。请求一个 PHP 脚本时,PHP 会读取该脚本,并将其编译为 Zend 操作码,这是要执行的代码的一种二进制表示形式。随后,此操作码由 PHP 执行并丢弃。 PHP脚本在每次被解释时进行初始化,在解释完毕后终止运行。这种运行是互相独立的,每一次请求都会创建一个单独的进程或线程,来解释相应的页面文件。页 面创建的变量和其他对象,都只在当前的页面内部可见,无法跨越页面访问。在终止运行后,页面中申请的、没有被代码显式释放的外部资源,包括内存、数据库连 接、文件句柄、Socket连接等,都会被强行释放。也就是说,PHP无法在语言级别上实现直接访问跨越页面的变量,也无法创建驻留内存的对象。
 PHP 这种独特的工作模型的优势在于,基本上解决了令人头疼的资源泄漏问题。Web应用的特点是大量的、短时间的并发处理,对各种资源的申请和释放工作非常频 繁,很容易导致泄漏甚至崩溃。PHP的运行机制决定它不存在常规的崩溃问题(顶多连接超时脚本停止执行),可以说PHP是较稳定的Web应用。但是,这种 机制的缺点也非常明显。最直接的后果是,PHP在语言级别无法实现跨页面的缓冲机制。这种缓冲机制缺失造成的影响,可以分成两个方面:一是对象的缓冲、二 是数据库连接的缓冲。PHP的工作模型即是缺点也是优势。
 深入探讨:
  Apache启动后,PHP解释程序也随之启动;
  PHP的启动过程有两步;
  第一步是初始化一些环境变量,这将在整个SAPI生命周期中发生作用;
  第二步是生成只针对当前请求的一些变量设置。
  如同PHP启动一样,PHP的关闭也分两步:
 PHP启动第一步:第一步也是最主要的一步,第一步的操作在任何请求到达之前就发生了。
  启动Apache后,PHP解释程序也随之启动;
  PHP调用各个扩展的MINIT方法,从而使这些扩展切换到可用状态。看看php.ini文件里打开了哪些扩展吧;
  MINIT的意思是“模块初始化”。各个模块都定义了一组函数、类库等用以处理其他请求。
 PHP启动第二步:
  当一个页面请求发生时,SAPI层将控制权交给PHP层。于是PHP设置了用于回复本次请求所需的环境变量。同时,它还建立一个变量表,用来存放执行过程中产生的变量名和值。
  PHP调用模块的RINIT方法即“请求初始化”。例子是Session模块的RINIT,如果在php.ini中启用了Session模块,在调用该模块的RINIT时就会初始化$_SESSION变量,并将相关内容读入;
  RINIT方法可以看作是一个准备过程,在程序执行之间就会自动启动。
 PHP关闭第一步:
  一旦页面执行完毕(无论是执行到了文件末尾还是用exit或die函数中止),PHP就会启动清理程序。它会按顺序调用各个模块的RSHUTDOWN方法。
  RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。
 PHP关闭第二步:最后,所有的请求都已处理完毕,SAPI也准备关闭了,PHP开始执行第二步:
  PHP调用每个扩展的MSHUTDOWN方法,这是各个模块最后一次释放内存的机会。
  这样,整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”(http://www.myext.cn/Article/920.html)。
PHP游戏实例:网页游戏地下城与勇士、、策略游戏分析猜测、单词链通过一个单词生成单词链(http://www.ibm.com/developerworks/cn/opensource/os-php-gamescripts3/)。
 
PHP中函数的运行机制与实现原理:
 php中,横向划分的话函数分为两大类:user function(用户函数)和internal function(内置函数)。对于user function,又可以细分为function(函数)和method(类方法)。
 php 实现了一个典型的动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后ZEND虚拟 机顺次执行这些指令完成操作。Php本身是用c实现的,因此最终调用的也都是c的函数,实际上,我们可以把php看做是一个c开发的软件。
 语言结构(伪函数)比函数运行要快(isset()与array_key_exists、array[]与array_push)。
 通过对函数实现的原理分析和性能测试,我们总结出以下一些结论:
  PHP的函数调用开销相对较大。
  函数相关信息保存在一个大的hash_table中,每次调用时通过函数名在hash表中查找,因此函数名长度对性能也有一定影响。
  函数返回引用没有实际意义。
  内置php函数性能比用户函数高很多,尤其对于字符串类操作。
  类方法、普通函数、静态方法效率几乎相同,没有太大差异。
  除去空函数调用的影响,内置函数和同样功能的C函数性能基本差不多。
  所有的参数传递都是采用引用计数的浅拷贝,代价很小。
  函数个数对性能影响几乎可以忽略。
 对于php函数的使用,有如下一些建议:
  一个功能可以用内置函数完成,尽量使用它而不是自己编写php函数。
  如果某个功能对性能要求很高,可以考虑用扩展来实现。
  PHP函数调用开销较大,因此不要过分封装。有些功能,如果需要调用的次数很多本身又只用1、2行代码就行实现的,建议就不要封装调用了。
  不要过分迷恋各种设计模式,如上一条描述,过分的封装会带来性能的下降。需要考虑两者的权衡。PHP有自己的特点,切不可东施效颦,过分效仿java的模式。
  函数不宜嵌套过深,递归使用要谨慎。
  伪函数性能很高,同等功能实现下优先考虑。比如用isset代替array_key_exists。
  函数返回引用没有太大意义,也起不到实际作用,建议不予考虑。
  类成员方法效率不比普通函数低,因此不用担心性能损耗。建议多考虑静态方法,可读性及安全性都更好。
  如不是特殊需要,参数传递都建议使用传值而不是传引用。当然,如果参数是很大的数组且需要修改时可以考虑引用传递。
 
PHP系统设计与说明:
系统使用缓存模板机制,模板可以使用include方式调用。
错误异常处理机制。
version_compare(PHP_VERSION,'5.0.0','<'):版本比较。
function_exists('memory_get_usage'):判断函数是否存在。
系统初始登录时,判断目录结构,没有则创建所有目录结构。
PHP得到Mac地址方法:echo "<xmp>";$ip="192.168.6.154";//局域网ip exec("nbtstat -A $ip",$arr);print_r($arr);
PHP处理session的原理:当一个有效请求发生时,PHP会根据某个概率,来决定是否调用一个GC(Garbage Collector)。GC的工作,就是扫描所有的session信息,
 用 当前时间减去session的最后修改时间(modified date),同配置参数(configuration option)session.gc_maxlifetime的值进行比较,如果生存时间已经超过gc_maxlifetime,就把该session删 除。配置参数 session.gc_probability/session.gc_divisor的值(可以通过php.ini或者ini_set()函数来修 改)。默认情况下,session.gc_probability = 1,session.gc_divisor=100,也就是说有1%的可能性会启动GC。 这三个参数,session.gc_maxlifetime/session.gc_probability /session.gc_divisor都可以通过php.ini或者ini_set()函数来修改。但要记得,如果使用ini_set()函数的话,必 须在每一个页面的开始处都调用ini_set()。PHP中的session有效期默认是1440秒(24分钟),修改这个默认值,正确的解决办法是修改 配置参数session.gc_maxlifetime。
PHP的用途:服务器端脚本站、命令行执行脚本、客户端GUI应用程序、自由ODBC数据库接口机制与开源可移值性、压解缩|图片处理|PEF|Flash应用、XML处理、电子商务及搜索引擎、翻译等。
PHP的重点:PHP函数性能优化使用、作用域分析、与Ajax运用、面向对象、异常处理、站点系统设计架构、缓存模式、静态化设计、模板框架、建站负荷瓶颈。
PHP的难点:面向对象、站点系统设计架构、缓存与静态化设计、模板框架、LVS、建站优化。
PHP的优点:程序驻留内存重复使用、跨平台、免费开源性、面向对象、服务端脚本、HTML内嵌易学、与众多数据库(MySQL)完美结合、效率高耗源少。
PHP的缺点:无多线程机制、解释运行机制在语言级别上没有办法让某个对象常驻内存(对象缓冲与数据库连接缓冲)、缺乏对名字空间的支持、缺乏对Unicode的支持、缺乏统一的命名规范、缺乏标准框架(www.builder.com.cn/2007/0719/427564.shtml)。
PHP高级应用:
 create_function():给原类附加个方法,过多时建议直接用继承。
 高级环境配置、高级语法和应用、面向对象技术、高级图像技术、用PHPLIB实现模板的处理、用PHPDoc实现文档的自动生成、PHP与组件技术、PHP的Socket编程、PHP与WML、PHP与XML。
 利用PHP的header()函数可以调整Web浏览器和代理服务器的缓存。4种头标类型:Last-Modified(最后修改时间); Expires(有效期限); Pragma(编译指示);Cache-Control(缓存控制);
 十个PHP高级应用技巧:
  1,使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里。这种方法把存储空间降到了接近四分之一,而且加快了搜索和排序的速度。
  2,在验证 email 地址的时候使用 checkdnsrr() 函数验证域名是否存在。
  3,如果你使用的是 PHP 5 和 MySQL 4.1 或者更高的版本,考虑抛弃 mysql_* 系列函数改用改进版的 mysqli_* 系列函数。可以使用预处理语句,能够加快查询速度。
  4,学会爱上三元运算符。
  5,如果你在项目中感觉到有可复用的部分,在你写下一行代码前先看看 PEAR 中是否已经有了。这个在线资源库包含了超过 400 个可以复用的程序片段。
  6,用 highlight_file() 来自动的打印出格式化的很漂亮的源代码。要小心不要意外的泄露出你的数据库连接信息和密码等。
  7,使用error_reporting(0)函数来防止用户看到潜在的敏感错误信息。理想情况下发布服务器应该在php.ini里完全禁止。能够在出错的时候完全屏蔽敏感的 SQL 查询语句和路径名。
  8,在网数据库中存储很大的字符串之前使用gzcompress()和gzuncompress()来显式的压缩/解压字符串。PHP内置函数使用gzip算法,可以压缩普通文本达90%,需要全文检索时例外。
  9,通过“引用”传递参数的方法从一个函数中得到多个返回值。
  10,完全理解“魔术引号”和 SQL 注入的危险性。
PHP连接池的问题:
 php 脚本本身的确是不能做连接池的,因为php脚本在解释执行完毕后会释放所有内存资源,当然其中用到的数据库连接也会被释放,但一些中间件也是可以做为连接 池的,只要提供php的相关驱动,所以可以自己做php的连接池,但是绝对作不了100% pure php的连接池。mysql_pconnect是php内建的一个模拟连接池,但这套机制不是用php脚本实现的。
 连接池的作用主要是节省打开数据库的时间。连接池机制预先打开N个数据库连接,把它们缓存起来,当需要使用数据库的时候就直接使用这些已经打开的连接,从而节省了时间。连接池的存在基本上消除了数据库连接断开的时间与cpu开销。
 连接池解决方案:
  1、pconnect(持久连接):pconnect的原理,和连接池差不多的,都是程序关闭连接,但PHP并不真正关闭,再次打开时,直接使用可用的连接。
   如果因为访问量太大出现Mysql应该配置 Mysql 数据库服务的my.cnf 里的 max_connection 的值,如max_connections = 2000。
  2、mysql proxy。
  3、memcache:针对mysql的一个数据库缓存实现。
  4、SQL Relay:一个开源的数据库池连接代理服务器。支持Oracle、MySQL、mSQL、PostgreSQL、Sybase、MS SQL Server、IBM DB2、Sybase、SQLite、Lago、 ODBC、MS Access等。
  安装与配置[SQL SERVER](http://blog.sina.com.cn/s/blog_4dd475390100hbck.html),安装SQL Relay需要先安装Rudiments:
   1、安装Rudiments:
    # tar vxzf rudiments-0.28.2.tar.gz
    # cd rudiments-0.28.2
    # ./configure --prefix=/usr/local/rudiments
    # make
    # make install
   2、安装SQL Relay:
    # tar vxzf sqlrelay-0.36.4.tar.gz
    # cd sqlrelay-0.36.4
    # ./configure --prefix=/usr/local/sqlrelay --with-rudiments-prefix=/usr/local/rudiments --with-mysql-prefix=MySQL安装路径 --with-freetds-prefix=FreeTDS安装路径 --with-oracle-home=Oracle安装路径 --with-php-prefix=PHP安装路径
    # make
    # make install
   3、 设置PHP:修改 php.ini中extension_dir = "./",把以上内容修改为:extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20050922"。
   根据PHP安装的路径来修改,并不是每个版本的PHP都是这个路径,在php.ini中添加如下内容extension=sql_relay.so。
   4、修改SQL Relay的配置文件
    # cd /usr/local/sqlrelay/etc
    # cp sqlrelay.conf.example sqlrelay.conf
    把sqlrelay.conf的内容改为:
    <?xml version="1.0"?>
    <!DOCTYPE instances SYSTEM "sqlrelay.dtd">
    <instances>
    <instance id="msdetest" port="9000" socket="/tmp/msdetest.socket" dbase="freetds" connections="5" maxconnections="10" maxqueuelength="0" growby="1" ttl="60" endofsession="commit" sessiontimeout="5" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass">
    <users>
    <user user="sa" password="sa"/>
    </users>
    <connections>
    <connection connectionid="msdetest" string="server=msde;db=pubs;user=sa;password=sa;" metric="1"/>
    </connections>
    </instance>
    </instances>
  启动SQL Relay,并测试;
   1、启动 SQL Relay
    # export PATH=$PATH:/usr/local/sqlrelay/bin
    # sqlr-start -id msdetest
   2、使用SQL工具:
    # sqlrsh -id msdetest
    可以直接输入SQL语句停止SQL Relay:# sqlr-stop msdetest
   3、测试PHP,写一个PHP文 件,内容如下:
    <?
    $con=sqlrcon_alloc("msdetest",9000,"/tmp/msdetest.socket","sa","sa",0,1);
    $cur=sqlrcur_alloc($con);
    sqlrcur_sendQuery($cur,"select * from t_gifts");
      for ($row=0; $row<sqlrcur_rowCount($cur); $row++) {
        for ($col=0; $col<sqlrcur_colCount($cur); $col++) {
          echo sqlrcur_getField($cur,$row,$col);
          echo ",";
        }
        echo "<br>\n";
      }
    sqlrcur_free($cur);
    sqlrcon_free($con);
    ?>
 php+sqlrelay+mysql实现连接池及读写负载均衡:
 为了有效的解决并发访问的瓶颈,利用多台数据库master-slave的模式来增加web的并发访问量。master-slave模式是为了数据同步的问题。
 sqlrelay 解决连接池问题以及实现读写分离的均衡负载。sqlrelay配置3个instance A/B/C,A负责从Master和slave读取数据,B负责写数据,且只写Master,C为router负责调度应用。php通过A还是通过B连接 数据库。在实际配置中,由于master承担了读写操作,那么在instance A的配置中,可以把从Master的连接稍微降小,把从slave连接读取数据的连接数稍稍增大以此进行平衡。
 配置与应用(http://blog.163.com/lgh_2002/blog/static/4401752620107393057989/):
  一、MySQL master/slave配置
   ################
   #mster/slave配置
   ################
   master:192.168.1.51
   slave:192.168.1.50
   1、master配置
    /etc/my.cnf 中加入
    binlog-do-db=book book为数据库名确保
    server-id=1
    log-bin=mysql-bin
    授权给rep用户进行复制操作
    GRANT REPLICATION SLAVE ON book.* TO rep@192.168.1.50 IDENTIFIED BY '123456';
    重启master服务
   2、配置slave
    vi /etc/my.cnf
    设置下面4行
    server-id       = 2
    master-host     =   192.168.1.51
    master-user     =   rep
    master-password =   123456
    重启slave
   3、把master的原始数据导入slave。
  二、sqlrelay配置
   当前行业中比较流行的连接池解决方案几乎都不支持php,经过多番努力终于在找到了一个开源的连接池技术--------sqlrelay。
   sqlreplay支持的语言:C C++ Perl  Python PHP Ruby  Java TCL Zope。
   sqlreplay支持的数据库:Oracle MySQL mSQL PostgreSQL Sybase MS SQL Server   IBM DB2 Interbase Sybase SQLite ODBC MS Access
   基本思路:
   1、配置2个实例用以最终处理业务
    clubs-read
    clubi-write
    其中读取的 instance分别配置两个连接,且两个连接启动对等的连接数。
   2、配置一个instance来调度读写操作,即clubr
    通过router来区分读写连接不同的mysql数据库。
     <?xml version="1.0"?>
     <!DOCTYPE instances SYSTEM "sqlrelay.dtd">
     <instances>
     <!-- club Instance -->
     <instance id="clubs" port="9002" socket="/tmp/clubs.socket" dbase="mysql" connections="10" maxconnections="20" maxqueuelength="5" growby="1" ttl="60" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass" deniedips="" allowedips="" debug="none" maxquerysize="65536" maxstringbindvaluelength="4000" maxlobbindvaluelength="71680" idleclienttimeout="-1" maxlisteners="-1" listenertimeout="0">
       <users>
         <user user="club" password="edb:club"/>
       </users>
       <connections>
         <connection connectionid="master51" string="host=192.168.1.51;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>
         <connection connectionid="slave50" string="host=192.168.1.50;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>
       </connections>
     </instance>
     <instance id="clubi" port="9003" socket="/tmp/clubi.socket" dbase="mysql" connections="10" maxconnections="40" maxqueuelength="5" growby="1" ttl="60" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass" deniedips="" allowedips="" debug="none" maxquerysize="65536" maxstringbindvaluelength="4000" maxlobbindvaluelength="71680" idleclienttimeout="-1" maxlisteners="-1" listenertimeout="0">
       <users>
         <user user="club" password="edb:club"/>
       </users>
       <connections>
         <connection connectionid="master51" string="host=192.168.1.51;port=3306;db=book;user=club;password=club;" metric="1" behindloadbalancer="no"/>
       </connections>
     </instance>
php.ini文件在系统中的优先级:PhpIniDir、注册表键值、环境变量%PHPRC%、PHP5的根目录(For CLI),或者WWW的根目录(For SAPI moudles)、Windows目录(C:\windows)。
PHP5特征:加入了面向对象机制、对于XML的复杂处理、异常处理机制。
PHP6特征:
 支持Unicode:虽然Unicode占用较多的空间,但Unicode带来的便利性,远超过占用空间的缺点。PHP也可以在.ini文件中设定是否开启支持Unicode。
 命名空间:命名空间是一种避免因函数或者类之间的命名冲突,而使你的函数和类以及方法无法读取,而不使用前缀命名惯例的一种方法。
 PHP6.0令人激动的Web 2.0特性。
 SOAP: 简单对象访问协议 (SOAP:Simple Object Access Protocol)SOAP 可以和现存的许多因特网协议和格式结合使用,包括:HTTP、SMTP、MIME、RPC。
 XML: 从PHP 5.1版本开始,XMLReader和XMLWriter就已经包含在PHP内核,它可以让它可以让XML编程更加轻松。
 Register Globals 将被移除:它虽满方便的,但是却忽略会带来程序上安全性的隐患,PHP4.3.x版开始时,此项默认设置值即是关闭状态,PHP6后PHP3将完全无法使用。
 Magic Quotes 将消失:Magic Quotes主要是自动转义需要转义的字符,此项功能移除叶符合大多数PHP开发者的心声。
 Safe Mode 取消。
 ’var’ 别名为 ‘public’:在类中的var声明变成public的别名,相信是为了兼容PHP5而作的决定,PHP6现在也可以称作为OO语言了。
 通过引用返回将出错:现在透过引用返回编译器将会报错 例如$a =& new b()、function &c(),OO语言默认就是引用,所以不需要再使用&了。
 zend.ze1 compatbility mode 将被移去 Zend.ze1相容模式将被移去PHP5是为兼容旧有PHP4,所以在.ini中可选择是否开启相容模式。
 Freetype 1 and GD 1 support 将不见这两个是很久的Libs,所以不再支持,GD1早已被现在的GD2取代了。
 dl() 被移到 SAPI 中dl()主要是让设计师加载extension Libs,现在被移到 SAPI 中。
 Register Long Array 去除从PHP5起默认是关闭,再PHP6中正式移除。
 Extension的变更:如XMLReader、XMLWriter将不再是以Extension的方式出现,他们将被移入到PHP的核心之中默认是开启。
  ereg extension将被放入PECL,代表着它将被移出PHP核心,这也是为了让路给新的正则表达式extension,此外,Fileinfo extension 也将被导入PHP的核心之中。
 APC将被导入核心:这是一个提高PHP性能的功能,现在它将被放入PHP核心中,并且可以选择是否启用APC。
 告别ASP风格的起始标签:原来是为了取悦ASP开发者转向使用PHP,现今已经不再需要这种做法了。
 PHP6.0除了增加新特性,一些会给系统带来不稳定因素和安全隐患的特性也将被取消,取消列表:magic_quotes、register_globals、register_long_arrays、safe_mode、magic_quotes。
 
PHP缓存与静态化知识:
缓存原理:缓存工作时程序查询数据时候,会把相应的结果序列化后保存到文件中,以后同样查询语句就可以不用直接查询数据库而是从缓存文件中获得。使得程序运行速度得以大幅度提升。
按缓存模式分有:页面缓存、数据缓存。ADODB缓存是数据缓存、smarty是页面缓存(Adodb+Smarty黄金搭档)。
按缓存技术分有:普遍缓存技术数据缓存、页面缓存、时间触发缓存、内容触发缓存(当插入数据或更新数据时,强制更新缓存)静态缓存、DNS轮询(BIND是一款开放源码的DNS服务器软件);
    内存缓存(减少数据库负载,提升访问速度)、php的缓冲器、MYSQL缓存、基于反向代理的Web缓存(如Nginx,SQUID,mod_proxy(apache2以上又分为mod_proxy和mod_cache))。
按缓存类型分有:缓存模块(Zend Cache、APC等)、HTML方式(CMS)、生成Cache文件、php内置缓存机制(Discuz)、缓存IE下载的文件
判断缓存是否改变:缓存文件时间超过了就会自动读取新的,不然就读取缓存文件。也可以在更新数据的同时用clear_cache函数清除你原来的缓存。
伪静态就是mod_rewrite,还有pathinfo方式、真静态就是利用缓冲机制,生成文件。
数据缓存,基本是memcache、代码缓存,基本是apc。
缓存模块实例:
 APC:
 全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”,但我个人觉得应该叫”另一个PHP缓存”。因为这个东西如果叫”可选PHP缓存”,容易给人一种可要可不要的,不怎么有用的错觉。
 PHP APC的安装: 一般是下载源代码然后phpize来编译安装,安装完以后在加上php.ini里加上 extension=apc.so 这么一行就行了。
 PHP APC的使用: APC的使用其实倒说不上.APC是个优化器,自安装之日起,就默默地在后台为您的PHP应用服务了.您的所有PHP代码会被缓存起来. 另外,APC可提供一定的内存缓存功能.但是这个功能并不是十分完美,有报告说如果频繁使用APC缓存的写入功能,会导致不可预料的错误.如果想使用这个 功能,可以看看apc_fetch,apc_store等几个与apc缓存相关的函数. 从PHP5.2开始,APC引入了一个小甜饼,解决了困扰大家已久的大文件上传的进度条问题。
 PHP APC的高级使用,缓存期限: APC的缓存分两部分:系统缓存和用户数据缓存。
 -- Windows下安装 --
 php_apc.dll下载:apc3.0.17-dev.zip
 将php_apc.dll放入 php.ini文件的extension_dir所指定的目录中(extension_dir = "C:\Program Files\php-5.2.10\ext")
 PHP.INI
 在PHP.INI文件里加入如下
 extension=php_apc.dll
 apc.rfc1867 = on
 apc.max_file_size = 200M
 upload_max_filesize = 200M
 post_max_size = 200M
 apc.enabled = 1
 apc.cache_by_default = on
 apc.shm_segments = 1
 apc.shm_size = 32
 apc.ttl = 600
 apc.user_ttl = 600
 apc.num_files_hint = 0
 apc.write_lock = On
 http://cvs.php.net/pecl/apc这页下一个apc.php的文件,上传到网站上运行,就可以看到apc的运行状态了,它能列出你程序中缓存共用了多少内存,有多少空闲,哪些程序有被缓存命中,命中次数有多少等等。
所 有功能可以在一台服务器上完成时,那么缓存的方案首选应该就是APC,不用考虑memcached。但如果考虑到网站规模会不断扩大,这点时间的性能差异 其实可以忽略不计的,就应该部署memcached了。另外,跨服务器使用memcached,最好要使用内网。不然的话,受路由的影 响,memcached经常会连接超时(超过100ms),而且会凭空多出来两倍的宽带流量(http://hi.baidu.com/5labs/blog/item/8a2f5d13c002d9c2c2fd782f.html)。
静态化:
 PHP静态化的简单理解就是使网站生成页面以静态HTML的形式展现在访客面前,PHP静态化分纯静态化和伪静态化,两者的区别在于PHP生成静态页面的处理机制不同。
 静态原理:利用程序生成静态的html或tpl,当用户向服务端发送相同请求时,显示这些html或tpl。
 伪静态化就是说访问地址看上去其后缀是html或htm等形式,但其内容实际上是动态生成的。就是URL的rewrite,即利用Apache mod_rewrite实现URL重写的方法。
 PHP生成静态HTML页面的方法:
 1、利用PHP模板生成静态页面,PHP模板实现静态化非常方便,比如安装和使用PHP Smarty实现网站静态化。
  2、使用PHP文件读写功能生成静态页面,PHP生成静态页面实例代码:
  <?
  $out1 =  "<html><head><title>PHP网站静态化教程</title></head><body>欢迎访问PHP网站开发教程网www.leapsoul.cn,本文主要介绍PHP网站页面静态化的方法</body></html>";
  $fp = fopen("leapsoulcn.html","w");
  if(!$fp)
  {
   echo "System Error";
   exit();
  }
  else
  {
   fwrite($fp,$out1);
   fclose($fp);
   echo "Success";
  }
  ?>
 3、使用PHP输出控制函数(Output Control)生成静态页面,输出控制函数(Output Control)也就是使用和控制缓存来生成静态HTML页面,也会使用到PHP文件读写函数。实例代码:
  <?
  ob_start();
  echo "<html>".
    "<head>".
    "<title>PHP网站静态化教程</title>".
    "</head>".
    "<body>欢迎访问PHP网站开发教程网www.leapsoul.cn,本文主要介绍PHP网站页面静态化的方法</body>".
    "</html>";
  $out1 = ob_get_contents();
  ob_end_clean();
  $fp = fopen("leapsoulcn.html","w");
  if(!$fp)
  {
   echo "System Error";
   exit();
  }
  else
  {
   fwrite($fp,$out1);
   fclose($fp);
   echo "Success";
  }
  ?>
 思路为:首先开启缓存,然后输出了HTML内容(你也可以通过include将HTML内容以文件形式包含进来),之后获取缓存中的内容,清空缓存后通过PHP文件读写函数将缓存内容写入到静态HTML页面文件中。
 获得输出的缓存内容以生成静态HTML页面的过程需要使用三个函数:
  1、ob_start函数一般主要是用来开启缓存,注意使用ob_start之前不能有任何输出,如空格、字符等。
   2、ob_get_contents函数主要用来获取缓存中的内容以字符串形式返回,注意此函数必须在ob_end_clean函数之前调用,否则获取不到缓存内容。
   3、ob_end_clean函数主要是清空缓存中的内容并关闭缓存,成功则返回True,失败则返回False。
 
PHP问题解决:
$var = [] operator not supported for strings:$var在页面元素中已经存在,要更换。也可以用标准的$var = array() 方式进行声明,以改变原变量的类型。
 
PHP相关Zend知识:
set_include_path('.'.PATH_SEPARATOR.'./library/'.PATH_SEPARATOR. get_include_path())://指明引用文件的路径,模型目录包含在include path中,以后就能很容易加载我们模型类。
 
PHP 函数知识:
function chinesesubstr($str,$start,$len){ $strlen=$start+$len;
    for($i=0;$i<$strlen;$i++){ if(ord(substr($str,$i,1))>0xa0){ $tmpstr.=substr($str,$i,2); $i++; }
else  $tmpstr.=substr($str,$i,1);  } return $tmpstr;     ——截取中文不出现乱码方法。
mb_substr($Str,$Lim,$Size,"utf-8"):PHP 截取符避免不出现乱码方法。
ord($value):返回字符的ASCII码值。
chr($value):返回ASCII码值所对应的字符。
a>b?a:b:三元操作符使用方式。
Switch用法:
 switch (expression) {
 case label1:
   code to be executed if expression = label1;
   break; 
 case label2:
   code to be executed if expression = label2;
   break;
 default:
   code to be executed
   if expression is different
   from both label1 and label2;
 }
strip_tags(处理字符串,允许的字体串):去掉字符串中的html标签。
parse_url: 严重不合格的URL,会返回FALSE并发出E_WARNING。否则会返回一个关联数组,组成部分为(至少有一个):scheme - 如 http、host、port、user、pass、path、query-在问号? 之后、fragment - 在散列符号 # 之后。遵从 PHP 向后兼容的需要有个例外,对 file:// 协议允许三个斜线(file:///...),其它任何协议都不能这样。
setcookie("cookie1",$_POST[user],time()+10):cookie设置一个变量的生命周期。
 

PHP面向对象知识:
public:对象可以访问、protected:继承类可以访问、private:类内部可以访问、static:类名::对象 任意处方式访问,不管申明多少个对象只存在一个。
面向对象有关:
 概念:类和对象、多态性、继承。
 类创建:类、属性(public $arg、var $arg)、操作的创建,其中类包括构造函数(P5:__construct()|P4:类名())、析构函数(__destruct(),不能带参数)。
 类的属性:使用$this->来访问、$object->$arg时将间接调用__get()函数(必须仅一个参数)、$object->$arg=1时将间接调用__set()函数(必须仅两个参数)。
 类实例化:类的继承(单向的)不支持多重继承、类操作的重载(只能是public方法),子类调用父类的重载方法:parent::方法名、final申明禁止函数被重载和继承。
 接口:接口可以看作是多重继承问题的解决方法,可以实现多个。
 常量:const方式申明(类外用类名::常量名方式访问)。
 静态方法:static方式申明(类外用类名::方法名方式访问),未初始化的情况下便可以使用。
 检查类类型:实例名 instanceof 类名方式使用,返回true或false。
 克隆:新实例名 clone 原实例名。
 抽象类:abstract 类名,抽象不能被实例化,只能被继承等操作。
 call重载法:__call(被调用方法名,传递给该方法的参数数组),可以使用判断可实现相应的操作(类、数组、另外)。
 自动加载:__autoload(),自动加载类申明,无须事先引用类文件。
 迭代器与迭代:foreach(实例 as $att) {echo $att;},输出所有其类属性。
 类转换成字符串:toString()实现类转换成字符串。
 反射API:实例 = new ReflectionClass(类);echo '<pre>';echo 实例; echo '</pre>'。
 

《PHP与MySQL.WEB开发》:
PHP标记风格:<?php ?>、<? ?>:遵循SGML、<script language="php"></script>:JavaScript方式、<% %>:默认禁用,使用asp_tags选项可以开启。
PHP注释风格:/* */:C风格、//:C++风格、#:Shell风格。
PHP输出风格:" "、' '、<<<任意标签 任意标签。
PHP标记符法:变量区别大小写、方法不区分大小写。
PHP设置变量:isset()判断是否存在、unset()重置、reset()重新设置到开始处。
PHP变量作用域:
 常量:全局可见包括函数内外。
 静态变量:函数内申明后限函数内可见多次执行过程将保留该值。
 全局变量: 内部超级全局变量脚本任意处可见($GLOBALS、$_SERVER、$_SESSION、$_GET、$_POST、$_REQUEST、$_FILES、$_ENV);
    脚本申明全局变量限整个脚本不包括函数内部;
    函数内部申明全局时名称要一致。
 函数内部变量:对函数而言是本地的函数结束后就不存在了。
PHP执行操作符:``表达式的值是命令的执行结果(eg:$out=`ls -a`:Unix、$out=`dir c`:Windows)。
PHP类型执行符:instanceof(eg:$object instanceof ObjectClass)。
PHP实现\n转化<br />:nl2br函数,
PHP数组排序:sort()值排序下标为数字、asort()值排序下标任意、ksort()下标排序限一维、usort()和uasort()与uksort()用户定义的排序函数、shuffle()、array_reverse任意与反向。
PHP统计数组值出现次数:array_count_value()。
PHP除掉空格函数:trim()、ltrim()、rtrim()。
PHP输出函数说明:echo与printf一样,是语言结构无返回值,printf即返回值又可以带参数(eg:printf("it's %.2f",$price)以%开始)、printf_f区别echo另一种递归打印输出方式效率低。
PHP字符转换:strtoupper()转大写、strtolower()转小写、Ucfirst()首字母转大写、Ucwords()字母每个单词转大写。
PHP字符分隔:explode(值,分隔标识)返回一个数组、strtok(值,分隔标识)吸取第一个值。
PHP字符串比较:strcmp()比较两个字符串是否相等区分大小写、strcasecmp()比较不分大小写、strnatcmp()自然排序比较(12大于2)。
PHP字符串查找:strstr()对大小写敏感、strchr()两者类似、stristr()函数查找字符串在另一个字符串中第一次出现的位置,对大小写不敏感。
PHP字符串查找位置:strpos()第一次出现、strrpos()最后一次出现位置,查找字符串时PHP手册建议使用strpos实现。
PHP字符串查找替换:str_replace()、substr_replace()查找给定位置进行替换。
PHP正则查找字符串:ereg()、eregi()不区分大小写。
PHP正则查找并替换:ereg_replace()、eregi_replace()不区分大小写。
PHP正则分割字符串:splite('\.|@',husumiao@yahoo.com.cn)将分成五个部分。
PHP 加入页眉页脚另类方法:auto_prepend_file与auto_append_file,也可设置.htaccess文件php_value auto_prepend_file "../header.inc"|auto_append_file "../footer.inc"。
数据库的优势(RDBS关系数据库):
 比普通文件的数据访问速度更快;
 更容易查询并提取满足特定条件的数据;
 具有专门的内置机制处理并发访问问题;
 可以提供对数据的随机访问;
 具有内置的权限系统。
MySQL子查询:
 基本子查询:select * from table1 where col1=(select * from table2);
 子查询和操作符:ANY、IN、SOME、ALL;
 关联子查询:EXISTS、NOT EXISTS;
 行子查询:select c1,c2,c3 from t1 where (c1,c2,d3) in (select c1,c2,c3 from t2);
 子查询作临时表:from后使用子查询;
更新、修改、删除数据库记录:
 更新:update table set col=exp,... where condition order by col limit number,后面也可加条件,不加为所有;
 修 改表:alter table customers modify name char(70) not null、aleter table orders add tax foloat(6,2) after amounts、alter table orders drop tax;
 删除记录:delete from customers where costomerid=5、drop database test。
数据库过虑:get_magic_quotes_gpc()判断是否已经自动完成了引号、addslashes|stripslashes添加|去除斜线来相应处理数据。
建立连接:new mysqli(local,user,pass,db)面向对象返回对象、mysqli_connect(local,user,pass,db)过程方式连接返回资源。
断开连接:$resule->free()、mysqli_free_result($result)或$db=>close()、mysqli_close($db)。
连接量配置:MySQL在my.ini文件中配置max_connections决定同时连接个数,Apache在httpd.conf文件中设置MaxClients来通过服务器拒绝新的连接请求。
Prepared语句:mysqli函数库支持prepared语句的使用,基本思想是可以向MySQl发送一个需要执行的查询模板,然后单独发送数据($q="insert into book value(?,?);
 $s=$db->prepared($q);$s->bind_param('','$isbn');$s->execute();echo $s->affected_rows;$s->close();")。
MySQL权限知识:
 MySQL数据库中的mysql表存储了所有用户等的相关权限,所保存信息的5个表:user、host、db、tables_priv、columns_priv;
 describe user:浏览该表的结构,查看权限详细。
 更新权限:flush privileges、操作系统中mysqladmin flush-privileges|mysqladmin reload。
 注意事项:不要将process观察其他用户在做什么、file读写操作系统文件、shutdown、reload等权限授予任何非管理员用户。
 权限转移:一个人的权限可以分配给另一个人。
 Web问题:授予select、insert权限,不给予drop、alter、create。
 查看权限:show grants for 表。
 查询操作过程:explain table、describe table、show columns from table。
EXPLAIN知识:
 查询语句末尾加\G选项解决表行宽度太大以垂直模式显示结果。
 查看MySQL是如何来解释并执行一个select查询,在语句前加explain即可。
 查询时间过长、语句过于复杂可以使用explain语句提前检查它。
数据库优化:
 设计优化:少用varchar、text、blog、null。
 权限:权限尽量少。
 表 的优化:表随着更新和删除操作,数据支离破碎使用方法:optimize table tab|myisamchk -r table|myisamchk --sort-index --sort-records=1 pathtomysqldatadirectory/*/*.MYI。
 使用索引:简化索引,不创建查询时不使用的索引,运行前使用explain命令检查访索引是否正在使用中。
 使用默认值。
数据库备份恢复:
 备份:
  复制文件:确认表在被锁定中,表类型是READ或WRITE,执行之前执行FLUSH TABLES命令确保索引所做的任何修改将备份写入到磁盘。
  使用命令:mysqldump --opt --all-databases > all.sql,备份所有数据库到all.sql文件中。
  使用脚本:mysqlhotcopy database /path/for/backup,使用后启动和停止数据库的操作,备份的最后一个方法是维护数据库的一个拷贝。
 恢复:
  第一种方法备份的,可以将数据库文件重新复制到mysql的相同位置。
  经二种方法备份的必须在导出文件中运行查询,接着还应该将数据库更新保存到二进制日志文件中的状态:mysqlbinlog hostname-bin,[0-9]*|mysql。
MySQL高级编程:
 文件载入表数据:load data infile "newbooks.txt" into table books:命令从文件将原始数据读入到表books。默认文件中的数据字段必须tab健间隔和必须包括在单引号内行以\n间隔
 事务(确保数据库一致的机制,具有ACID(原子性、一致性、独立性、持续性)原则):
  关闭自动提交模式:set autocommit=0,自动提交被打开时start transaction开始一个事务。
  commit|rollback:提交和回滚事务。。
 存储引擎表格类型包括(大多数Web应用程序中通常使用MyISAM或InnoDB表格或二者的结合),修改:alter table orders type=innodb|alter table order_items type=innodb:
  MYISAM:有索引的顺序访问访求,速度快可以被压缩支持全文搜索,不是事务安全的不支持外键。
  ISAM:如上所述,已经被废弃了。
  MEMORY|HEAP:表存储在内存中,索引是哈希分布所以使MEMORY非常快,发生崩溃时数据将丢失,应该在创建表的指定MAX_ROWS避免占用内存,不具有BLOG、TEXT、AUTO INCREMENT列。
  MERGE:允许你为了查询的目的,把MyISAM表集合作为一个单个表。
  BDB:事务安全的,提供COMMIT和ROOLBACK功能,比MyISAM表速度慢,是可以提供使用事务的所有优点,都是基于Berkeley DB的。
  InnoDB:事务安全的,与BDB具有相同的特性还更丰富,支持外键,速度很快。
 存储过程,调用使用call 存储过程名(@变量),语句中还可以包括条件和循环语句、游标、声明句柄:
  eg: delimiter //
   create procedure total_orders (out total float)
   begin
    select sum(amount) into total from orders;
   end //
   relimiter;
  包含局部变量实例:
   delimiter //
   create function add_tax (price float) returns float
   begion
    declare tax float default 0.10;
    return price*(1+tax);
   end //
   delimiter;
  查看过程:show create procedure 名称|show create function 名称。
  删除过程:drop procedure 名称|drop function 名称。
暂时改变运行时环境:ini_set(php.ini文件配置指令名称对象,值)、int_get()。
PHP其它特性:魔术引用、eval对串求值、加载php扩展部件(dl('php_pd2.dll'))、加亮源代码(show_source('fun.php')),php.ini文件中设置颜色、命令行使用PHP(php test.php)。
PHP源代码著名购物车:FishCartSQL(http://www.fishcart.org)。
PHP生成PDF文档:可以通过使用pdflib的API来实现,pdflib来自www.pdflib.com,不是免费的,phpinfo()可以查看PDFlib是否已经安装。
A4纸大小约:595*842、美国信函纸大小约:612*792(像素)。
Phpcms 是国内领先的网站内容管理系统,同时也是一个开源的PHP开发框架。Phpcms由内容模型、会员、问吧、专题、财务、订单、广告、邮件订阅、 短消息、自定义表单、全站搜索等20多个功能模块组成,内置新闻、图片、下载、信息、产品5大内容模型。Phpcms 采用模块化开发,支持自定义内容模型和会员模型,并且可以自定义字段。
PHPWind Forums论坛系统是一套采用PHP + MySQL方式运行的开源软件程序,可以帮助您轻松搭建并管理论坛。它拥有众多原创的核心技术,包括:独创的模版设计思想、成熟的数据库设计理念、索引数 据文件的利用及其算法、文件读写稳定性算法、数据库索引负载均衡算法、安全防护技术等。优势:
 独创、成熟:独创的技术架构和程序设计,着手塑造快速、稳健、可扩展的论坛程;
 安全:高效防护算法、程序监控技术、注入式入侵过滤技术、防CC攻击技术、安全验证机制构筑的站点安全体系,将风险防患于未然。
 快捷、稳定、高效:核心参数的合理配置、负载均衡处理技术、数据库分表技术、文件读写稳定性算法帮助您最大限度地节省硬件资源,保障站点在服务器繁忙时快速稳定运行。
 不仅为站长而设计:清晰的用户等级与权限设置,便捷完整的论坛功能与管理操作,详细地日志与统计记录,集成交易与支付,轻松备份/恢复数据给予站长和每一位会员良好的用户体验。
 可扩展:开源、规范化的代码编写、标准化的插件接口和清晰简洁的模板体系理念,让站点无限延伸至未来。
 丰富的第三方资源:近千款风格,近百款插件,仍在不断丰富。
 
实用函数等:
string strtolower|strtoupper(值)      ——使用数值大小转换。
string lstrim|rtrim|trim(值)       ——左|右|前后去掉空格。
string strrev(值)          ——值逆序输出。
int printf(值)           ——值格式化输出。
string explode|implode(值,值)       ——字符中的分割与连接。
int strpos|strrpos(要找值,被找值)      ——返回值第1次|首字符最后出现的位置。
string str_replace(找值,换值,被找值)     ——字符串的替换
int strcasecmp|strcmp(值,值)//大于返回1,小于返回-1,等于返回0      ——字符串大小比较不他大小写|分大小写。
int similar_text(值,值,相似度)       ——获取两个字符串的相似度
string base64_encode|base64_decode(值)|urlencode(值) ——字符串编码|解码|特殊字符编码//例地址栏值
\ 转义.|\|+|*|?|[|]|(|)|$        ——使用\实现特殊字符的转义。
string chr(int值)|int ord(string值)      ——字体与ASCII之间的转换。
int rand|mt_rand(最小值,大值)|strstr(找值,被找值)  ——产生随机数|返回找到的字符串始剩下的字符。
string md5(值)|crypt(值)|值^值       ——md5加密|加密|使用异或加密。
string number_format(值,保留位)、sprintf("%01.2f",值)、round(值,保留位)、ceil  ——保留小数位格式化|保留位数|四舍五入输出|大于数输出。
string ucfirst|ucwords(值)|值±32      ——单个|话中每个 单词首字母转大写|±32也可
int intval|string|gettype (值)       ——字符串|数值相互转换|返回值类型。
int preg_match(配值,被配值)        ——利用正则表达式匹配查找。
/(\d+).(\d+).(\d+).(\d+)/|p1*255*255*255+p2*255*255+p3*255+p4*1    ——验证|转换 IP地址为数值判断所在地。
string htmlspecialchars(值)//对&-&amp;|"-&quot|'-&#039|<-&lt|>-&gt转换  ——对特殊字符进行转换。
strign mb_substr|substr(字符串,开始位,长度)         ——截取字符指定长度值,中文避免不出现乱码。
<<<标记名 值 标记名//自定义例:echo <<<strmark 胡素苗 strmark;结果:胡素苗 ——php5创建字符串方法。
string gethostbyaddr(IP地址)|getenv("COMPUTERNAME")       ——得到计算机名称。
string gethostbyname(计算机名)       ——得到计算机IP地址。
string addslashes(值)         ——加特殊字符函数。
string htmlentities()|htmlspecialchars()    ——替换string字符成HTML特殊字集字符串。
bool isset()|empty()         ——判断对象是否有存在|为空。
exec("rm -rf 对象")          ——执行删除对象方式,常用于文件操作。
intval(mt_rand(最少值,最大值))       ——产生随机值方法。
if(function_exists('FunctionName')) {echo "Enabled";} ——检查系统是否存在函数。
dirname(__FILE__),(__FILE__)为得到包括文件名地址。  ——得到文件目录。
srand((double)microtime()*1000000);$var = rand(1000,9999);     ——产生随机种子与随机数。 
if( strlen(session_id())<=0 ){@session_start();}  ——判断 session 是否存在。
nowrap()            ——禁止自动换行。 
$url=$_SERVER['PHP_SELF'];$filename=substr($url,strrpos($url,'/')+1);    ——一个得到文件名的方法。
header("Location: ../");exit;       ——返回进入父目录方法。
date_default_timezone_set('Asia/Shanghai')/php.ini中date.timezone="Etc/GMT-8";  ——配置PHP输出时间慢8个小时问题.
面对分号不能成功编辑问题: stripslashes 实现提交,mysql_real_escape_string 实现更新执行。
time().rand(1000,9999):在time() 后面加上1000-9999 中的四位数。
srand((double)microtime()*1000000)、$var = rand(1000,9999):产生随机种子与随机数。
if( strlen(session_id())<=0 ){@session_start();}:判断 session 是否存在。
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />:php 页面乱码问题可以添加。
posted @ 2012-08-01 10:29  孤帆远航  阅读(1769)  评论(0编辑  收藏  举报