PHP中一般采用getallheaders来获取头部,但事实上,有些模式下是获取不到的(以前真没有注意过在fastcgi下这个函数不能用,当然我现在也没有测试。是老王说的)
他说:
在PHP里,想要得到所有的HTTP请求头,可以使用getallheaders方法,不过此方法并不是在任何环境下都存在,比如说,你使用fastcgi方式运行PHP的话,就没有这个方法,所以说我们还需要考虑别的方法,幸运的是$_SERVER里有我们想要的东西,它里面键名以HTTP_开头的就是HTTP请求头:
$headers = array();
foreach ($_SERVER as $key => $value) {
if ('HTTP_' == substr($key, 0, 5)) {
$headers[str_replace('_', '-', substr($key, 5))] = $value;
}
}
代码很简单,需要说明的是RFC里明确指出了信息头的名字是不区分大小写的。
不过并不是所有的HTTP请求头都是以HTTP_开头的的键的形式存在与$_SERVER里,比如说Authorization,Content-Length,Content-Type就不是这样,所以说为了取得所有的HTTP请求头,还需要加上下面这段代码:
if (isset($_SERVER['PHP_AUTH_DIGEST'])) {
$header['AUTHORIZATION'] = $_SERVER['PHP_AUTH_DIGEST']);
} elseif (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
$header['AUTHORIZATION'] = base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $_SERVER['PHP_AUTH_PW']));
}
if (isset($_SERVER['CONTENT_LENGTH'])) {
$header['CONTENT-LENGTH'] = $_SERVER['CONTENT_LENGTH'];
}
if (isset($_SERVER['CONTENT_TYPE'])) {
$header['CONTENT-TYPE'] = $_SERVER['CONTENT_TYPE'];
}
搞定!
网址为:http://hi.baidu.com/thinkinginlamp/blog/item/c0bff01f3beb66f2e1fe0b7e.html
原文来自:http://server.zdnet.com.cn/server/2008/0910/1117939.shtml
我也是在操作vmware server版的时候才找到的此文章,它给我带来了很多思路,比如把网卡改为其他型号的。原来这都是我没有想过的。
在现实情况中,许多商业程序只能分别在Windows或Linux下运行。那么,如何在同一台主机上运行Windows和Linux两种系统, 以支持尽可能多的应用软件,就成了一个重要的课题。VMware Server虚拟机模拟软件的出现为解决这一问题提供了不错的方法,它可以同时运行Linux和Windows等其它操作系统,且每个操作系统在各自独立 的窗口里运行。
不过,尽管可以在Windows主机下运行VMware Server,但不推荐这么做——Windows的蓝屏死机会让Windows主机和Linux虚拟机系统同时挂掉,所以我们选择在Linux下运行虚拟 软件。这种模拟能帮助Windows用户容易地过渡到Linux,它让用户在使用新的Linux应用程序时就像在使用熟悉的Windows应用一样,且用 户不需要关心它是运行在Linux下还是Windows下。
当前,VMware主要有三个版本:VMware Server、VMware Workstation和VMware ACE。VMware Server是免费的,它给Linux提供了多操作系统功能。VMware Workstation和VMware ACE为程序开发人员提供额外功能,例如给一台虚拟机分配多个CPU,给虚拟机设置安全策略。
主流x86多系统的选择
虽然在Linux下运行Windows或其它操作系统应用有几种方法,但我觉得VMware Server是最符合我的要求的。当然,所有的模拟软件都会降低性能,并且消耗更多的内存。所以,我的测试系统配备的是Athlon3500+的 CPU,1GB DDR2的内存——VMware在Duron 1800、512M DRAM和3GB的虚拟内存(交换文件)下也能运行得不错;但如果同样是Duron 1800的CPU,只配置1GB的虚拟内存(交换文件),运行起来就不太流畅了。另外,如果有硬件虚拟化支持(如Intel VT和AMD-V)就更好了,但对VMware Server来说这并不是必需的。
其他几种运行外部操作系统应用的方法及其特性与限制如下表所示:
Vmware的系统优化
在不同的Linux版本中安装VMware Server有细微的差别。注意,本文的重点不在于如何安装VMware Server软件,而是要告诉你如何优化系统,使VMware Server更有效地工作。
首先,我们从http://www.vmware.com/download/server/下载VMware Server(下载时需要提供注册号码),从http://ftp.cvut.cz/VMware/VMware-any-any- update105.tar.gz可以下载各种补丁,包含一些支持VMware Server的内核模块。注意,当运行VMware的配置脚本时,会提示你输入VMware设备的目录名称,把/var/lib/VMware /Virtual Machines改成/var/lib/Virtual_Machines。因为如果有空格,在用命令行应用程序访问时会有很多麻烦。另外,当在虚拟机配 置向导里提示输入虚拟机名称时,也不要带空格,如要用Windows_98代替Windows 98。
不论VMware虚拟机系统依赖什么配置,运行起来和在物理机器本地运行是一样的。比如,假设USB有问题,则在Windows控制面板里,找到系统、设备,就能看到跟物理机器安装时一样的错误图标。其它如音频、网络、视频以及各类驱动问题也是一样。
如果你以前安装过VMware Server(你可能只是升级下主机系统或者换个Linux版本),只要把.vmx和.vmdk文件放到相应的地方,如/var/lib/VMware /Virtual_Machines/,然后改变文件的所有者属性和访问权限。从VMware Server控制台选择VM菜单,安装VMware Tools,能提高速度和稳定性,也能让你访问VMware音频和视频驱动。
虚拟以太网卡的配置
我们可以通过虚拟以太网卡在虚拟机和主机之间传输文件,系统默认提供的网卡是AMD PCNet PCI网卡,传输速率大约是400Kbps,换成Pro1000的网卡,能提高到3Mbps。VMware Server的虚拟以太网卡在vmx配置文件里就是一行文本,跟实际网卡一样,它也需要驱动程序。如果驱动程序位于C盘下的好几级目录中(如下图),那你 应该创建一个快捷方式放在C盘根目录下,这样安装驱动时就不用找来找去了。
进入/var/lib/VMware/Virtual_Machine/Windows_98。用一个文本编辑工具打开.vmx文件,在 Ethernet那一节的第一行前插入:ethernet0.virtualDev = e1000。保存文件,退出。然后,启动虚拟机下的Windows系统,做如下操作:
1. 从开始菜单的设置-系统-设备下删除AMD网络适配器。
2. 重启虚拟机Windows系统。
3. 当提示你为一个PCI以太网卡安装驱动时,点取消。
4. 打开开始菜单-设置-系统-设备,找到那个有问题的网络设备。
5. 右键单击该网络设备,选择安装驱动。
6. 选择“从磁盘安装”。
7. 到你刚刚创建的快捷方式,选择.inf驱动安装文件,点击OK,就会看到一个列表。
8. 然后选择Intel Pro/1000 MT桌面连接,点OK。
9. 当提示你要Pro/1000安装包时,选择C盘的快捷方式。当提示需要Windows安装盘时,插入光盘。
10. 点击完成按钮。
11. 重启。
12. 改变网卡设置,选择开始菜单-设置-网络-Intel Pro/1000 MT 桌面连接-属性-高级-连接速度和双工,选择1000Mbps自动协商。
通过Samba在主机系统和虚拟机系统间共享文件
通过VMware Server安装虚拟机系统,最大的好处就是可以用传统的Windows应用程序和本地的Linux应用访问同一个文件。因此,在Linux主机系统和 Windows虚拟机系统之间共享文件是必需的。Samba是一组给Windows客户端提供文件和打印机共享服务的程序集合,可以让这些客户端象访问网 络磁盘一样访问Linux文件系统。下面我们给出出一些提示供参考。
首先,保证系统已经安装Samba。通常是默认安装的,但最好查一查。在下面的Samba配置文件中,“Username”指你的用户 名,Linux主机系统下的用户ID要和Windows虚拟机系统下的一致。这个文件定义了Linux和Windows共享的基本配置。更多的信息,可以 运行如下命令查看Samba的帮助文件:$ man Samba。或者到Samba的网站查看相关文档。
1)VMware Server的Samba配置
用root用户打开一个Linux文本编辑工具,把下面的内容保存为文件:/etc/Samba/smb.conf (;表示注释行)
[global]
;General server settings
netbios name = FC6
workgroup = workgroup
wins server = 169.0.0.1
server string = Samba Server
printcap name = /etc/printcap
cups options = raw
log file = /var/log/Samba/%m.log
max log size = 50
socket options = SO_KEEPALIVE TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=8192
; SO_SNDBUF=8192
dns proxy = no
guest ok = yes
guest account = username
security = user
encrypt passwords = yes
username map = /etc/Samba/smbusers
smb passwd file = /etc/Samba/smbpasswd
restrict anonymous = no
domain master = yes
preferred master = yes
max protocol = NT
acl compatibility = winnt
ldap ssl = No
server signing = Auto
[win]
path = /home/username/data/
writeable = yes
valid users = username
comment = home
admin users = username
browseable = yes
case sensitive = no
配置文件中的“path”指你需要共享的Linux目录,也就是你允许Linux和Windows都能访问的文件空间。在Windows虚拟机 系统下访问时,你可以选择“映射到网络驱动器”。这时,你就能看到你在Linux和Windows共享的内容了。刚安装的Windows系统访问 Linux主机系统时,可能会因为Windows安装了防火墙而弹出一个提示框,如下图:
如图所示(假设本地IP是196.x.x.x范围的),告诉你的防火墙允许NetBIOS访问那个IP:
2)有用的SAMBA提示
下面的提示可以帮助你更好的在Linux和Windows共享文件:
· 在物理主机上运行Windows系统时,不用修改已经共享的目录名称。只把那些非Windows系统不能访问的文件放在Windows驱动器下。
· 因为你不能在Linux系统下直接访问虚拟机系统下的文件,所以最好把数据文件保存在Linux空间下,然后通过Samba共享给Windows程序用。
· 在Windows桌面上的快捷方式点击右键,把驱动盘符C改为E,这样你就可以继续使用这些快捷方法
设置音频
VMware Server下的虚拟机系统能够处理多媒体内容,并通过声卡播放声音。如果你的主机系统和虚拟机系统都是64位的,可以到Vmware官方网站上下载驱动 (http://download3.vmware.com/software/wkst/vmaudio-5.10.0.350)。下载之后,复制到 Windows文件系统下,安装时跟安装其它音频驱动一样。其它情况需要这样做:
1. 打开控制面板-设置-系统-声音,安装Windows声音驱动。
2. 删除所有的音频驱动。
3. 安装驱动文件。
4. 重启,在驱动文件里找到系统提示要的.cat文件(或其它配置文件),点击OK。
5. 播放一个声音文件。
6. 把KDE的声音管理设置改为“自动检测”,然后告诉它空闲2秒钟后释放资源。
USB设备配置
通过VMware Server下的Windows应用可以直接访问打印机、扫描仪或者其它USB设备。如在VMware Server控制台的菜单查找打印机:VM >Removable Devices >USB Controller >printer(如下图)。
那么,如何在VMware里使用USB打印机呢?其步骤如下:
1. 打开VMware Server。
2. 点击Windows标签。
3. 点击添加设备。
4. 添加USB控制器。
5. 启动Windows。
6. 打开VM工具栏,VM >Removable Devices >USB Devices >[你的打印机名]。
7. Windows会提示找到新设备,要求你选择一款打印机或者从磁盘安装驱动。插入你的打印机驱动光盘。
8. 点击OK,能看到一个安装成功的提示窗口。
9. 打开开始菜单-设置-打印机,就能看到你的打印机了。
10. 右键打印机图标,选择属性。
11. 点击“打印测试页”,看看打印机是否打印出来。
同样,安装扫描仪和其它USB设备也可参考上述步骤。值得一提的是,VMware虚拟USB适配器可以同时使用两个USB设备。安装第二个USB设备时,只要按照上面的步骤到VMware工具栏那一步就可以了。
另外,一个USB设备可以被Linux主机系统使用,也可以被Windows虚拟机系统使用,你必须确定是哪个系统在使用它。选择菜单VM >Removable Devices >printer在虚拟机Windows系统下禁用打印机,这样主机的Linux系统才能使用它。然后重新插拔一下打印机的USB线。打开打印机管 理器,先停用、再启用一下打印机。
在主机系统和虚拟机系统之间切换USB打印机,你需要在VMware Server上关闭USB设备,甚至通过重新插拔一下来重启设备,然后打开Linux开始菜单-控制中心,点击外设-打印机,选择相应的打印机菜单,点击 下拉菜单的重启项,重启CUPS Linux打印系统。
优化VMware Server虚拟机系统的小提示
下面是我常用到的小提示:
· 磁盘速度:大多数版本都有调整硬盘速率的选项,借此你可以让硬盘访问速度加倍。
· 把虚拟硬盘文件(即VMware虚拟机系统的“硬盘”)分割成多个2GB的文件,我发现这样能显著提高访问速率。
· 一些优化Windows系统的小技巧在虚拟机下也可以用,当然最好安装防火墙和反病毒软件。
· 如果映射驱动器上的某个程序运行慢或者有问题,可以在Windows虚拟机系统下重新安装试试。我就重新安装过Eudora、MS Office、CorelDRAW和Paint Shop Pro。如果你本地安装的Windows系统在C:Program Files下有程序,也安装到虚拟机的虚拟硬盘上去,不要留在映射驱动器E:(也就是/home/username/win)上。
最后,值得一提的是,分割虚拟硬盘文件不仅有利于提高访问速率也有利于备份。通过以下命令可以分割虚拟硬盘文件:# VMware-vdiskmanager -r sourceDisk.vmdk -t 3 destinationDisk.vmdk。完成之后,要修改一下访问权限:
chown username:username *.vm*
chmod 777 *
打开原来的.vmx文件,保证里面的硬盘项是指向分割后的文件里的第一个。VMware相关的文件列在/etc/VMware/locations这个文本文件里。
在Linux主机系统之上通过VMware Server运行Windows虚拟机系统,让用户可以同时使用两个系统。也就是,既可以享受Linux的稳定性和健壮性,又能享受Windows程序的 易用性和通用性。也为现代计算机系统的后续扩展提供了空间。随着Linux程序变得一样易用而功能强大,普通用户也能比较容易的使用Linux程序。