Archive for 10月, 2008

从dir() has been disabled for security reasons看PHP的安全模式

当safe_mode设置为on,PHP将检查当前脚本的拥有者是否和将被文件函数操作的文件的拥有者相匹配
如果安全模式被激活,则将会导致以下错误:

Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
allowed to access /etc/passwd owned by uid 0 in /docroot/x.php on line 2

除了safe_mode以外,如果您设置了open_basedir选项,则所有的文件操作将被限制在您指定的目录下。例如:

<Directory /docroot>
php_admin_value open_basedir /docroot
</Directory>

如果您在设置了open_basedir选项后运行同样的script.php,则其结果会是:

Warning: open_basedir restriction in effect. File is in wrong directory in
/docroot/x.php on line 2

单独地屏蔽某些函数。请注意disable_functions选项不能在php.ini文件外部使用,也就是说您无法在httpd.conf文件的按不同虚拟主机或不同目录的方式来屏蔽函数。 如果我们将如下内容加入到php.ini文件:

disable_functions readfile,system

则我们会得到如下的输出:

Warning: readfile() has been disabled for security reasons in
/docroot/script.php on [...]


10个你想不到的网站

1、Google推出的3维聊天空间,可以设计自己的形象和房间
http://www.lively.com/
2、可以在线听和免费下载最新《读者》《科幻世界》等著名杂志有声版,不用再买杂志
http://www.ilisten.cn/ZZ
3、可以一键免费把自己博客印成书的网站
http://blog.mrprint.cn
4、可以修改每一本书内容的在线图书馆
http://www.bookgg.com/library.asp
5、一个比Google还强,每天看别人在搜索什么东西的搜索引擎
http://www.bearsou.com
6、每天可以免费买彩票,每天百万现金奖的精彩网站
http://www.lotcome.com
7、可以访问任何网页的Google隐藏入口
http://www.google.com/gwt/n
8、可以把你的网址缩短的网站
http://tinyurl.com/
9、爱因斯坦写汉字 
http://www.sbfun.org/einstein/index.php?
10、你可以在线做个以自己照片做硬币人物的硬币图片,好酷哦!!
http://onlinewahn.de/generator/m-maker.htm


简析PHPCMS的模板解析工作流

现在很多PHP系统都有自己模板系统,PHPCMS和DISCUZ都是用的自己模板库,他们都称得上超级高效。
PHPCMS的模板解析函数库位于PHPCMS根目录的INCLUDE中,这个从3.0到现在的2008一直都没有变过。它的名字叫template.func.php,从文件名就可以知道,它是一个模板方面的函数库文件。
它的工作流程是这样的,先由执行程序调用根目录下INCLUDE中主函数库global.func.php中的template函数,并有它指定调用模板的位置和模板名称,同步调用template.func.php下的template_compile函数对模板规则进行处理,而其中模板的编译解释就由template_parse的正则函数来搞定了。
我们找到template_parse命令可以看到,我们模板中常用的{if}{loop}{tag}标签,这里都用提及。2008版中最为红火的{get}万能标签的出处也不外乎
$str = preg_replace(”/\{get\s+([^}]+)\}/e”, “get_parse(’\\1′)”, $str);
$str = preg_replace(”/\{\/get\}/”,”<?php } unset(\$DATA); ?>”,$str);
这么看来,phpcms的模板系统还是蛮简单,呵呵
希望对大家有所帮助。


什么是html的nowrap属性

HTML中td元素的nowrap属性表示禁止单元格中的文字自动换行。在表格有宽度限制的时候,碰到英文字体与符号超长会强制换行!
<style>
td {white-space : nowrap }
</style>
强制不换行,相当于<nobr></nobr>
注意:td元素noWrap属性的行为与td元素的width属性有关。td元素中nowrap属性的行为与td元素的width属性有关。如果未设置td宽度,则nowrap属性起作用的,如果设置了td宽度,则nowrap属性不起作用。
nowrap表示是否允许表格中的文本换行
nowrap=true的时候不能换行
nowrap=false可以换行


如何用PHP操作xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<note>
<to>murray.cn</to>
<from>youtianxia.net</from>
<heading>murray</heading>
<body>youtianxia</body>
</note>
加载和输出XML
初始化XML 解析器,加载XML,并把它输出:
<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load(”note.xml”);
print $xmlDoc->saveXML();
?>
输出效果:
murray.cn youtianxia.net murray youtianxia
假如您在浏览器窗口中查看源代码,会看到下面这些 HTML:
<?xml version=”1.0″ encoding=”UTF-8″?>
<note>
<to>murray.cn</to>
<from>youtianxia.net</from>
<heading>murray</heading>
<body>youtianxia</body>
</note>
创建了一个 DOMDocument-Object,并把 “note.xml” 中的 XML 载入这个文档对象中。
saveXML() 函数把内部 XML 文档放入一个字符串,这样我们就可以输出它。
循环XML
我们要初始化XML解析器,加载XML,并循环 <note> 元素的所有元素:
<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load(”note.xml”);
$x = $xmlDoc->documentElement;
foreach ($x->childNodes AS $item){
print $item->nodeName . ” = ” . $item->nodeValue . “<br />”;
}
?>
输出效果:
#text =
to = George
#text =
from = John
#text =
heading = Reminder
#text =
body = Don’t forget [...]


使用XTREE实现PHP目录树的建议

