浏览模式: 标准 | 列表 全部文章

PHP快速判断客户端浏览器是否IE核心

代码如下:

<?php

if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE"))

echo "IE";

else

echo "not IE";

?>

简单测试如下:

IE:微软IE浏览器、360安全浏览器、搜狗高速浏览器

not IE:chrome、firefox、opera

结论:判断快速准确,判断结果以IE核心为准

解决IE浏览器跨域名iframe嵌套网页获取cookies

问题产生的前因:A网站采用iframe框架形式嵌套了B网站的一个页面C,直接打开页面C会在本地保留一个cookie文件,而当采用A网站iframe框架形式嵌套后就无法成功生成cookie文件,该问题仅在IE浏览器环境下出现,firefox、chrome、Safari浏览器下没有问题。

造成该问题的原因:一个所谓的隐私首选项(简称为P3P)的W3C标准。只有在每一页上设置一个cookie发送头,才能允许Internet Explorer接受第三方Cookie。

换言之,只有在页面C上设置一个cookie发送头,那么A网站iframe框架形式嵌套后就可以在IE下成功获得页面C的cookie。

  • PHP:header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
  • ASP.NET:HttpContext.Current.Response.AddHeader("p3p","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
  • Django:response = render_to_response('mytemplate.html')
    response["P3P"] = 'CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'
  • JSP:response.addHeader("P3P","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"")

本文解决方案参考了http://adamyoung.net/IE-Blocking-iFrame-cookies

Tags: cookies

解决Warning: Cannot modify header informat...

近几天正冰在测试有关跨域名cookies存储问题,在某个php测试页面里的header函数一直遭遇:Warning: Cannot modify header information - headers already sent by错误提示。为了解决该问题,翻山越岭地用google查询了相关资料,造成该问题的原因是:函数 header(),setcookie() 和 session 函数需要在输出流中增加头信息。但是头信息只能在其它任何输出内容之前发送。在使用这些函数前不能有任何(如 HTML)的输出。函数 headers_sent() 能够检查您的脚本是否已经发送了头信息。

来继续了解下原理:PHP脚本开始执行时,它可以同时发送header(标题)信息和主体信息。 Header信息(来自 header() 或 SetCookie() 函数)并不会立即发送,相反,它被保存到一个列表中。 这样就可以允许你修改标题信息,包括缺省的标题(例如 Content-Type 标题)。但是,一旦脚本发送了任何非标题的输出(例如,使用 HTML 或 print() 调用),那么PHP就必须先发送完所有的Header,然后终止 HTTP header。而后继续发送主体数据。从这时开始,任何添加或修改Header信息的试图都是不允许的,并会发送上述的错误消息之一。

解决方案如下(须保证出错函数之前没有任何输出):

1、如果说这条仅仅只是错误提示,并不影响你程序正常运作,那么只需要“屏蔽”它即可。在页面顶部的php标签中加入ob_start();,在返回的信息下面加入ob_end_flush();,这样就可以屏蔽错误信息。

<?php ob_start(); ?>

... HTML codes ...

<?php

... PHP codes ...

header ("Location: ....");

ob_end_flush();

?>

2、反之要彻底解决,正冰是通过Notepad++先建立一个空白页面,然后将编码设置为Encode in UTF-8 without BOM,然后将出问题页面代码复制进去保存为一个新页面即可。

notepad++.jpg

大小: 21.26 K
尺寸: 300 x 196
浏览: 135 次
点击打开新窗口浏览全图


因为正冰所测试的页面还有一个setcookie函数,这个也会导致这样的问题出现,简单摘录如下:cookie本身在使用上有一些限制,例如:

  1. 呼叫setcookie的叙述必须放在<html>标签之前
  2. 呼叫setcookie之前,不可使用echo
  3. 直到网页被重新载入后,cookie才会在程式中出现
  4. setcookie函数必须在任何资料输出至浏览器前,就先送出

解决方法就是在程序开始用ob_start();这个函数。

wordpress管理员密码忘记了用phpmyadmin找回来

手头管理着多个wordpress搭建的网站,因为经常忘记密码而头疼不已。这不又忘了密码,还好有phpmyadmin,一条SQL语句马上改回来了。

进入phpmyadmin,选择数据库,然后修改wp_users表中对应的管理员的user_pass字段为5d41402abc4b2a76b9719d911017c592,就可以以hello作为密码登录了。

嫌麻烦的同学可以直接执行以下SQL语句,wp为数据库名,ID为第一个用户(即默认管理员)

UPDATE  `wp`.`wp_users` SET  `user_pass` =  '5d41402abc4b2a76b9719d911017c592' WHERE  `wp_users`.`ID` =1;

另外,phpmyadmin最新下载地址:http://www.phpmyadmin.net/home_page/downloads.php,选择合适版本下载上传到空间上,用管理面板解压缩,然后就可以用了。

Tags: wordpress, 管理员密码, phpmyadmin

忘记了windows系统登录密码?用ERD Commander 2005改

ERD Commander是一个程序组,它是该迷你版Windows XP上的主要应用程序(因此该光盘又叫做ERD Commander Boot CD),它提供的三类工具可以修复与挽救硬盘上已损坏的Windows系统(支持Windows 2000/XP/2003),无需重新安装,因此,该光盘也是一个系统维护盘,可以直接访问硬盘上的所有文件,还可以修改Windows的管理员密码。

正冰本次推荐的ERD commander 2005是易通汉化加强版,该版本登陆密码是Yitong ,首字母大写。另外有一款据说是汉化精简版的登陆密码是yitong2005。

软件使用比较简单,直接下载刻盘,然后从光盘启动。利用ERD Commander,无需原来的密码就可以轻松地修改包括管理员帐户在内的任何Windows帐户的密码。系统进入后点击“开始”菜单,选择“系统工具→Locksmith”,在弹出的向导对话框上选择需要修改密码的系统账号,然后输入两次新密码就可修改原来的密码,重启电脑以新密码登录即可。

迅雷下载:ERD commander 2005 易通汉化加强版

845主板支持最大2G內存,安裝3根512M的,只识别1G?

前因:虽然目前工作电脑Windows XP使用1G内存绰绰有余,但是安装了vmware workstation之后就不是那么回事的。用CPU-Z看了下硬件:Intel(R) Pentium(R) 4 CPU 2.80GHz,Intel i845PE芯片,技嘉GA-8PE667主板,有3根内存插槽,已使用2根。查询资料了解到该主板支持最大2G内存。拆开电脑,再添一根512M内存,但是不管怎么换着插,都只能识别1G,在确认内存和插槽都是好的并且再次开机使用CPU-Z检查能够正常看到3根内存插槽都有内存。

现象:任意插两根内存均能识别,插上第三根,只能识别靠近CPU那两根的容量。

结论:845的主板最多支持2根内存,单条1G的两根就支持!主板最多支持两根,预留一根!

Tags: 內存

解决nginx502错误经验小结

好久木有码字了,都有点生疏了。之前有写过一篇文章《解决nginx中FastCGI的502 Bad Gateway错误》,本篇《解决nginx502错误经验小结》就当是正冰对上一篇文章的补充与完善。

首先先讲理论,理论就跟说明书一样,理解明白了下次遇到问题可以快速判断,举一反三:

LNMP架构中PHP是运行在FastCGI模式下,随着系统的运行,php-cgi进程所占用的内存越来越多,并且似乎只增不减。有一段时间当我所管理的VPS经常遇到nginx 502错误时候,我以为这是网站访问量过高或者是系统中有软件配置不当出现问题。但是多番数据比较发现网站访问量并不高,配置也并未做修改。内存占用越大,不得不考虑是不是内存泄漏(这个是linux系统比较特有的),而来自PHP官方的解释却说php-cgi进程并没有内存泄漏,php-cgi会在每个请求结束的时候会回收脚本使用的全部内存,但是并不会释放给操作系统,而是继续持有以应对下一次PHP请求。这样做大概是为了减少内存碎片化或者解决从系统申请内存之后又释放回操作系统所需要的时间不可控问题。可是如果偶然一次PHP请求使用了诸如ftp或者zlib这样的大内存操作,那么将导致一大块系统内存被php-cgi持续占有,不能被利用。 

下面先来说一下php-cgi配置文件php-fpm.conf中较为有用的2个参数方便下面解决方案的说明:max_children与max_requests。max_children参数表示php将开启多少个php-cgi的子进程来应对用户的请求,而max_requests参数表示每个children最多处理多少个请求后便会被管理进程关闭“释放”内存后启动应对下一次PHP请求。php把请求轮询给每个children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就使得所有的php-cgi子进程基本上在相近时间被关闭并重启。在这期间,nginx无法将php文件转交给php-fpm处理,所以cpu会降低(不用处理php,更不用执行sql),而负载会升高(关闭和开启children、nginx等待php-fpm),网卡流量也降低(nginx无法生成数据传输给客户端)。

讲完理论继续讲实践,实践检验真理:

我用一条语句来说明php-cgi的内存占用情况以及进程启动时间

ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'|grep www|sort -nrk5

图中显示的就是10个php-cgi进程,每个进程目前内存占用在10-16M左右(随着时间推移会越来越大直至进程重启内存回收),进程的上一次启动时间在12点52分到12点59分间。

php-cgi内存占用大.jpg

大小: 43.06 K
尺寸: 300 x 76
浏览: 351 次
点击打开新窗口浏览全图

最后,给出本篇小结:

解决方法:适当提高children的数值,降低max_requests的数值。建议一般VPS的children在5-10,max_requests在1000-2000,具体自行调整。 对了,降低max_requests的数值可使php-cgi重启的周期缩短,偶然的高内存操作造成的问题影响时间也会缩短。

还有另外一个解决方法:写一个crontab脚本,定时发现高内存占用的php-cgi进程并向它传送kill指令。 正冰只写出来提供思路,不推荐大家采用,因为当你在kill某个高内存占用的进程时,也就同时kill了该进程当前在处理的用户请求。根据正冰测试跟踪nginx的web日志发现当kill进程产生会出现502错误,因为该请求并未由php-cgi完成。所以,慎用该方法。

造成nginx产生502错误的原因较多,但是无非也就这么几方面:php-cgi进程数不够用、php执行时间长、php-cgi进程死掉等等。

遇到问题多查一下日志信息,相信寻因解决问题会很容易。Good Luck!

Tags: nginx, fastcgi, 502

CentOS Linux下安装VNC

最近买了Burst.net美国佛罗里达迈阿密机房的2台VPS做测试(首月免费),一台windows 2003,一台无桌面环境的纯净centos Linux 6.0 64bit,为了测试,在CentOS系统上安装了vnc服务。以下为安装全过程(适用于256M以上VPS):

1、安装桌面环境KDE与gnome 

yum install kdepim

yum groupinstall gnome-desktop

yum install gnome-session 

2、安装VNC、firefox浏览器以及Xorg(Xorg 是由 X.Org 基金会发行的开放源代码 X Window 系统实现中的 X 服务)

yum -y install vnc vnc-server firefox x11-xorg

yum groupinstall "X Window System" "GNOME Desktop Environment" "KDE (K Desktop Environment)"

3、配置VNC

vncserver

首次运行会要求你设定好VNC连接密码,程序会建立一个.vnc的目录,默认情况是/root/.vnc

4、杀掉所有VNC的进程、删除临时sockets、重新启动VNC服务

pkill -9 vnc

rm -rf /tmp/.X1*

然后编辑/root/.vnc/xstartup,将最后一行twm替换为gnome-session或者startkde

懒人可以直接用以下语句直接替换(执行任意一条即可,建议选择第一条稳定,但是占用内存较多,首次连接占用681M,同条件第二条占用343M) 

sed -i 's/twm/gnome-session/g' /root/.vnc/xstartup

sed -i 's/twm/startkde/g' /root/.vnc/xstartup

替换完成后重启vncserver

vncserver

5、在windows或者linux桌面环境下使用VNC客户端去连接模板主机,默认情况下连接地址是:

xxx.xxx.xxx.xxx:1

可能遇到的问题:

1、连接上去后发现只显示桌面,木有任务栏,木有桌面图标

解决方法:到/root/.vnc/目录下找到log日志文件,打开查看以后会发现提示你如下错误信息 

gnome-session[****]: WARNING: Unable to find provider 'gnome-panel' of required component 'panel'

gnome-session[****]: WARNING: Unable to find provider 'nautilus' of required component 'filemanager'

第一条是任务栏木有的错误,第二条是图标木有的错误,执行如下命令后再次连接即可 

yum -y install gnome-panel

yum -y install nautilus

pkill -9 vnc

rm -rf /tmp/.X1*

rm -rf /root/.vnc/*.log && rm -rf /root/.vnc/*.pid

vncserver


另外,针对128M这样小内存的Linux VPS,采用《http://icodex.org/2010/03/centos最小化安装gnome和vnc/》的方法,简单摘录如下: 

1.安装x-window桌面和Gnome环境先.

yum groupinstall "X Window System" "GNOME Desktop Environment"

2.添加中文支持和浏览器

yum -y install fonts-chinese firefox

3.安装tightvnc.

(CentOS 5 64Bit)

wget http://packages.sw.be/tightvnc/tightvnc-server-1.3.9-3.el5.rf.x86_64.rpm

rpm -ivh tightvnc-server-1.3.9-3.el5.rf.x86_64.rpm --force --nodeps

(CentOS 5 32Bit)

wget http://packages.sw.be/tightvnc/tightvnc-server-1.3.9-3.el5.rf.i386.rpm

rpm -ivh tightvnc-server-1.3.9-3.el5.rf.i386.rpm --force --nodeps

其他版本到http://packages.sw.be/tightvnc找对应的rpm包。

补充:必须做以下操作,否则会因找不到字体路径而无法启动!

mkdir -p /usr/X11R6/lib/X11

ln -s /usr/share/X11/fonts /usr/X11R6/lib/X11/fonts 

使用方法(以会话ID:1为例)

启动vnc.执行命令:

vncserver :1 -httpport 9001 -name icodex_desktop -depth 24 -geometry 1024x768

关闭vnc,执行命令:

vncserver -kill :1

参数说明:

usage: vncserver [:<number>] [-nohttpd] [-name <desktop-name>] [-depth <depth>]

[-geometry <width>x<height>]

[-pixelformat rgbNNN|bgrNNN]

<Xvnc-options>...

vncserver -kill <X-display>

:1 > 会话ID.你可以建立多几个会话ID

-httpport|-nohttpd > 打开的TCP访问端口或者关闭TCP访问

-name > 命名.这个随意了...

-depth > 色彩深度 设置16位或24位,32位是不启动的.

-geometry > 屏幕纵横比

-pixelformat > 像素格式,默认即可

vncserver -kill <X-display> 杀死会话ID.<X-display>为会话ID.如:vncserver -kill :1

经过实际测试安装,用vnc client连接后仅占用104M内存。

Tags: centos, vnc