我正在尝试获取一个include
d PHP脚本来写入文件,但路径没有按照我的意愿解析。这是一个场景:
正在运行的脚本(调用脚本)可以通过web访问。为了节省我的输入,说http://example.com/script1.php
,example.com的Apache文档根绝对路径是/home/jweinberger/com.example/
我在/home/jweinberger/scripts/script2.php.
上找到了另一个脚本(绝对路径)
script1.php包含一个工作正常的include('/home/jweinberger/script2.php)
。
script2.php尝试fopen('/home/jweinberger/logs/script1.log')
,但失败。错误消息显示它正在尝试打开:
/home/jweinberger/com.example/logs/script1.log//home/jweinberger/logs/script1.log
很明显,这是在准备调用脚本的Apache文档根,我不希望这样。
我已经完全指定了所有路径(根本没有相对路径)。safe_mode
关闭,doc_root为空,php.ini中未设置cgi.force_redirect。这是PHP 5.2.17
(由我的web主机提供-我无法控制升级)
而且,如果重要的话,script2.php在CLI脚本调用时成功地打开了正确的文件,而不是在CGI调用时。
有人能为我如何让script2.php成功打开正确的文件提供任何建议或指导吗?
我非常感谢。
如果路径以/
开头,它将指向根文件系统,该系统可以使用CLI,但CGI可以这样理解:
/home/jweinberger/com.example/logs/script1.log//home/jweinberger/logs/script1.log
您应该使用$_SERVER
数组中的索引'DOCUMENT_ROOT'
。
fopen($_SERVER['DOCUMENT_ROOT'].'/home/jweinberger/logs/script1.log')
meda给了我线索,让我找到了答案。
我的错误在于构建文件名的方式。我在当前脚本名称前加了"/home/jweinberger/logs",这是错误的,因为当前脚本名称是完整路径。
当我改为使用basename(当前脚本名称)时,效果很好。
简单的监督。希望它能帮助这里的人