【问题标题】:PHP fopen succeeding for one script but not anotherPHP fopen 对一个脚本成功,但对另一个脚本没有成功
【发布时间】:2011-11-13 15:24:23
【问题描述】:

我下面的方法使用了一个数据数组$FDFData来创建一个FDF文件:

    public function writeFDFFile($FDFData) {
        $fdf_file = time().'.fdf';
        $fdf = $this->createFDF(PDF_FORM, $FDFData);

        // write the file out
        if($fp=fopen($fdf_file,'w')) {
            fwrite($fp,$fdf,strlen($fdf));
        } else {
            throw new Exception('Unable to create file: '.$fdf_file);
        }

        fclose($fp);
        return $fdf_file;
    }

我的一个脚本运行得非常好:

require_once('PDFPrinter.php');
try {
    $printer = new PDFPrinter();
    $FDFData = $printer->assembleFDFData(9);
    $fdf_file = $printer->writeFDFFile($FDFData);
    $printer->downloadFile($fdf_file);
}catch(Exception $e) {
    echo $e->getMessage();
}

但我无法运行我的测试代码,因为我得到了:

Unexpected PHP error [fopen(1315558352.fdf) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: Permission denied]

抛出错误:

require_once(dirname(__FILE__) . '/simpletest/autorun.php');
require_once(dirname(__FILE__) . '/../PDFPrinter.php');
class PDFPrinterTest extends UnitTestCase {

    private $printer;
    private $FDFData;

    function setUp() {
        $this->printer = new PDFPrinter();
        $this->FDFData = $this->printer->assembleFDFData(5);
    }

    function testException() {
        try {
            $this->printer->writeFDFFile($this->FDFData);
            $this-assertTrue(true);
        } catch(Exception $e) {
            $this->assertTrue(false);
        }
    }
}

这两个脚本都在具有正确权限的目录中运行。我也在通过浏览器运行我的测试脚本,所以并不是我有不同的环境。

我不知道如何真正找到问题。

我的目录结构:

HOME - PDFPrinter.php
  |
  -----tests - PDFPrinterTest.php
         |
         ------simpletest - autorun.php

关于如何找到问题的任何建议?

非常感谢

更新

我已尝试更改我的测试类,以便其中唯一的测试功能是:

function testWrite() {
    try {
        $name = "testing.txt";
        if($fp=fopen($name, 'w')) {
            fwrite($fp, "Blah");
        } else {
            throw new Exception("Nope.");
        }
    $this->pass("All good");
    } catch(Exception $e) {
        $this->fail("Not good");
    }

}

但仍会抛出异常并发出警告。

然而,从同一目录运行的一个非常简单的脚本可以正常工作:

$name = "Test.txt";
if($fp=fopen($name, 'w')) {
    fwrite($fp, "Working");
} else {
    throw new Exception("Nope.");
}
fclose($fp);

这将实际创建并写入文件。

【问题讨论】:

  • SAFE_MODE 是如何设置的?它通常会出错,因为出于安全原因,它只能上传到它自己创建的文件夹。
  • 嗨,SAFE_MODE 是 off,表示本地值,“on”表示主值。当您说“它只能上传到它自己创建的文件夹”时,您指的是什么“它”?另外,我尝试将我的测试代码移动到与工作代码相同的文件夹中,但仍然出现相同的错误。
  • 嗨! Appart 获得目录权限,我看不到测试失败的原因。你在什么操作系统上运行你的脚本?您是否尝试过从测试目录运行您的工作?
  • 您好,感谢您的回复。是的,我尝试从测试目录运行工作脚本,它工作正常。我不确定操作系统。相当烦人的是,我只获得了对服务器的 ftp 访问权限,因此我无法使用命令行进行探索。

标签: php permissions fopen


【解决方案1】:

终于找到了解决方案,即文件名必须是完整的绝对地址才能在两个脚本中出于某种原因工作。这是我在下面引用的in one of the answers for this SO question 建议的:

使用 fopen($_SERVER['DOCUMENT_ROOT'].'test.txt','a+');

所以对于我的代码,我使用了:

if($fp=fopen($_SERVER['DOCUMENT_ROOT'].$name, 'w')) {
    fwrite($fp, "Working");
}

【讨论】:

    【解决方案2】:

    无法打开流:权限被拒绝

    每个开发人员都应该掌握一项重要的程序员技能。
    这里是:

    相信你的眼睛

    如果您的 PHP 告诉您权限被拒绝 - 就是这样。仔细检查一下。这没什么大不了的,但没有人能为你做。

    【讨论】:

    • 我不怀疑。但我找不到原因。
    【解决方案3】:

    在你的测试中

    fwrite("Blah");
    

    应该是

    fwrite($fp, "Blah");
    

    我不确定原始代码中的问题是什么。

    【讨论】:

    • 那是真的谢谢,但在此之前它就失败了,原始代码是正确的。我会更新帖子。
    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2022-10-13
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多