【问题】
当前环境:
WordPress 3.4 with DB 20596 on PHP 5.3.6
Plugin version: 3.2.7 ($Id: sitemap-core.php 440117 2011-09-19 13:24:49Z arnee $)
问题:
在wordpress的google xml sitemap插件中,
参考:
已经实现了相应的代码:
//http://localhost/files/doc/docbook/ //files/doc/docbook/ //files/doc/docbook //http://localhost/wp-admin/options-general.php?page=google-sitemap-generator/sitemap.php&sm_wpv=3.4&sm_pv=3.2.7 echo "------------open dir begin --------------------<br />"; $curPwd = getcwd(); echo "curPwd=".$curPwd."<br />"; echo $_SERVER['DOCUMENT_ROOT']."<br>"; //获得服务器文档根变量 $rootPath = $_SERVER['DOCUMENT_ROOT']; $rootPath = $rootPath."/"; //$curPath = $p->GetUrl(); //$curPath = "../files/doc/docbook"; $curPath = "../files/doc/docbook/"; //$curPath = "files/doc/docbook"; echo "curPath=" . $curPath."<br />"; $isDir = is_dir($curPath); echo "isDir=".$isDir."<br />"; //$fullPath = $rootPath.$curPath; $fullPath = $curPath; echo "fullPath=" . $fullPath."<br />"; echo "---test dir()---</br />"; $openedDir = dir($fullPath); while($file = $openedDir->read() !== false) { echo "file=". $file."<br />"; } $openedDir->close(); echo "---test opendir()---</br />"; $dirHandler = opendir($fullPath); //$dirHandler = opendir("."); while($filename = readdir($dirHandler) !== false) { echo "filename=". $filename."<br />"; //echo "filename: $filename : filetype: " . filetype($fullPath . $filename) . "\n"; } closedir($dirHandler); echo "------------open dir end --------------------<br />"; //echo phpinfo(); echo "---------------------------------------------<br />";
用于读取对应目录下的所有的文件,输出为:
------------open dir begin -------------------- curPwd=D:\tmp\WordPress\DevRoot\httpd-2.2.19-win64\httpd-2.2-x64\htdocs\wp-admin D:/tmp/WordPress/DevRoot/httpd-2.2.19-win64/httpd-2.2-x64/htdocs curPath=../files/doc/docbook/ isDir=1 fullPath=../files/doc/docbook/ ---test dir()--- file=1 file=1 file=1 file=1 file=1 file=1 ---test opendir()--- filename=1 filename=1 filename=1 filename=1 filename=1 filename=1 ------------open dir end -------------------- ---------------------------------------------
其中,对应的目录files/doc/docbook下有三个目录和一个文件:
但是上面的输出中,文件名filename却始终为1.
(其中第一和第二个filename对应的是当前路径的“.”和上一级目录的“..”)
【解决过程】
1.以为是wordpress其他插件可能会影响php执行,所以去把wordpress中,除了google xml sitemap之外的插件,基本上都停用了,问题依旧。
2.参考:
等内容,才写出前面的那些代码,结果证明,不论是dir的read还是readdir,问题都是一样的。
3.以为是绝对路径有问题,所以改为上面的相对路径的版本,测试结果问题依旧。
4.网上找了半天,也找不到,关于php的readdir的输出文件名始终为1的类似问题。
5.后来经过折腾,添加了手动的readdir,相应代码变为:
$isDir = is_dir($curPath); echo "isDir=".$isDir."<br />"; //$fullPath = $rootPath.$curPath; $fullPath = $curPath; echo "fullPath=" . $fullPath."<br />"; echo "---test dir()---</br />"; $openedDir = @dir($fullPath); echo "first read output=".$openedDir->read()."<br />"; echo "second read output=".$openedDir->read()."<br />"; echo "third read output=".$openedDir->read()."<br />"; while($file = $openedDir->read() !== false) { echo "file=". $file."<br />"; } $openedDir->close(); echo "---test opendir()---</br />"; $dirHandler = @opendir($fullPath); //$dirHandler = opendir("."); echo "first read output=".readdir($dirHandler)."<br />"; echo "second read output=".readdir($dirHandler)."<br />"; echo "third read output=".readdir($dirHandler)."<br />"; while($filename = readdir($dirHandler) !== false) { echo "filename=". $filename."<br />"; //echo "filename: $filename : filetype: " . filetype($fullPath . $filename) . "\n"; } closedir($dirHandler);
结果输出得到正常的结果:
------------open dir begin -------------------- curPwd=D:\tmp\WordPress\DevRoot\httpd-2.2.19-win64\httpd-2.2-x64\htdocs\wp-admin D:/tmp/WordPress/DevRoot/httpd-2.2.19-win64/httpd-2.2-x64/htdocs curPath=../files/doc/docbook/ isDir=1 fullPath=../files/doc/docbook/ ---test dir()--- first read output=. second read output=.. third read output=html file=1 file=1 file=1 ---test opendir()--- first read output=. second read output=.. third read output=html filename=1 filename=1 filename=1 ------------open dir end -------------------- ---------------------------------------------
可见,看来是
while($file = $openedDir->read() !== false)
的问题,然后此时才注意到,两个操作符:
等于号“=”
和
不等于“!==”
两者的运算优先级是,等于号小于不等于“!==”
所以,应该加上括号,写成:
while(($file = $openedDir->read()) !== false) ... while(($filename = readdir($dirHandler)) !== false)
这样才能保证file和filename得到正确的赋值。
【总结】
不论什么语言,写代码的时候,关于多个运算符在一起,都还是要养成加括号的好习惯,才可以。