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

b. *_*eck 18 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);
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*ham 26

当您使用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/controllers.请参阅PHP文档中的此处.


Tob*_*ias 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);
Run Code Online (Sandbox Code Playgroud)

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