TemplateException: не удалось написать скомпилированный шаблон - после клонирования git

Кто-нибудь знает, почему я получаю это исключение после получения последней версии лития?

( ! ) Fatal error:
  Uncaught exception 'lithium\template\TemplateException' with message
  'Could not write compiled template
  C:\Users\Master\Documents\Visual Studio 2010\Projects\PSER\PSER/resources/tmp/cache/templates/template_views_pages_index.html_0_1344056913_326.php
  to cache.' in
  C:\Users\Master\Documents\Visual Studio 2010\Projects\libraries\lithium\template\view\Compiler.php
  on line 81

( ! ) lithium\template\TemplateException:
  Could not write compiled template
  C:\Users\Master\Documents\Visual Studio 2010\Projects\PSER\PSER/resources/tmp/cache/templates/template_views_pages_index.html_0_1344056913_326.php
  to cache. in
  C:\Users\Master\Documents\Visual Studio 2010\Projects\libraries\lithium\template\view\Compiler.php
  on line 81

Call Stack

Time Memory Function Location

1 0.1070 331944 {main}( ) ..\index.php:0
2 0.2013 4387040 lithium\action\Dispatcher::run( ???, ??? ) ..\index.php:41
3 0.2013 4388248 lithium\core\StaticObject::filter( ???, ???, ???, ??? ) ..\Dispatcher.php:155
4 0.2013 4389784 lithium\util\collection\Filters::run( ???, ???, ??? ) ..\StaticObject.php:126
5 0.2014 4391752 {closure}( ???, ???, ??? ) ..\Filters.php:183
6 0.2015 4391752 lithium\util\collection\Filters->next( ???, ???, ??? ) ..\cache.php:46
7 0.2015 4391784 {closure}( ???, ???, ??? ) ..\Filters.php:202
8 0.2075 4427760 lithium\util\collection\Filters->next( ???, ???, ??? ) ..\action.php:51
9 0.2075 4427792 lithium\action{closure}( ???, ???, ??? ) ..\Filters.php:202
10 0.2198 4534776 lithium\core\StaticObject::invokeMethod( ???, ??? ) ..\Dispatcher.php:154
11 0.2198 4534808 lithium\action\Dispatcher::_call( ???, ???, ??? ) ..\StaticObject.php:75
12 0.2198 4535896 lithium\core\StaticObject::_filter( ???, ???, ???, ??? ) ..\Dispatcher.php:265
13 0.2198 4536152 lithium\action{closure}( ???, ???, ??? ) ..\StaticObject.php:119
14 0.2198 4536152 lithium\action\Controller->_invoke( ???, ???, ??? ) ..\Dispatcher.php:262
15 0.2199 4537752 lithium\core\Object->_filter( ???, ???, ???, ??? ) ..\Controller.php:198
16 0.2199 4538032 lithium\action{closure}( ???, ???, ??? ) ..\Object.php:238
17 0.2199 4538280 lithium\core\Object->invokeMethod( ???, ??? ) ..\Controller.php:184
18 0.2200 4538312 app\controllers\PagesController->view( ) ..\Object.php:165
19 0.2200 4538824 lithium\action\Controller->render( ??? ) ..\PagesController.php:32
20 0.2204 4541320 lithium\net\http\Media::render( ???, ???, ??? ) ..\Controller.php:266
21 0.2205 4550368 lithium\core\StaticObject::_filter( ???, ???, ???, ??? ) ..\Media.php:593
22 0.2206 4550616 lithium\net\http{closure}( ???, ???, ??? ) ..\StaticObject.php:119
23 0.2208 4553656 lithium\core\StaticObject::invokeMethod( ???, ??? ) ..\Media.php:590
24 0.2208 4553984 lithium\net\http\Media::_handle( ???, ???, ??? ) ..\StaticObject.php:75
25 0.2208 4555936 lithium\core\StaticObject::_filter( ???, ???, ???, ??? ) ..\Media.php:750
26 0.2209 4556184 lithium\net\http{closure}( ???, ???, ??? ) ..\StaticObject.php:119
27 0.2257 4579800 lithium\template\View->render( ???, ???, ??? ) ..\Media.php:746
28 0.2259 4583520 lithium\template\View->_step( ???, ???, ???, ??? ) ..\View.php:328
29 0.2259 4587040 lithium\core\Object->_filter( ???, ???, ???, ??? ) ..\View.php:389
30 0.2260 4587304 lithium\template{closure}( ???, ???, ??? ) ..\Object.php:238
31 0.2260 4587336 lithium\template\view\adapter\File->template( ???, ??? ) ..\View.php:386
32 0.2272 4588624 lithium\template\view\Compiler::template( ???, ??? ) ..\File.php:133

Я почти уверен, что это не проблема с косой чертой (вперед или назад) в пути. Я создал небольшой тестовый скрипт, который доказывает, что прямая и обратная косая черта могут сосуществовать в пути в Windows. В результате путь был:

C:/Users/Master/Documents/Visual Studio 2010/Projects/PHP Prototyping/PHP Prototyping\ABC\testFile.txt

