PHP fopen()如果尚不存在则不创建文件

时间:2011-03-01 21:08:06

标签: php

作为应用程序日志记录的一部分,我正在尝试打开本地文件,如果该文件尚不存在,则创建新文件。这就是我所拥有的:

$path = '/home/www/phpapp/logs/myawesome_logfile.txt';
$f = (file_exists($path))? fopen($path, "a+") : fopen($path, "w+");
fwrite($f, $msg);
fclose($f);
chmod($path, 0777);

我已经仔细检查过了,/logs目录是chmod 0777,我甚至已经采取了额外的步骤,将它变成了apache:apache for good measure。尽管如此,当脚本打开文件时,它会向我发出警告,指出文件不存在并且炸弹了。没有创建任何文件。

我是否需要禁止fopen()警告才能让它创建文件?

5 个答案:

答案 0 :(得分:23)

当您在PHP中使用路径时,上下文可能非常重要。如果您在重定向上下文中使用URL,则根目录('/')将引用您的域的根。链接文件或图像以及include和require指令的路径也是如此。

但是,当您处理文件系统命令(如fopen)时,根目录('/')是系统根目录。不是您的域根。

要解决此问题,请尝试提供要从系统根目录打开的日志文件的完整路径。例如:/var/www/phpapplication/logs/myLogFile.txt

或者您可以按照其他答案中的建议使用$_SERVER['DOCUMENT_ROOT']来访问服务器存储的值,以获取文档根目录的路径。 /var/www部分。

在某些情况下,您还可以使用__DIR__魔法常量。请注意,__DIR__将是当前文件所在的目录,不一定与应用程序的根目录相同。例如,如果您的应用程序的根目录是/var/www/application并且您在/var/www/application/src/controllers/my_controller.php中工作,那么__DIR__将是/var/www/application/src/controllersSee here in the PHP documentation.

答案 1 :(得分:19)

你试过这个吗?

$msg = "I'm a line that is a message.\n";
$path = $_SERVER['DOCUMENT_ROOT'] . '/logs/myawesome_logfile.txt';
$f = fopen($path, "a+");
fwrite($f, $msg);
fclose($f);
chmod($path, 0777);

您正在处理的服务器可能会使您只能在phpapp的目录及其子目录中工作。

答案 2 :(得分:3)

我在UBUNTU 14.04中遇到此问题的一种方法是右键单击文件所在的目录并更改"其他"的权限。 to"创建和删除文件"。

答案 3 :(得分:1)

您始终可以使用"a"打开文件,它也会创建一个新文件 无需创造条件。

但是,您的代码的主要问题是理解物理文件系统和虚拟Web服务器之间的区别,这已经得到了很好的解释。

请注意,您应该向您的问题提供错误消息的完整副本。它包含大量非常有用的信息,它不像是誓言“我不会创建你的文件,走开!”但它是通过解释什么以及为什么出错来解释的。如果您自己不关心这些有用信息,则必须将其提供给寻求帮助的人。

答案 4 :(得分:0)

文件的路径必须与服务器根目录一致。我可以使用    phpinfo()函数 我想知道的文件里面的方法。因此,当您使用phpinfo()时,您将看到一个信息文档。如果你找到了     _SERVER [" SCRIPT_FILENAME"]您将看到文件的绝对路径。

我希望这有助于某人。