Страница 1 из 1

Сохранение конфигурации в 5.7 (PHP 5.5)

СообщениеДобавлено: 06 окт 2014, 11:47
cmsservice
Столкнулись с одной не очень понятной проблемой: при попытке сохранить настройки в 5.7 (например кеширование) они не сохраняются.

Анализ показал что в процессе сохранения настроек кеширования (и не только, например с отладкой то же самое) происходит последовательное сохранение в файле конфигурации /application/config/generated_overrides/concrete.php заданных значений.

При этом алгоритм сохранения устроен так:
  1. загружается файл конфигурации (это массив php), в который будет сохраняться параметр;
  2. в загруженном массиве ищется параметр и меняется его значение, если же параметра нет, то добавляется;
  3. файл сохраняется на диск.
Так вот, после сохранения первого параметра мы его видим в файле на диске, после сохранения первого параметра в файл, мы также его видим в файле, но первого там уже нет. При сохранении третьего, также пропадает второй и т.д. Может быть кто-то сталкивался уже с такой проблемой? Пытаюсь понять это у нас проблема или стоит уже багу зарепортить, да и приступить к поиску решений.

PS: Вообще в коде множество проблем, множество E_NOTICE и E_STRICT. Например, при попытке получить значение $_POST используя метод контроллера post(), система улетает в собственный обработчик ошибок с E_NOTICE поскольку метод Request::post не объявлен статическим, естественно нужное нам значение мы не получаем. К промышленной эксплуатации система пока не готова, печаль :(

Re: Сохранение конфигурации в 5.7 (PHP 5.5)

СообщениеДобавлено: 06 окт 2014, 17:19
Count_Raven
Пока особо не заморачивался, поэтому не могу ничего сказать по данному вопросу.

Re: Сохранение конфигурации в 5.7 (PHP 5.5)

СообщениеДобавлено: 16 окт 2014, 18:12
cmsservice
Проверили на 5.4, - все ок.
Таким образом в PHP 5.5 Concrete5 5.7 не полностью работоспособна. Почему, придется еще разобраться.

Re: Сохранение конфигурации в 5.7 (PHP 5.5)

СообщениеДобавлено: 16 окт 2014, 23:52
cmsservice
Проблема обнаружена!

Дело в том, что в PHP 5.5 включена система кеширования байткода OPcache. А так как конфигурация в 5.7 хранится в php фйлах, а не в БД (как в 5.6), то при последовательном сохранении нескольких значений в настройках он просто не успевает понять что файл был изменен и всегда отдает первоначальную версию конфига. В итоге имеем коллизию. По этому поводу даже есть бага
Пожалуйста зарегистрируйтесь, чтобы увидеть ссылку


Решается проблема либо принудительным отключением OPcache в php.ini (плохой способ), либо внесением изменений в метод save класса Concrete\Core\Config\FileSaver с целью перечитывания кэша. Например, в конце метода инлайновый возврат результата заменить на такой код:
Код: Выделить всё
$retval = $this->files->put($file, $rendered) !== false;
if(
function_exists('opcache_invalidate')) opcache_invalidate($file);
return $retval; 


Завтра зарепорчу багу в багтрекер Concrete5.

Re: Сохранение конфигурации в 5.7 (PHP 5.5)

СообщениеДобавлено: 17 окт 2014, 15:26
Count_Raven
Спасибо за информацию. Учтём.

Re: Сохранение конфигурации в 5.7 (PHP 5.5)

СообщениеДобавлено: 17 окт 2014, 15:35
cmsservice
В коде, который скоро станет 5.7.1 уже внесены изменения, но там ИМХО они криво сделали, типа если файл есть, то сохраняют конфиг во временный файл, потом из него грузят в объект и временный файл убивают.
Пожалуйста зарегистрируйтесь, чтобы увидеть ссылку


Я думаю значительно продуктивнее и быстрее определить что opcache присутствует в исполняющей среде и вызвать очистку кэша для отдельно взятого файла.