为什么php文件不能在CLI中工作,而不能在浏览器中工作?

时间:2019-07-19 00:49:03

标签: php html file save

我有一个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用作附件。这似乎是我最好的前进方式,但是浏览器故障却让我感到困惑。

2 个答案:

答案 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

旁边的问题:这被认为是不安全的做法吗?