PHP和文件写入权限

4

我有一个文件夹,里面有三个不同的php脚本。email.php txt.php android.php

我将电子邮件和/或文本发送到它们各自的脚本中,并使用http POST向android脚本发送数据。

最初我只有电子邮件和文本,使用这些都是可以的。

$data = '//data fields condensed into a single string obtained from email or txt';
$filename= "output.php";
$newFile= fopen($filename, 'w+');
fwrite($newFile, $data);
fclose($newFile);`

没问题,这些脚本可以打开/写入文件,如果不存在它们会创建它。但是该文件夹不可写。
现在我有了android.php脚本,最初它无法打开/创建output.php,直到我让整个文件夹可写。现在,如果需要,它可以创建output.php。
现在的问题是,任何脚本都可以创建/写入output.php,但是一旦其中一个脚本创建了该文件,其他脚本就无法写入它。即,如果android脚本创建了output.php,则电子邮件和txt脚本返回错误;如果电子邮件或txt脚本创建了output.php,则android脚本返回错误。
错误是“无法打开 fopen”之类的内容。
Lorenzo(在SO上的用户)开始提到用户方面的问题(例如传输的电子邮件将被视为与http POST命令不同的用户)。脚本使用权限为644(无执行权限,只有所有者可以写入)创建output.php,我无法手动更改权限为777-尽管我希望找到一种允许脚本创建它的方法-这样我可以定期清空文件夹进行备份,而不必记住放回去等等…
我想我可以将3个脚本合并为一个(希望如此),但是我不想这样做。还有其他人有什么想法吗?
谢谢
更新:由于我是新用户,无法“回答”自己的问题-
好的,借助每个人的帮助,我找到了解决方案: 电子邮件和txt脚本由用户“owner”运行,htmlPOST由用户“?” 运行。
我必须使文件夹的chmod为777,以便用户“?”正常工作。
每次运行每个脚本时,它都会检查文件'output.php'是否存在。如果不存在,那么在fclose之后,我添加了一个chmod 777-这样其他用户运行的脚本就可以稍后打开/写入它了。如果该文件已经存在,则我没有添加chmod,因为如果是错误的用户,则会创建错误。 因此,下面是它的简单示例:
$data = '//data fields condensed into a single string obtained from email or txt';
$filename= "output.php";

if (file_exists($filename)){
$newFile= fopen($filename, 'w+');
fwrite($newFile, $data);
fclose($newFile);
} else {
$newFile= fopen($filename, 'w+');
fwrite($newFile, $data);
fclose($newFile);
chmod($file, 0777);
}

感谢您的帮助!

1
看起来,当用户android.php创建output.php时运行的用户与其他2个用户运行时不同。尝试让所有3个用户以相同的系统用户身份运行。当Android和其他2个用户创建文件时,ls -l output.php的输出有差异吗? - David Xia
你能以更一般化的方式表达你的问题吗?你有3个线程/进程需要彼此通信,而你使用文件作为队列?你想要实现什么目标?如果你能描述清楚,你可能会得到更好的答案,例如使用一个你不熟悉的现有设计模式。 - Nir Alfasi
3个回答

4

好的,通过大家的帮助,我已经找出了一个解决方案: 邮件和短信脚本由用户'owner'运行,而htmlPOST则由用户'?'运行。

我必须将文件夹chmod为777,以便用户'?'能够正常工作。

每个脚本运行时,都会检查是否存在文件'output.php'。如果不存在,则在fclose后添加chmod 777 - 这样其他用户运行的脚本就可以打开/写入它了。如果文件已经存在,则不添加chmod,因为如果是错误的用户创建它会产生错误。 以下是一个简单的示例:

$data = '//data fields condensed into a single string obtained from email or txt';
$filename= "output.php";

if (file_exists($filename)){
    $newFile= fopen($filename, 'w+');
    fwrite($newFile, $data);
    fclose($newFile);
} else {
    $newFile= fopen($filename, 'w+');
    fwrite($newFile, $data);
    fclose($newFile);

    chmod($filename, 0777);
}

感谢你的帮助!

4

如果这是一个权限问题,而且您无法手动更改权限为777,

也许您可以尝试:

$filename= "output.php";

// programatically set permissions
if(!file_exists($filename)){
    touch($filename);
    chmod($filename, 0777);
}

$data = '//data fields condensed into a single string obtained from email or txt';
$newFile= fopen($filename, 'w+');
fwrite($newFile, $data);
fclose($newFile);

我刚刚快速尝试了一下,但它没有起作用。过几分钟再尝试几次。谢谢您的想法。 - lifeIsGood

1

像@DavidXia建议的那样使用ls命令,并检查输出文件的所有者。它们应该归属于运行创建它们的脚本的用户。如果文件归属于不同的用户,则需要将这些用户放入一个公共组中,并将所有文件分配给该组拥有(拥有文件的用户可以保持离散)。然后,您还需要通过chmod为所有这些文件分配g+rw。


我不知道如何使用“ls -l”命令。我使用FireFTP进行连接,我可以在那里做吗? - lifeIsGood
尝试右键单击文件并显示更多有关它的信息。您可以在FireFTP中添加额外的列以显示所有权吗? - David Xia
是的,它们由不同的用户拥有。它们通过一个数字进行标识,似乎“owner”是513,而HTML POST方法是用户“99”。这些数字保持不变。我该如何将它们放入“组”中?我也不理解通过chmod命令的g+rw注释。 - lifeIsGood
如果您的界面是远程文件系统,则请查看您的FTP客户端文档。chmod g+rw设置文件权限,使得拥有该文件的组中的用户可以读取或写入该文件。 - quickshiftin
我在寻找这样的信息方面遇到了困难 - 如果有其他方法,我也可以通过cPanel访问? - lifeIsGood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接