PHP fopen успешно выполняется для одного скрипта, но не для другого - PullRequest
1 голос
/ 09 сентября 2011

Мой следующий метод использует массив данных $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 ]

1 голос
/ 09 сентября 2011

Наконец-то было найдено решение, состоящее в том, что имя файла должно быть полным абсолютным адресом, чтобы он по какой-то причине работал в обоих сценариях. Это было предложено в одном из ответов на этот вопрос SO , который я цитирую ниже:

Использовать fopen ($ _ SERVER ['DOCUMENT_ROOT']. 'Test.txt', 'a +');

так что для моего кода я использовал:

if($fp=fopen($_SERVER['DOCUMENT_ROOT'].$name, 'w')) {
    fwrite($fp, "Working");
}
0 голосов
/ 09 сентября 2011

не удалось открыть поток: в доступе отказано

Существует один важный навык программиста, который должен освоить каждый разработчик.
Вот оно:

Доверять своим глазам

Если ваш PHP говорит вам, что в доступе отказано - так оно и есть. Просто проверьте это. Это не имеет большого значения, но никто не может сделать это для вас.

0 голосов
/ 09 сентября 2011

В вашем тесте

fwrite("Blah");

должно быть

fwrite($fp, "Blah");

Я не уверен, в чем проблема в исходном коде.

...