自己的CMS正处于升级开发阶段,编辑提出实现目录,方便后台操作
在网上找了很多相关资料,最终决定用XTREE来实现PHP的目录树,网上有很多DEMO版的XTREE实例,尤其是CSDN的尤其不错。
实例里面提供了两个实现办法,一个是外部读取XML文件,它叫做异步加载;另外一个办法是直接在页面里用JS生成
本人一直趋向用XML的办法,原因有两个
第一,可以一次生成,多方加载,速度快
第二,方便手动修改
可偏偏天不随人愿,一直在因为XML不能出现<?xml version=”1.0″ encoding=”gb2312″?>和编码问题发愁
所以我劝大家如果工期紧,而且对XML没有那么深了解的话,还是用JS写吧
这里的JS生成目录树其实和XML的PHP操作很像,也是一个个子节点添加,并附加属性
只不过由之前的PHP5的new DOMDocument改为JS的new WebFXTree
$doc->createElement改为new WebFXTreeItem
需要特别注意的是new WebFXTreeItem的格式,这里WebFXTreeItem可以包括文字和链接
具体形式是:WebFXTreeItem(’名称’,’链接’);


linux下解决apache虚拟主机的Could not resolve host name错误

在LINUX下APACHE的虚拟主机的配置是个技术活儿,很多小的细节需要顾虑
当你的域名没有绑定好的时候,就会出现以下这个错误
Could not resolve host name
在您Apache服务器的配置中创建一个虚拟主 机并不会自动在您的DNS中对主机名做相应更新。您必须自己在DNS中添加域名来指向您的IP地址。否则别人是无法看到您的web 站点的。您可以在您的hosts文件中添加这一条目来进行测试,但这种方法仅适用于那些有这些条目的机器来使用。
# Ensure that Apache listens on port 80
Listen 80
# Listen for virtual host requests on all IP addresses
NameVirtualHost *
<VirtualHost *>
DocumentRoot /www/example1
ServerName www.example1.com
# Other directives here
</VirtualHost>
<VirtualHost *>
DocumentRoot /www/example2
ServerName www.example2.org
# Other directives here
</VirtualHost>
因为星号匹配所有的地址,所以主服务器不接收任何请求。因为 www.example1.com首先出现在配置文件中,所以它拥有最高 优先级,可以认为是默认或首要服务器。这意 味着如果一个接受的请求不能与某个ServerName指令相匹配, 它将会由第一个VirtualHost所伺服。
您可以用确定的IP地址来取代*。 在这种情况下,VirtualHost的参数必须 与NameVirtualHost的参数相符:
NameVirtualHost 172.20.30.40
<VirtualHost 172.20.30.40>
# etc …
不论如何,当您的IP地址无法确定的时候,使用* 是很方便的——比如说,您的ISP给您配置的是动态IP地址,而您有 使用了某种动态域名解析系统时。因为*匹配任何IP 地址,所以在这样的情况下,不论IP地址如何变化,您都不需要另 外进行配置。
上述配置就是您在绝大多数情况下使用基于域名的虚拟主机时将要用到 的。事实上,仅在一种情况下这样的配置不会让您满意:当您想为不同的IP 地址或是端口提供不同的内容时。


You don’t have permission to access

刚刚配置了新服务器,目录也设置好了,但访问的时候显示403错误
You don’t have permission to access
看来是权限的问题,赶忙去看APACHE的配置文件
在httpd.conf,找到这么一段:
Options FollowSymLinks
AllowOverride None
Order deny,allow
deny from all
Satisfy all
然后试着把deny from all中的deny改成了allow,保存后重起了apache,问题解决


php的FTP环境出错-undefined function ftp_connect()

最近要开发一个在线推送系统,要用到FTP,从网上找了几个FTP的管理类都不管用,加了些调试代码后发现报以下这个错
undefined function ftp_connect()
才知道使自己的PHP环境没有支持FTP,于是重新编译了PHP,加了–enable-ftp,FTP调试成功了
网上查了资料发现Windows 中 PHP4 默认是支持 FTP 函数的,不需要加载 php_ftp.dll;
Linux 中,PHP4 如果要使用 FTP 函数,编译的时候 –enable-ftp 激活 FTP 函数
顺便也把自己找到的FTP类也贴上来,还算好用
class class_ftp
{
public $off;
public $conn_id;
function __construct($FTP_HOST,$FTP_PORT,$FTP_USER,$FTP_PASS){
ftp_connect($FTP_HOST,$FTP_PORT);
$this->conn_id = @ftp_connect($FTP_HOST,$FTP_PORT) or die(”FTP服务器连接失败”);
@ftp_login($this->conn_id,$FTP_USER,$FTP_PASS) or die(”FTP服务器登陆失败”);
@ftp_pasv($this->conn_id,1); }
function up_file($path,$newpath,$type=true){
if($type) $this->dir_mkdirs($newpath);
$this->off = @ftp_put($this->conn_id,$newpath,$path,FTP_BINARY);
if(!$this->off) echo “文件上传失败,请检查权限及路径是否正确!”;}
function move_file($path,$newpath,$type=true){
if($type) $this->dir_mkdirs($newpath);
$this->off = @ftp_rename($this->conn_id,$path,$newpath);
if(!$this->off) echo “文件移动失败,请检查权限及原路径是否正确!”;}
function copy_file($path,$newpath,$type=true){
$downpath = “c:/tmp.dat”;
$this->off = @ftp_get($this->conn_id,$downpath,$path,FTP_BINARY);
if(!$this->off) echo “文件复制失败,请检查权限及原路径是否正确!”;
$this->up_file($downpath,$newpath,$type);}
function del_file($path){
$this->off = @ftp_delete($this->conn_id,$path);
if(!$this->off) echo “文件删除失败,请检查权限及路径是否正确!”;}
function dir_mkdirs($path){
$path_arr = explode(’/’,$path);
$file_name [...]


linux下更改用户目录

如何更改新建用户的默认目录
修改/etc/default/useradd文件,把HOME=/home改为你要的路径!
修改用户目录的方式
usermod -d 新目录 用户