一客户要安装 pagecookery microblog v0.6.5 上传到空间,提示:
因如下原因,安装无法继续:
Cache 目录无法写入.
music.json 文件无法写入.
photos.json 文件无法写入.
rss.xml 文件无法写入.
Windows服务器上的虚拟主机,还是第一次遇到这事,居然判断说不可写。
翻看其源,发现在lib/functions.php中定义了权限判断的函数:
- function is_really_writable($file)
- {
- // If we're on a Unix server with safe_mode off we call is_writable
- if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
- {
- return is_writable($file);
- }
- // For windows servers and safe_mode "on" installations we'll actually
- // write a file then read it. Bah...
- if (is_dir($file))
- {
- $file = rtrim($file, '/').'/'.md5(rand(1,100));
- if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
- {
- return FALSE;
- }
- fclose($fp);
- @chmod($file, DIR_WRITE_MODE);
- @unlink($file);
- return TRUE;
- }
- elseif (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
- {
- return FALSE;
- }
- fclose($fp);
- return TRUE;
- }
其中fopen部分用到了参数 FOPEN_WRITE_CREATE ,看着奇怪,fopen第二个参数应该是打开模式,似乎没有默认的常量可用。以为我记错了,再翻来PHP手册,依然没这个说明。改下看看,将
$fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE
改为:
$fp = @fopen($file, 'w')) === FALSE
再运行install返回正常,可以继续安装。
那这个 FOPEN_WRITE_CREATE 是一个常量么?搜索整个程序,未发现有定义的地方。
GG一下,发错有的程序中使用了这个东西,但是有定义常量的。并没有发现说是PHP内置常量。
心想,或许是作者不小心引用了别人的这个代码,但忘了定义常量吧。
解决办法:
在网上搜索到了这个 FOPEN_WRITE_CREATE 出现的地方,把人家常量定义的代码再引用一下就好了,就不改原作代码了。
打开 lib/functions.php 在头部添加如下代码,保存即可。
- define('DIR_READ_MODE', 0755);
- define('DIR_WRITE_MODE', 0777);
- define('FILE_READ_MODE', 0644);
- define('FILE_WRITE_MODE', 0666);
- define('FOPEN_READ', 'rb');
- define('FOPEN_READ_WRITE', 'r+b');
- define('FOPEN_READ_WRITE_CREATE', 'a+b');
- define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b');
- define('FOPEN_READ_WRITE_CREATE_STRICT', 'x+b');
- define('FOPEN_WRITE_CREATE', 'ab');
- define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb');
- define('FOPEN_WRITE_CREATE_STRICT', 'xb');
