1 php安装
1.1 版本选择
1.1.1 如何选择PHP的VC9版本和VC6版本
VC6版本是使用Visual Studio 6编译器编译的,如果你的PHP是用Apache来架设的,那你就选择VC6版本。
VC9版本是使用Visual Studio 2008编译器编译的,如果你的PHP是用IIS来架设的,那你就选择VC9版本。
VC9版本是针对IIS服务器的版本,没有对APACHE的支持,而VC6版本对IIS和apache都提供了支持
1.1.2 如何选择PHP的Thread Safe和Non ThreadSafe版本
先从字面意思上理解,ThreadSafe是线程安全,执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的CGI执行方式而耗尽系统资源。Non Thread Safe 是非线程安全,在执行时不进行线程(Thread)安全检查。
再来看PHP的两种执行方式:ISAPI和FastCGI。 ISAPI执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以ISAPI来执行PHP,建议选择Thread Safe版本;
而FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以FastCGI来执行PHP,建议选择Non Thread Safe版本。
1.2 GD库安装
1.2.1 libxml安装
# cd /tmp
# wget http://xmlsoft.org/sources/libxml2-2.7.8.tar.gz
# tar zxvf libxml2-2.7.8.tar.gz
# cd libxml2-2.7.8
# ./configure --prefix=/usr/local/libxml2/
# make && make install
l Error:
libxml2报错
在64位系统下安装libxml2报错./.libs/libxml2.so: undefined reference to `gzopen64'。
解决方案参考资料:
http://hi.baidu.com/guangchun/blog/item/fadba086084bad3367096e19.html
http://hi.baidu.com/haofefe/blog/item/ac97ebfa684f7fccb48f31d6.html
Fix:
只需在配置后面添加:--without-zlib
1.2.2 zlib安装
下面安装libpng前要安装zlib,参考:http://fruithardcandy.iteye.com/blog/1460647。
# cd /tmp
# wgethttp://www.zlib.net/zlib-1.2.3.tar.gz
# tar zxvf zlib-1.2.3.tar.gz
# cd zlib/1.2.3/
# ./configure --prefix=/usr/local/zlib2/
64位要改:
#vi Makefile
找到 CFLAGS=-O3 -DUSE_MMAP
在后面加入-fPIC,即变成CFLAGS=-O3 -DUSE_MMAP -fPIC
# make && make install
Ubuntu可直接安装
1.2.3 jpeg安装
# cd /tmp
# wgethttp://quirkysoft.googlecode.com/files/jpegsrc.v6b.tar.gz
# mkdir -pv/usr/local/jpeg6{,bin,lib,include,man/man1,man1}
# tar zxvf jpegsrc.v6b.tar.gz
# cd jpeg-6b
64位系统要执行如下两句:
# cp /usr/local/share/libtool/config.sub ./
# cp /usr/local/share/libtool/config.guess./
32位系统用:
# ./configure --prefix=/usr/local/jpeg6
64位系统用:
# ./configure --prefix=/usr/local/jpeg6/--enable-shared --enable-static
# make
# make install-lib
# make install
l Error1:
安裝jpeg-6b png error错误解决方法
/usr/bin/install -c -m 644 jconfig.h/usr/local/jpeg6/include/jconfig.h
/usr/bin/install: cannot create regularfile `/usr/local/jpeg6/include/jconfig.h': No such file or directory
make: *** [install-headers] Error 1
Fix:
下面创建需要的文件夹
# mkdir /usr/local/jpeg6
# mkdir /usr/local/jpeg6/include
# mkdir /usr/local/jpeg6/lib
# mkdir /usr/local/jpeg6/bin
# mkdir /usr/local/jpeg6/man
# mkdir /usr/local/jpeg6/man/man1
# make clean
# make && make clean
l Error2:
jpegb安装出现错误
php-jpeg库文件安装问题,在做 configure 的时候,报上述的错误。
Fix:
把 /usr/share/libtool/config.guess 覆盖到相关软件自带的config.guess
把 /usr/share/libtool/config.sub 覆盖到相关软件自带的config.sub
./configure ---prefix=/usr/local/jpeg6--enable-shared --enable-static
l Error3:
/usr/bin/install -c cjpeg/usr/local/jpeg6/bin/cjpeg
Fix:
# mkdir /usr/local/jpeg6/bin
1.2.4 libpng安装
# cd /tmp
# wgetftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.4.11.tar.gz
# tar zxvf libpng-1.4.11.tar.gz
# cd libpng-1.4.11
Redhat 需要拷贝makefile
#cp scripts/makefile.linux makefile
# ./configure --prefix=/usr/local/libpng/
# make && make install
Error:configure: error:zlib not installed
Fix:设定环境变量
exportLDFLAGS="-L/usr/local/zlib/lib"
exportCPPFLAGS="-I/usr/local/zlib/include"
1.2.5 freetype安装
# cd /tmp
# wgethttp://oss.oetiker.ch/rrdtool/pub/libs/freetype-2.3.5.tar.gz
# tar zxvf freetype-2.3.5.tar.gz
# cd freetype-2.3.5
# ./configure--prefix=/usr/local/freetype2/
# make && make install
1.2.6 gettext安装
# tar zxvf gettext-0.18.1.1.tar.gz
# cd gettext-0.18.1.1
# ./configure –prefix=/usr/local/gettext/
# make && make install
1.2.7 GD库安装
./configure --prefix=/usr/local/gd2--with-zlib=/usr/local/zlib2/ --with-png=/usr/local/libpng/--with-jpeg=/usr/local/jpeg6/ --with-freetype=/usr/local/freetype2/--with-gettext=/usr/local/gettext/ --with-libxml=/usr/local/libxml2
l Error1:
gd库安装出错
不支持某些库文件:
Supportfor PNG library: yes
Supportfor JPEG library: yes
Supportfor Freetype 2.x library: yes
Supportfor Fontconfig library: yes
Supportfor Xpm library: yes
Supportfor pthreads: yes
Fix:
Support for Fontconfig library: no #yum -y install fontconfig-devel
Support for Xpm library: no #yum -y install libXpm-devel
安装GD时的错误 make[2]: *** [gd_png.lo] Error 1
Fix:
在编译文件里vi gd_png.c
找到”#include <png.h>”
改成”#include usr/local/libpng/include/png.h>”
1.3 PHP安装
1.3.1 apache环境
./configure
--prefix=/usr/local/php5--with-config-file-path=/usr/local/php5 --with-mysql=/usr/local/mysql/--with-apxs2=/usr/local/apache2/bin/apxs --with-jpeg-dir=/usr/local/jpeg6/--with-freetype-dir=/usr/local/freetype2/ --with-zlib-dir=/usr/local/zlib/--with-png-dir=/usr/local/libpng/ --with-libxml-dir=/usr/local/libxml2--with-gd=/usr/local/gd2/ --with-mysqli=/usr/local/mysql/bin/mysql_config--with-mcrypt=/usr/local/libmcrypt/ --with-curl=/usr/local/curl
make && make install
1.3.2 nginx环境(fastcgi安装)
./configure --prefix=/usr/local/php--with-config-file-path=/usr/local/php --with-mysql=/usr/local/mysql/--with-jpeg-dir=/usr/local/jpeg6/ --with-freetype-dir=/usr/local/freetype2/--with-zlib-dir=/usr/local/zlib/ --with-png-dir=/usr/local/libpng/--with-libxml-dir=/usr/local/libxml2 --with-gd=/usr/local/gd2/--with-mysqli=/usr/local/mysql/bin/mysql_config --with-curl=/usr/local/curl--enable-fastcgi --enable-fpm
make && make install
1.4 扩展库安装
1.4.1 安装扩展库curl
下载地址:http://curl.haxx.se/.
l 安装php之前:
# ./configure --prefix=/usr/local/curl
# make && make install
配置php时添加--with-curl=/usr/local/curl即可
l 安装php之后:
首先安装curl,
# ./configure --prefix=/usr/local/curl
# make && make install
# cd /usr/local/src/php-5.3.10/ext/curl/
# /usr/local/php5/bin/phpize
# ./configure--with-php-config=/usr/local/php5/bin/php-config --with-curl=/usr/local/curl/
# make && make install
# cp/usr/local/php5/lib/php/extensions/no-debug-zts-20090626/curl.so
/usr/local/php5/lib/php/extensions/curl.so
# vi /usr/local/php5/php.ini
添加extension_dir="/usr/local/php5/lib/php/extensions" extension=curl.so
# service httpd restart
1.4.2 安装扩展库libmcrypt
需要在php安装时编译
mcrypt:http://haikong808.blog.51cto.com/434419/392106
同curl扩展
1.4.3 安装扩展库mbstring
http://www.jb51.net/os/RedHat/10332.html
# cd /usr/local/src/php-5.3.10/ext/mbstring/
# /usr/local/php5/bin/phpize
# ./ocnfigure--with-php-config=/usr/local/php5/bin/php-config
# make && make install
# cp/usr/local/php5/lib/php/extensions/no-debug-zts-20090626/mbstring.so
/usr/local/php5/lib/php/extensions/mbstring.so
# vi /usr/local/php5/php.ini
添加extension_dir="/usr/local/php5/lib/php/extensions" extension=mbstring.so
# service httpd restart
1.4.4 安装扩展库memcache
# tar zxvf memcache-3.0.6.tgz
# cd memcache-3.0.6
# /usr/local/php/bin/phpize
# ./configure--with-php-config=/usr/local/php/bin/php-config --enable-memcache
# make && make install
# vi /usr/local/php/lib/php.ini
增加
extension_dir ="/usr/local/php/lib/php/extensions/no-debug-non-zts-20050922/"
extension=memcache.so
2 配置
2.1 Fastcgi配置管理
2.1.1 Fastcgi配置优化
php-fpm默认配置文件:/usr/local/php/etc/php-fpm.conf
2.1.2 Fastcgi进程管理
在配置完php-fpm后,就可以启动FastCGI进程了。
启动fastcgi进程有两种方式:
/usr/local/php/bin/php-cgi --fpm 或者
/usr/local/php/sbin/php-fpm start
建议采用第二种方式启动FastCGI进程。
/usr/local/php/sbin/php-fpm参数,具体为start|stop|quit|restart|reload|logrotate。
每个启动参数的含义:
? start,启动PHP的FastCGI进程。
? stop,强制终止PHP的FastCGI进程。
? quit,平滑终止PHP的FastCGI进程。
? restart, 重启PHP的FastCGI进程。
? reload, 重新加载PHP的php.ini。
? logrotate, 重新启用log文件。
reload是个很重要的参数,它可以在PHP的FastCGI进程不中断的情况下重新加载改动过的php.ini,因此通过php-fpm可以平滑变更FastCGI模式下的PHP设置。
在FastCGI进程启动后,其监听的IP地址和端口也随即启动,可以通过ps和netstat查看相关信息。netstat -antl|grep 9000 ps-ef|grep php-cgi
2.2 PHP配置管理
查看php版本:php –v
3 基本语法
3.1 PHP中超级全局变量使用
(参考资料:http://www.5idev.com/p-php_server.shtml)
3.1.1 GPSC
EGPCS值: (EGPCS是Environment、Get、Post、Cookies、Server的缩写 -- 这是PHP中外部变量来源的全部范围).
3.1.2 $_ENV
php中的$_ENV存储了一些系统的环境变量,因环境不同而值不同.
但有时候$_ENV是空的,可能有以下原因:
在php.ini中的variables_order值为"GPCS",也就是说系统在定义PHP预定义变量时的顺序是GET,POST,COOKIES,SERVER,没有定义Environment(E),
你可以修改php.ini文件的variables_order值为你想要的顺序,如:"EGPCS"。这时,$_ENV的值就可以取得了
可以用foreach来遍历$_ENV的数据,也可以直接用print_r($_ENV)来打印这个变量,查看他的数据.
3.1.3 $_SERVER
$_SERVER['QUERY_STRING']:查询(query)的字符串
$_SERVER['REQUEST_URI']:访问此页面所需的URI
$_SERVER['SCRIPT_NAME']:包含当期脚本的路径
$_SERVER['PHP_SELF']:当前正在执行脚本的文件名
eg.http://www.biuuu.com/index.php?p=222&q=biuuu
$_SERVER["QUERY_STRING"] =“p=222&q=biuuu”
$_SERVER["REQUEST_URI"] =“/index.php?p=222&q=biuuu”
$_SERVER["SCRIPT_NAME"] =“/index.php”
$_SERVER["PHP_SELF"] =“/index.php”
$_SERVER["QUERY_STRING"]获取查询语句,实例中可知,获取的是?后面的值
$_SERVER["REQUEST_URI"] 获取http://www.biuuu.com后面的值,包括/
$_SERVER["SCRIPT_NAME"] 获取当前脚本的路径,如:index.php
$_SERVER["PHP_SELF"] 当前正在执行脚本的文件名
3.2 过滤文本中特殊符号
htmlspecialchars()本函数将特殊字符转成HTML 的字符串格式 ( &....; )。最常用到的场合可能就是处理客户留言的留言版了。
& (和) 转成 &
" (双引号) 转成 "
< (小于) 转成 <
> (大于) 转成 >
此函数只转换上面的特殊字符,并不会全部转换成 HTML 所定的 ASCII 转换。
3.3 date
date_default_timezone_set(“Asia/Shanghai”)
时区格式:Asia/Shanghai; PRC
见:时区格式表http://www.php.net/manual/zh/timezones.asia.php
3.4 字符串函数
对大小写敏感的搜索:strpos()、str_replace();
对大小写不敏感的搜索:stripos()、str_ireplace()
3.5 SESSION COOKIE
3.5.1 SESSION
每一次php请求,会有1/100的概率(默认值)触发“session回收”。如果“session回收”发生,那就会检查/tmp/sess_*的文件,如果最后的修改时间到现在超过了1440秒(gc_maxlifetime的值),就将其删除,意味着这些session过期失效。
Session_id():32位数 01aab840166fd1dc253e3b4a3f0b8381,
session_id(‘hello’)则sessionID为hello,存放server端session文件名为sess_**和sess_hello两个文件
session.name:Session_name();默认为sessionID存储的变量名称,存放client,默认PHPSESSID
session.cookie_lifetime:代表sessionID在客户端cookie存储的时间,默认为0,代表浏览器关闭session就失效
session在不同文件传值:
filenameA:
<?php
session_start();
$_SESSION['user']= 'hello';
echosession_id('hello'); //j625oahiuq5bg6a75601of0ie7,设置sessionid为hello
echosession_id(); // hello
echosession_name(); //PHPSESSID
//session_destroy();
?>
filenameB:
<?php
session_id('hello'); // 取sessionid为hello的session,才可传值
session_start();
print_r($_SESSION);
echosession_id(); // hello
//session_destroy();
?>
3.5.1.1 session存放server端
(一般是Apache with PHPmodule)
Session 存放server端位置两种设置方式:
session.save_path = ‘/tmp’;ini_set(‘session.save_path’,‘/tmp’)
默认情况:
php会将session保存在/tmp目录下文件名为:
sess_01aab840166fd1dc253e3b4a3f0b8381。每一个文件对应了一个session(会话)。
more/tmp/sess_01aab840166fd1dc253e3b4a3f0b8381
session文件格式:username|s:9:”jiangfeng”;admin|s:1:”0″;
#变量名|类型:长度:值
删除这里的session文件,就表示对应的session失效了。
3.5.1.2 session存放client端(一般是浏览器)
session在浏览器端,只需要保存session ID(由server端生成的唯一ID)就可以了。有两种保存方式:在cookie中、在url里面。如果cookie中保存session ID,就可以看到浏览器的cookie中有一个PHPSESID变量。如果是URL传递的,就可以看到形如:
index.php?PHPSESID=01aab840166fd1dc253e3b4a3f0b8381的URL。(在server端通过session.use_cookies来控制使用哪一种方式)
3.5.1.3 session过期时间参数
两种设置方式:session.gc_maxlifetime = 1440;ini_set(‘session.gc_maxlifetime’,1440)
在server端,php如何判断session文件是否过期?
如果”最后的修改时间”到”现在”超过了gc_maxlifetime(默认是1440)秒,这个session文件就被认为是过期了,在下一次session回收的时候,如果这个文件仍然没有被更改过,这个session文件就会被删除(session就过期了)。
修改php.ini文件中的gc_maxlifetime变量就可以延长session的过期时间。
注意:php5里面session过期使用了回收机制。这里设置时间为86400秒,如果session在86400秒内没有被修改过,那么在下一次“回收”时才真的被删除。
3.5.1.4 session回收机制
由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效。当一个有效请求发生时,PHP会根据全局变量
session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改)的值,来决定是否启动一个GC(Garbage Collector)。默认情况下,session.gc_probability = 1,session.gc_divisor=100,也就是说有1%的可能性会启动GC。
GC的工作,就是扫描所有的session信息,用当前时间减去session的最后修改时间(modifieddate),同session.gc_maxlifetime参数进行比较,如果生存时间已经超过gc_maxlifetime,就把该session删除。
默认情况下,每一次php请求,就会有1/100的概率发生回收,所以可能简单的理解为“每100次php请求就有一次回收发生”。这个概率是通过以下参数控制的
#概率是gc_probability/gc_divisor
session.gc_probability = 1
session.gc_divisor = 100
注意:如果你的session使用session.save_path中使用别的地方保存session,session回收机制有可能不会自动处理过期session文件。这时需要定时手动(或者crontab)的删除过期的session:cd /path/to/sessions; find -cmin +24 | xargs rm
3.5.1.5 特殊处理
Session会话一直有效,但session内容长时间未改动,则回收机制会删除session。可如下解决:
<?php
if(!isset($_SESSION['last_access'])||(time()-$_SESSION['last_access'])>60)
$_SESSION['last_access'] = time();
?>
代码会每隔60秒修改一次session。
总结:如果想修改session过期时间,修改变量gc_maxlifetime就可以了。php5的session采用被动的回收机制(garbage collection)。过期的session文件不会自己消失,而是通过触发“回收”来处理过期的session。
3.5.2 COOKIE
设置cookie生效时间两种方式:setcookie(‘user’,’admin’,time()+3600); session.cookie_lifetime.
3.6 文件操作
3.6.1 文件基本操作
目录函数
Is_dir()文件名存在并且为目录
getcwd()获取当前目录
3.6.2 文件下载
见api/2.6.1.php代码
3.6.3 文件上传
上传方式:
表单提交,模拟表单提交功能,jsclone()
Ajaxfileupload上传控件,参考代码:api/ajaxfileupload
3.7 Array操作
3.7.1 shift函数
l Array_shift()
语法 : mixed array_shift(array array);
说明 : 此函数移动数组array的第一个元素并将它传回,将数组array缩短一个元素,并且全部向下移动。
l Array_unshift()
语法 : int array_unshift(array array, mixed var, [...] );
说明 : 此函数增加元素到数组array的前面,此函数传回数组array中新的元素数目。
4 Plug-in
4.1 LDAP
ldap 目前只能在32位系统下运行
ldap redhat 64位报错修正:找到 AC_CFLAGS = -g -O2 改成 ... AC_CFLAGS = -g -O2 -fPIC
4.2 PHPExcel
5 Rewrite
如果 httpd.conf文件中<Directory "F:/www"> 地方改为AllowOverrideNone,则 .htaccess文件中下列值失效:
php_value upload_max_filesize"1024M"
php_value post_max_size "1024M"
和是否启动mod_rewrite模块无关
补充:
5、XML
6、smarty
7、PDO
8、js执行php文件
9、正则表达式函数
需要解决的问题:
1、自动加载魔术方法autoload(),需要使用某个具体类的时候加载该类
2、new self()创建所在类的一个实例
1. redis
2. 伪静态处理
3. cdn缓存
4. gd库实现图片缩放
5. Instagram 图片分享社区
6. Cdn 高速缓存技术
7. varnish根据cookie生成缓存 url地址加参数生成缓存