我有一个php文件,当从CLI运行时,该文件可以按预期工作,但是当Chrome通过公共ip地址调用时,它会回显但不会保存内容,甚至不会创建名为cache.html的文件。
<?php
$cacheFile = '/home/directories/php/cache.html';
ob_start();
echo '<h1>Hello world to cache</h1>';
$content = ob_get_contents();
ob_end_clean();
file_put_contents($cacheFile,$content);
echo $content;
?>
我有很多php页面都可以正常工作,但这是我第一次尝试将网页保存到文件中。我打算使用PHPMailer将文件邮寄给我自己。切坦·夏尔马(Chetan Sharma)在Save current page as HTML to server的回答启发了我。
/etc/php7/cli/php.ini和/etc/php7/apache/php.ini都这样设置:
;;;;;;;;;;;;;;;;;;
; Fopen wrappers ;
;;;;;;;;;;;;;;;;;;
; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
; http://php.net/allow-url-fopen
allow_url_fopen = On
我担心Apache所提供的手册中关于ob_start的警告; https://www.php.net/manual/en/function.ob-start.php
警告 某些Web服务器(例如Apache)在调用回调函数时会更改脚本的工作目录。您可以通过以下方式将其改回chdir(dirname($ _ SERVER ['SCRIPT_FILENAME'])))。
我最初设置$cachefile = /cache.html
并通过
file_put_contents(chdir(dirname($_SERVER['SCRIPT_FILENAME']))$cachefile,$content);
那没有用。但是,$cacheFile = '/home/directories/php/cache.html';
在CLI中可以正常工作。
我用ob_end_flush()替换了ob_end_clean()没什么区别。
为什么浏览器失败?我很好奇,但最后我真的想将lamp / php生成的网页保存到本地php-project目录中的文件中,并带有格式等信息。以供PHPMailer用作附件。这似乎是我最好的前进方式,但是浏览器故障却让我感到困惑。
答案 0 :(得分:1)
因为CLI中的php在运行命令的用户(登录用户)的权限下运行,该用户肯定具有该目录的权限,因为您可能是从CLI创建的。
将目录所有者和权限更改为在浏览器中运行php的用户。
sudo chown -R your-apache-user /home/directories/php/
//apache-user you found as mentioned in question below
https://serverfault.com/questions/125865/finding-out-what-user-apache-is-running-as
答案 1 :(得分:0)
是的,文件权限。
不想将我的整个项目目录转到运行apache守护程序的“ wwwrun”用户,我创建了一个新目录,名为“ wwwrun”。然后,我将该用户的所有权授予所有人(可写)“ 0777”,然后将脚本更改为指向新目录。一切都解决了。
这使我可以在用户下编辑项目,而wwwrun现在拥有一个可供用户访问的写入位置。谢谢您第二眼。
<?php
session_start(); // This function has to be called every time, you work with $_SESSION
if ($_SESSION["password"] === $userpw) {
// data can be accessed
} else {
// access denied, redirect to example.php
header("Location: ../example.php");
}
修改脚本:> md /home/directories/php/wwwrun
> sudo chown -R wwwrun wwwrun
> sudo chmod -R a+w wwwrun
旁边的问题:这被认为是不安全的做法吗?