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

php
2022-08-30 17:01:23

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

$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);

我已经仔细检查了一下,目录是chmod 0777,我甚至采取了额外的步骤,将其设置为apache:apache以进行良好的测量。尽管如此,当脚本打开文件时,它会给我一个警告,即该文件不存在并爆炸。不会创建任何文件。/logs

我是否需要禁止显示警告才能使其创建文件?fopen()


答案 1

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

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

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

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

在某些情况下,您还可以使用魔术常量。请注意,这将是当前文件所在的目录,不一定与应用程序的根目录相同。例如,如果您的应用程序的根是 ,并且您正在 中工作,那么将是 。请参阅 PHP 文档中的此处。__DIR____DIR__/var/www/application/var/www/application/src/controllers/my_controller.php__DIR__/var/www/application/src/controllers


答案 2

你试过这个吗?

$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的目录及其子目录中工作。


推荐