0

一些服务器想要 777 的权限,一些阻止超过 755 的任何文件,一些阻止您想要用来更改它的 chmod 函数等等。我想使用 file_get_contents 将简单文件写入服务器,但在脚本中将在许多不同的服务器上分发和使用,这些服务器非常多样化。假设至少 PHP5,写入/覆盖简单文本文件的最“跨服务器”和“跨主机”方式是什么?我以前使用过这样的东西:

@chmod($filePath, 0755);
$result = file_put_contents($filePath, $fileData);

假设它可以在尽可能多的服务器上工作:如果可以,请设置权限,但如果不能,则没有错误(因为某些服务器 file_put_contents 工作正常,但它会在 chmod 上引发实际上不需要的错误,但其他服务器需要 chmod)。但是必须有一个可以在每个可以想象的服务器附近运行的解决方案(假设 PHP5+)。这里有没有人有更好的方法的更多经验?

澄清:

我不指望任何人来拯救世界,也许它不能适用于每台服务器,但我们仍然可以让它在尽可能多的服务器上运行,这就是我希望完成的。至少让我们用尽所有方法来解决尽可能多的问题,并尝试以尽可能多的方式编写它。

例如:

file_put_contents($filePath, $fileData);

写入文件。耶!但在某些服务器上或在某些情况下,它可能会因为文件权限而失败。当。所以让我们让它变得更好一点。

chmod($filePath, 0777);
file_put_contents($filePath, $fileData);

现在它首先更改权限!酷,在更多人的服务器上工作!但是等等,一些服务器拒绝 0777,所以也许 0755 会比 0777 更多的服务器工作。

chmod($filePath, 0755);
file_put_contents($filePath, $fileData);

太好了,现在它适用于更多人的服务器。但是等等:一些服务器阻止了 chmod 功能。但这并不意味着该文件已经不可写,这只是一个备份,以防万一它不可写,所以仍然至少尝试编写它,但不要在 chmod 没有的服务器上抛出错误'不工作,因为它无论如何都可以很好地工作(我们总是可以测试它是否在之后这样做,所以它不会默默地失败)。

@chmod($filePath, 0755);
file_put_contents($filePath, $fileData);

等等等等。看看我是如何添加功能以尝试更多方法让它工作的,同时确保我不会破坏它已经工作的地方?我不是要求任何人“无论如何都要让 chmod 工作”。我在问是否有人有继续这种思路的经验,找到了更多可以避免的文件写入失败的地方,并在他们的片段中解释它们,直到它成为最好的文件写入片段,工作在尽可能多的地方。也许不是在任何地方,但在上面代码片段的更多地方。我知道肯定有人在比我更多样化的服务器环境方面有经验,并且可以比我做得更好(或已经做到了),所以我在问!

基于反馈的补充:

1) 一种反馈是权限在不同服务器上的工作方式不同。从技术上讲,是的。但在某些方面,事情并不是那么简单。

一些服务器设置为...反叛是一个很好的词...如果您将文件权限设置为比 755 更宽松,例如 777,并且根本不让文件被读取/写入/执行,只需返回 500 错误。在其他服务器上,根据服务器,您的 php 代码似乎不是文件的“所有者”,在这种情况下,我假设组需要 7 作为墙,或者文件所有权需要更改(这会带来了另一组“跨服务器”的复杂性)。我承认我可能理解错误的根源(如果是这种情况,那是我希望澄清的另一件事,有人对问题有更深入的了解并因此提出了更优雅的解决方案!) ,不能像理论上那样在每台服务器上工作(事实上我想说它只适用于我的客户安装了这种类型的代码片段的服务器中的大约 90%)。所以我想问是否有人以这种方式处理过许多服务器,并且有一种更防弹的方法:一种可以绕过随机主机如何设置服务器之间的各种差异的方法。我假设它将有多个步骤,首先确保文件是可写的,然后多次尝试以各种方式编写文件本身。

2) 是的,文件需要持久化,这就是重点:) 例如编辑 XML 文件或在 CMS 中创建新的 html 页面。并将其扼杀在萌芽状态:不要给我“您应该使用数据库获取信息,而不是编写文件”。这也有它的位置,不过我问了一个不同的问题,关于写文件,因为有时你也需要这样做:P

3) 我知道在某些情况下您根本无法写入文件。但我要问的是,是否有人有将其最小化的经验,以便它在尽可能多的情况下工作。我知道我上面所拥有的并不是人类可能的最普遍的片段,所以我在问可能是什么:)

4

1 回答 1

0

我不是服务器之间差异方面的专家,所以这就是为什么我希望从有人那里得到答案,但显然编码的创造力不是 PHP 社区的强项:) 所以我自己写了一个,并且虽然比只调用 chmod 然后调用 file_put_contents 好得多,但我不是服务器专家,我认为它可以更好......但总比没有好。(脚本适用于我测试过的超过 99% 的服务器,而 85%-90% 的服务器只调用 chmod 然后 file_put_contents 正在运行)。

function makeFileWritable($filename, $perm = 0755)
{
    if (!file_exists($filename))
    {
        $folderpath = dirname($filename);
        if(is_writable($folderpath)) return true;

        @chmod($folderpath, $perm);
        if(is_writable($folderpath)) return true;

        if ($perm == 0755) return makeFileWritable($filename, 0775);
        return false;
    }
    else
    {
        $folderpath = dirname($filename);
        if(is_writable($folderpath) && is_writable($filename)) return true;
        if (!is_writable($folderpath)) @chmod($folderpath, $perm);
        if (!is_writable($filename)) @chmod($filename, $perm);
        if (is_writable($folderpath) && is_writable($filename)) return true;

        if ($perm == 0755) return makeFileWritable($filename, 0775);
        return false;
    }
}

@makeFileWritable($filePath);
$result = file_put_contents($filePath, $writeData);

基本上你在预期的文件路径上调用@makeFileWritable。如果文件存在,它会尝试将文件权限和包含它的文件夹的权限设置为 0755,如果文件不存在,它只会尝试将其包含文件夹的权限更改为 0755。一旦完成,它会尝试确定文件现在是否可写。如果是,那么它就完成了。如果不是,那么它会再次调用自己(以某种递归方式),但这次尝试对 0775 做同样的事情,以防服务器需要它是组可写的才能工作。但无论如何,它不会返回任何错误并仍然尝试写入文件,以防文件一直是可写的,但我们确定它是否可写的测试不准确(如果第一部分静默失败也没关系)失败,

所以你去吧,那个脚本使我的 10 个不写文件的服务器中有 1 个或 2 个变成了基本上 0 个不写文件的服务器……一个 AS3/JS 程序员在一堆之后写了它的 PHP 程序员告诉他问题不存在或无法解决。我认为需要为 PHP 社区注入更多的创造力,我希望他们能有一点创造性,并提出一些改进建议,因为我怀疑作为一个非 PHP 专家,我是否已经做到了这一点: (

于 2012-05-17T13:10:48.390 回答