一台服务器流量比较大,因为程序的需要,session的过期时间设置为3小时,导致/tmp下堆积了近20万的session文件,进而导致内核占用的cpu急剧上升。
因为session的读写涉及到大量小文件的随机读写,并且是集中在一个目录下,iowait也急剧升高。
第一步,考虑将session放入内存中
最简单的办法莫过于将/tmp挂载为 tmpfs文件系统,也就是内存中。
第二步,将session存储到不通的目录中
php本身支持session的多级散列,在php.ini中,将
;session.save_path = /tmp
修改为
session.save_path = "2;/tmp/session"
将session存储到 /tmp/session这个文件夹中,并且是用2级散列。
保存退出,等第三步结束后重启php。
第三步,创建session存储文件夹
php并不会自动去创建这些文件夹,不过在源文件中提供了一些创建文件夹的脚本。
脚本:
for acm in $I;
do
for x in $I;
do
mkdir -p /tmp/session/$acm/$x;
done;
done
chown -R nobody:nobody /tmp/session
chmod -R 1777 /tmp/session
因为/tmp是用的内存,服务器重启后,里面的所有文件都会丢失,所以,需要把上面的脚本加入到 /etc/rc.local中,并且要放在启动php之前。
第四步,session的回收
session在经过session.gc_maxlifetime后会过期,但并不会马上被删除,时间长了以后会造成/tmp空间占用很大。具体的删除算法懒得去研究。
下面这个命令可以删除过期的session,这里定义的过期时间是3小时:
可以将其加入cron中,10分钟执行一次。
1、为什么PHP的echo多行批量输出为空白?
答:
echo <<<hdv
内容1;
内容2;
hdv;
//hdv必须顶格,并且且后面似乎也不能有任何字符包括空格输出;
2、在使用session_start()函数时,为什么PHP输出空白?
答:必须设置D:\usr\local\php目录下的PHP.INI文件里面的session.save_path
存储路径,并且该路径必须为实际存在的路径,否则输出为空白,也就是没有任何输出。
还需要注意:
有些USR目录的快捷方式到PHP.INI的文件,可能不是指向D:\usr\local\php,而是指向%SystemRoot%\php.ini目录的,所以在使用自带PHP.INI快捷方式编辑PHP.INI文件的时候,要注意实际的编辑对象。
3、为什么我升级PHP后,原来的程序出现满屏的 Notice: Undefined variable?
答:这是警告的意思,由于变量未定义引起的,打开php.ini,找到最下面的error_reporting,修改为error_reporting = E_ALL & ~E_NOTICE
对于Parse error错误error_reporting(0)无法关闭。
如果你想关闭任何错误提示,请打开php.ini,找到display_errors,设置为display_errors = Off.以后任何错误都不会提示。
4、经验:PHP函数传递数组,要求参数必须是数组形式,不能为常量或者非数组变量。
5、如何更好的分析URL以及引用或提取URL路径问题?
答:
echo "<pre>;";
print_r($_SERVER);
所有服务器方法都会显示出来。
6、为什么使用COOKIE传递变量会失败?
答:
请先检查COOKIE中的服务器端作用域设置情况,有可能因为作用域问题总是传递不过去变量;
7、为什么有时候采用非IE默认编码字符的网页有时候可以正常显示有时候不可以正常显示,甚至什么都不显示(显示空白)?
答:
请注意,把字符默认编码设置放到TITLE之前,先后次序如下(事例):
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>登录管理系统-管理员控制面板</title>
请不要把<title></title>设置在meta之前,否则可能无法正常显示IE6下测试如此;
8、为什么SESSION变量值与随机值总是不同?
这个是笔者遇到奇怪的问题,例子如下:(写入SESSION变量值与随机值总是不同)
$cbcc=rand(1,1000);
//if(!isset()($_SESSION['cbconfirmcode']))
//{
// unset($_SESSION['cbconfirmcode']);//comfirm buy rand code,确认购买随机码
//}
$_SESSION['cbconfirmcode']=$cbcc;
echo $_SESSION['cbconfirmcode'].'*****';
<input type="hidden" value="<?php echo $cbcc;?>" name="cbconfirmcode"/>
...
<img title="" height="2" alt=" " src="#" width="1" />
...
最后查出是因为插入的图象SRC地址用#造成的,我也不知道为什么。去掉插入的图象就可以了,加上就不对,未做深入研究;
9、经验:当使用UPDATE 查询,MySQL 不会将原值和新值一样的列更新。这样使得 mysql_affected_rows() 函数返回值不一定就是查询条件所符合的记录数,只有真正被修改的记录数才会被返回。MYSQL UPDATE语句执行时候,如果要更新的记录与原来的记录相同,则使用mysql_affect_rows()时,MYSQL会返回0值!所以在使用mysql_affected_rows检测更新行数时候要特别小心。
无论是发送哪种HEADER消息,都必须保证在发送HEADER之前没有输出任何信息到终端浏览器。
一、使用HEADER发送文本类型头信息
例1:
header("Content-Type: text/html; charset=UTF-8");//告知各位观众下面将要输出的文本类型
?>
例1输出HEADER告诉浏览器将要输出的文本编码格式为UTF-8。这在全页面PHP处理上是必须的,否则可能会引起终端浏览器显示乱码或空白页显示现象。由于PHP指定在HEADER输出前不能有任何输出信息,包括空格,所以当页面运行出现HEADER信息已经发送的提示时候,需要首先检查在HEADER之前是否输出了某些信息,包括本PHP页面的包含头文件是否输出信息。
如果需要输出文件提示下载可使用如下方法:
header("Content-type: application/octet-stream");//FILE流
header("Accept-Ranges: bytes");
header("Accept-Length: $filesize");//提示将要接收的文件大小
header("Content-Disposition: attachment; filename=".$fname); //提示终端浏览器下载操作
?>
如果是PDF格式也可用header("Content-type: application/pdf");其它格式类似处理,不过上面的例子是个下载文件流通例,但是指定详细的文本格式似乎对浏览器的默认处理似乎更好,比如让播放器自动播放下载音乐、或PDF编辑器自动打开远程PDF文档等。
附Content-type的MIME类型说明:
$mimetypes = array(
'ez' => 'application/andrew-inset',
'hqx' => 'application/mac-binhex40',
'cpt' => 'application/mac-compactpro',
'doc' => 'application/msword',
'bin' => 'application/octet-stream',
'dms' => 'application/octet-stream',
'lha' => 'application/octet-stream',
'lzh' => 'application/octet-stream',
'exe' => 'application/octet-stream',
'class' => 'application/octet-stream',
'so' => 'application/octet-stream',
'dll' => 'application/octet-stream',
'oda' => 'application/oda',
'pdf' => 'application/pdf',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
'smi' => 'application/smil',
'smil' => 'application/smil',
'mif' => 'application/vnd.mif',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'wbxml' => 'application/vnd.wap.wbxml',
'wmlc' => 'application/vnd.wap.wmlc',
'wmlsc' => 'application/vnd.wap.wmlscriptc',
'bcpio' => 'application/x-bcpio',
'vcd' => 'application/x-cdlink',
'pgn' => 'application/x-chess-pgn',
'cpio' => 'application/x-cpio',
'csh' => 'application/x-csh',
'dcr' => 'application/x-director',
'dir' => 'application/x-director',
'dxr' => 'application/x-director',
'dvi' => 'application/x-dvi',
'spl' => 'application/x-futuresplash',
'gtar' => 'application/x-gtar',
'hdf' => 'application/x-hdf',
'js' => 'application/x-javascript',
'skp' => 'application/x-koan',
'skd' => 'application/x-koan',
'skt' => 'application/x-koan',
'skm' => 'application/x-koan',
'latex' => 'application/x-latex',
'nc' => 'application/x-netcdf',
'cdf' => 'application/x-netcdf',
'sh' => 'application/x-sh',
'shar' => 'application/x-shar',
'swf' => 'application/x-shockwave-flash',
'sit' => 'application/x-stuffit',
'sv4cpio' => 'application/x-sv4cpio',
'sv4crc' => 'application/x-sv4crc',
'tar' => 'application/x-tar',
'tcl' => 'application/x-tcl',
'tex' => 'application/x-tex',
'texinfo' => 'application/x-texinfo',
'texi' => 'application/x-texinfo',
't' => 'application/x-troff',
'tr' => 'application/x-troff',
'roff' => 'application/x-troff',
'man' => 'application/x-troff-man',
'me' => 'application/x-troff-me',
'ms' => 'application/x-troff-ms',
'ustar' => 'application/x-ustar',
'src' => 'application/x-wais-source',
'xhtml' => 'application/xhtml+xml',
'xht' => 'application/xhtml+xml',
'zip' => 'application/zip',
'au' => 'audio/basic',
'snd' => 'audio/basic',
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'kar' => 'audio/midi',
'mpga' => 'audio/mpeg',
'mp2′ => 'audio/mpeg',
'mp3′ => 'audio/mpeg',
'aif' => 'audio/x-aiff',
'aiff' => 'audio/x-aiff',
'aifc' => 'audio/x-aiff',
'm3u' => 'audio/x-mpegurl',
'ram' => 'audio/x-pn-realaudio',
'rm' => 'audio/x-pn-realaudio',
'rpm' => 'audio/x-pn-realaudio-plugin',
'ra' => 'audio/x-realaudio',
'wav' => 'audio/x-wav',
'pdb' => 'chemical/x-pdb',
'xyz' => 'chemical/x-xyz',
'bmp' => 'image/bmp',
'gif' => 'image/gif',
'ief' => 'image/ief',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'jpe' => 'image/jpeg',
'png' => 'image/png',
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'djvu' => 'image/vnd.djvu',
'djv' => 'image/vnd.djvu',
'wbmp' => 'image/vnd.wap.wbmp',
'ras' => 'image/x-cmu-raster',
'pnm' => 'image/x-portable-anymap',
'pbm' => 'image/x-portable-bitmap',
'pgm' => 'image/x-portable-graymap',
'ppm' => 'image/x-portable-pixmap',
'rgb' => 'image/x-rgb',
'xbm' => 'image/x-xbitmap',
'xpm' => 'image/x-xpixmap',
'xwd' => 'image/x-xwindowdump',
'igs' => 'model/iges',
'iges' => 'model/iges',
'msh' => 'model/mesh',
'mesh' => 'model/mesh',
'silo' => 'model/mesh',
'wrl' => 'model/vrml',
'vrml' => 'model/vrml',
'css' => 'text/css',
'html' => 'text/html',
'htm' => 'text/html',
'asc' => 'text/plain',
'txt' => 'text/plain',
'rtx' => 'text/richtext',
'rtf' => 'text/rtf',
'sgml' => 'text/sgml',
'sgm' => 'text/sgml',
'tsv' => 'text/tab-separated-values',
'wml' => 'text/vnd.wap.wml',
'wmls' => 'text/vnd.wap.wmlscript',
'etx' => 'text/x-setext',
'xsl' => 'text/xml',
'xml' => 'text/xml',
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'mpe' => 'video/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'mxu' => 'video/vnd.mpegurl',
'avi' => 'video/x-msvideo',
'movie' => 'video/x-sgi-movie',
'ice' => 'x-conference/x-cooltalk',
);
?>
二、使用HEADER发送状态(Status)信息
当我们在响应浏览器操作时候,可能需要输出一些提示状态信息,比如访问的文件不存(404状态)在或者文件被转移(301状态)等,告诉用户(包括搜索引擎)所访问页面的当前状态,这在实际使用中对站长非常重要,因为这直接影响到搜索引擎对当前页面的判定。当前对于301固定转移(HTTP/1.1 301 Moved Permanently)我们也可以采用其它方式(.htaccess或IIS重定向),但是了解PHP自编程解决这些页面状态提示会加深自己对浏览器状态的认知。
HEADER状态消息头格式如下:
header("第一部分 第二部分 第三部分");
其中第一部分为HTTP协议的版本号(HTTP-Version),第二部分为将要发送的状态代码(Status),第三部分为状态原因(Reason-Phrase) ,三部分中间用一个空格分割,第一部分和第二部分都是必需,第三部分的状态原因为可选项,一般推荐按照标准写出(参下文)。
例2:
header("HTTP/1.1 404 Not Found");
?>
例2实际在使用中很少用到的,感觉有点忽悠终端浏览者的意思。
最经常遇到是下面的例3:
header("HTTP/1.1 301 Moved Permanently");//301永久迁移
header("Location: http://www.");//跳转新URL地址,默认Location可能会发送302头,笔者暂不确定。
?>
此语句告诉搜索引擎或浏览者,本页面已经被“蚂蚁搬家”了,走,我带你看看新家去(新网页)。
下面专门把W3上Header状态代码(Status)罗列一下供各位使用参考:
1、状态码类(Status)定义
1xx类:Informational - Request received, continuing process(信息状态码类:请求已收到,继续处理)
2xx类:Success - The action was successfully received, understood,and accepted(成功状态码类:本次操作已收到并处理OK)
3xx类:Redirection - Further action must be taken in order to complete the request (重定向状态码类:完成请求前必须进一步执行操作)
4xx类:Client Error - The request contains bad syntax or cannot be fulfilled(发往客户端的错误状态码类:请求包含语法错误或请求不能完成)
5xx类:Server Error - The server failed to fulfill an apparently valid request (服务器端的错误状态码类:服务器执行合法请求失败)
2、常用状态码(Status)列表(部分):
| "100" ; Continue
| "101" ; Switching Protocols
| "200" ; OK
| "201" ; Created
| "202" ; Accepted
| "203" ; Non-Authoritative Information
| "204" ; No Content
| "205" ; Reset Content
| "206" ; Partial Content
| "300" ; Multiple Choices
| "301" ; Moved Permanently
| "302" ; Moved Temporarily
| "303" ; See Other
| "304" ; Not Modified
| "305" ; Use Proxy
| "400" ; Bad Request
| "401" ; Unauthorized
| "402" ; Payment Required
| "403" ; Forbidden
| "404" ; Not Found
| "405" ; Method Not Allowed
| "406" ; Not Acceptable
| "407" ; Proxy Authentication Required
| "408" ; Request Time-out
| "409" ; Conflict
| "410" ; Gone
| "411" ; Length Required
| "412" ; Precondition Failed
| "413" ; Request Entity Too Large
| "414" ; Request-URI Too Large
| "415" ; Unsupported Media Type
| "500" ; Internal Server Error
| "501" ; Not Implemented
| "502" ; Bad Gateway
| "503" ; Service Unavailable
| "504" ; Gateway Time-out
| "505" ; HTTP Version not supported
另外我们还可以使用PHP 的HEADER发送一些缓存参数命令、超期命令等,例如:
header("Cache-Control: no-cache, must-revalidate"); //不要缓存
header("Expires: Fri, 1 Dec 2099 08:00:00 GMT"); // 页面过期时间
?>
您可能感兴趣的文章:
php header()函数的简单例子
php header函数实现文件下载的实例代码
php中header函数的用法举例详解
php header 使用详解
php header函数 文件下载时直接提示保存的代码
php header头信息应用举例
php 文件头部(header)信息详解
PHP header()函数使用详解
php header函数使用要点