PHP fopen成功完成一个脚本而不是另一个脚本

时间:2011-09-09 09:18:08

标签: php permissions fopen

我的以下方法使用数据数组$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);

实际上会创建并写入文件。

3 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分:0)

在你的考试中

fwrite("Blah");

应该是

fwrite($fp, "Blah");

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

答案 2 :(得分:0)

  

无法打开流:权限被拒绝

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

相信你的眼睛

如果您的PHP告诉您该权限被拒绝 - 那就是。只是检查它。这不是什么大问题,没有人能为你做到这一点。