Пример кода ниже:

<?php
    $myFile = $_SERVER['DOCUMENT_ROOT'] . '\\ABC\\testFile.txt';
    $fh = fopen($myFile, 'w') or die('can\'t open file');
    $stringData = 'Bobby Bopper\n';
    fwrite($fh, $stringData);
    $stringData = 'Tracy Tanner\n';
    fwrite($fh, $stringData);
    fclose($fh);
?>

person ton.yeung    schedule 04.08.2012    source источник
comment
Я предполагаю, что Windows задыхается от этих косых черт... это что-то под вашим контролем? Возможно, в новой версии внесены изменения, ломающие ее на Windows?   -  person JMM    schedule 04.08.2012
comment
Косые черты не должны иметь значение. Я бы предположил, что проблема с правами доступа к каталогу. Проверьте разрешения для каталога resources/tmp.   -  person sesser    schedule 04.08.2012
comment
@randy разрешения были установлены для полного контроля для «всех». Ошибка все равно возникает.   -  person ton.yeung    schedule 05.08.2012
comment
@JMM Я мало что могу сделать с косой чертой. Я разрабатываю в Windows, и я развертываю в Linux. Слэши должны оставаться такими, какие они есть.   -  person ton.yeung    schedule 05.08.2012
comment
Хорошо, это не ошибка? Слэши на самом деле работают в Windows? На сервере Linux генерирует ли Lithium пути только с косой чертой или с обратной косой чертой, и если да, то работают ли пути с обратной косой чертой в Linux? Должны ли быть последовательные сегменты PSER пути: \PSER\PSER?   -  person JMM    schedule 05.08.2012
comment
@JMM Я добавил пример того, как косые черты могут сосуществовать в среде Windows. Конечно, фреймворк может делать что-то еще, но чистый PHP может обрабатывать смешанные косые черты. Мой код отлично записал файл.   -  person ton.yeung    schedule 05.08.2012


Ответы (2)


Ваш каталог resources недоступен для записи, поэтому Lithium не может записывать скомпилированные шаблоны в resources/tmp/cache/templates.

РЕДАКТИРОВАТЬ: Дважды проверьте также, что resourcesdirectory существует, так как он не должен быть версионирован в репозитории git.

Вы можете использовать этот фрагмент, чтобы создать его на лету с правильными разрешениями: https://gist.github.com/1009460 (config/bootstrap/libraries.php)

person Mehdi Lahmam B.    schedule 04.08.2012
comment
разрешен полный контроль для «всех». Проблема все еще возникает. - person ton.yeung; 05.08.2012
comment
@mehlah, не могли бы вы обновить свой ответ, включив в него gist.github.com/1009460, чтобы я мог проголосовать ваш ответ и другие могут легко найти решение :) - person Oerd; 08.08.2012
comment
Меняю resources разрешение на 777 и проблема решилась: chmod -R 777 resources - person ; 29.05.2016

Проблема в том, что папки шаблонов под кешем не существовало.

Каталога не существовало, потому что я не добавлял его в систему управления версиями, так как данные под tmp в любом случае не должны переходить от dev к prd. Проблема с записью в кеш шаблонов была всегда, но недавнее изменение фреймворка приводит к тому, что php выдает ошибку вместо черной дыры.

Я добавил некоторый код в template/view/Compiler.php для создания отсутствующего каталога. Первая строка кодового блока имеет номер 68 и не была изменена. Точно так же конечная строка не меняется, поэтому вы можете сравнить то, что было добавлено, с тем, что было раньше.

    $compiled = static::compile(file_get_contents($file));

    $pathIsWritable = is_writable($cachePath);      
    if(!$pathIsWritable){
        $exMessage = ' File not writable. ';
        if(!file_exists($cachePath)) {
            $exMessage .= 'Path to file invalid. ';
            $dirCreated = mkdir($cachePath, 0777, true);

            if($dirCreated) {
                $pathIsWritable = true;
            }
            else {
                $exMessage .= 'Attempt to create the directory path failed.';   
            }
        }           
    }

    if ($pathIsWritable && file_put_contents($template, $compiled) !== false) {
        foreach (glob("{$options['path']}/template_{$oname}_*.php") as $expired) {
person ton.yeung    schedule 06.08.2012
comment
Вместо того, чтобы переопределять код ядра Lithium, вы можете использовать этот фрагмент в своей начальной загрузке gist.github.com/1009460. - person Mehdi Lahmam B.; 06.08.2012
comment
@MehdiLahmamB. Я не уверен, где я должен добавить этот код? Я знаю, вы сказали добавить его в файл начальной загрузки, вы имеете в виду файл начальной загрузки в папке конфигурации? или вы хотите добавить это как файл в папку начальной загрузки и указать ссылку на него в файле начальной загрузки? - person ton.yeung; 07.08.2012
comment
В config/bootstrap/libraries.php сразу после Libraries::add('lithium') и перед добавлением вашего приложения (см. соответствующие строки в сути) - person Mehdi Lahmam B.; 07.08.2012