0

我制作了一个站点地图,并使用从 mysql 生成的 php 文件进行制作。我更改了主机,现在写入文件时遇到问题。我无法理解一些事情。这是我的例子:

<?php 
$xml = 'bla bla xml'; //... some xml generating code
$fp = fopen($_SERVER['DOCUMENT_ROOT'].'/my_site_map.xml', 'w');


   if($fp)
      echo 'we opened it';
   else
      echo 'we failed';

   $fwrite=fwrite($fp, $xml, strlen($xml));

   if($fwrite==false)
      echo "another fail";

   fclose($fp);

   echo "we done";

?>

问题是:我的文件 my_site_map.xml 的权限为 664(rw-rw-r--),如果我从浏览器打开此 php 页面,我将无法使用此脚本,所以,如果我尝试这样做,我会看到:“我们失败了又失败了”;但是如果我通过 crontab 打开它并看到一个日志文件,我可以看到:“我们打开它我们完成了”。我正是想要这个,但主要问题是文件没有被重写。为什么?我该如何解决这个问题?谢谢。

我的服务器是 nginx 而不是 Apache,没想到这个信息会有价值

4

2 回答 2

2

好吧,我没有足够的代表发表评论,所以这必须是一个答案。

我将在黑暗中刺伤并说该文件归您的用户或根用户所有,而不是运行网络服务器的进程。该文件也不属于运行 webserver 进程的组。

因此,要么 chown/chgrp 由正在运行的 apache(?!) 进程拥有的文件,例如 chown apache 文件,要么将文件设置为对每个人都有写权限,例如 chmod 666 文件

不要 chmod 777 如上所述,除非它是一个可执行文件并且您希望任何人都能够运行它。第一个解决方案是比仅仅授予任何人对文件的读取权限更好的做法。

编辑:在对上面原始答案的评论的评论中,如果文件不是可执行文件,那么不要给它 7 以获得任何权限。6 是读/写的,适用于您要打开写入的文本文件(即使是 2 也是如此)。

编辑 2:尝试捕获 fopen 函数在 try catch 块中运行的任何异常:

try { 
    $fp = fopen($_SERVER['DOCUMENT_ROOT'].'/my_site_map.xml', 'w'); 
} catch (Exception $e) { 
    echo "The error is" . $e->getMessage(); 
}
于 2013-02-20T01:22:48.033 回答
0

对于 PHP 代码,这里是动态更改它的链接。您可以将其更改为进行编辑的内容,然后根据需要将其更改回来。

http://php.net/manual/en/function.chmod.php

http://php.net/manual/en/function.chown.php

http://php.net/manual/en/function.chgrp.php

示例包含在文档的每个链接中。找到最适合您的工作的权限。没有一种适合所有人的权限,因为它实际上取决于您的最终产品(Web 应用程序、页面等)。

于 2013-02-20T01:28:07.930 回答