Сбой fopen в режиме x с использованием оболочки AWS S3 - PullRequest
0 голосов
/ 07 июля 2019

TL; DR: я использую библиотеку Nette Tracy, которая создает сводный (.log) и подробный (.html) файл о любых возникающих ошибках, и я пытаюсь загрузить их в AWS S3. Файл .log появляется успешно, но файл .html нигде не видно.


Я использую библиотеку Nette Tracy и пытаюсь загрузить весь вывод в корзину S3.

До сих пор я создал оболочку S3 и вручную вызвал исключение, чтобы протестировать его, но это удалось только частично. Оболочка S3 существует и работает частично, поскольку первоначальный «обзорный» документ (error.log) успешно создан - это просто HTML-документ, который не отображается. Он отлично работает с локальным хранилищем, но S3 предпочтительнее.

Когда он пытается самостоятельно записать фактическую информацию об исключении (файл HTML), функция fopen возвращает false. В результате из функции также возвращается false (функция ниже), и файл не создается.

В файле error.log, который фактически загружен, записывается ниже (имя корзины и путь удален):

Предупреждение PHP: fopen (s3: \ BUCKET \ debug \ tracy \ exception - 2019-07-07--00-30--459a553c82.html): не удалось открыть поток: нет такого файла или каталога в C: \ path \ to \ file \ tracy \ Tracy \ BlueScreen \ BlueScreen.php: 97 @ http://mydevelopment.site

Не совсем уверен, куда идти отсюда? Любая помощь указатели приветствуются!

Это код, являющийся частью библиотеки Tracy, в котором записаны полные сведения об исключении / ошибке:

    /**
     * Renders blue screen to file (if file exists, it will not be overwritten).
     */
    public function renderToFile(\Throwable $exception, string $file): bool
    {
        if ($handle = @fopen($file, 'x')) {
            ob_start(); // double buffer prevents sending HTTP headers in some PHP
            ob_start(function ($buffer) use ($handle): void { fwrite($handle, $buffer); }, 4096);
            $this->renderTemplate($exception, __DIR__ . '/assets/page.phtml', false);
            ob_end_flush();
            ob_end_clean();
            fclose($handle);
            return true;
        }
        return false;
    }
...