Что за ошибка «The encoded file is corrupt» после переноса магазина?
Всем здравствуйте.
После переноса на другой домен сайт валится. В логе ошибки такие:
[29-Jan-2015 08:14:32 UTC] PHP Fatal error: The encoded file /home/sitename/public_html/includes/src/Rugento_Ymlpro_Model_Source_Marketcategory.php is corrupt. in Unknown on line 0
[29-Jan-2015 08:15:21 UTC] PHP Fatal error: The encoded file /home/sitename/public_html/includes/src/Rugento_Ymlpro_Model_Source_Marketcategory.php is corrupt. in Unknown on line 0
[29-Jan-2015 08:32:02 UTC] PHP Fatal error: The encoded file /home/sitename/public_html/includes/src/Rugento_Openid_Helper_Data.php is corrupt. in Unknown on line 0
The encoded file /home/sitename/public_html/app/code/local/Rugento/Ymlpro/Model/Source/Marketcategory.php is corrupt.
in Unknown on line 0
Это trace:
write(3, "r\n\0\0\3SELECT count(DISTINCT e.entity_id) FROM `report_event` AS `report_table_views`\n INNER JOIN `catalog_product_entity` AS `e` ON e.entity_id = report_table_views.object_id AND e.entity_type_id = 4\n INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id='1' AND cat_index.visibility IN(2, 4) AND cat_index.category_id='2'\n LEFT JOIN `tj_kupivkredit_product_index` AS `kvki` ON kvki.product_id=e.entity_id WHERE (report_table_views.event_type_id = 1) AND (`e`.`entity_id` IN(553, 281, 282, ....
..., 2678) = 2678
read(3, 0x3177130, 16384) = -1 EINTR (Interrupted system call)
—- SIGTERM (Terminated) @ 0 (0) —-
Подозреваю, что дело может быть вовсе и не в Magento, а что-то при переносе с файлами случилось. Установлемы, помимо всего прочего, три модуля Rugento: OpenID, Yml Pro и ещё какой-то не вспомню сейчас. Чесслово, даже не знаю откуда беда подкралась. Я уже и компиляцию отключил. И кеширование.
Вот что нагуглил:
> To fix this problem, re-upload the liveSite software files in BINARY MODE. https://www.camelback.net/website-builder-kbase-li...
Да, по ссылке речь про левый движок, но это замечание может быть отнесено и к вашему случаю, так как может быть связано с тем, что файл закодирован, и копировать его нужно в BINARY MODE, а не в ASCII.
UPD:
- Так в чем была проблема? Что помогло?
- Пока до конца не выяснил. Возможно как раз из-за неверного RewriteBase. По крайней мере когда его раскомментил, то ничего не падало и в phperrorlog ничего не писалось.
multiscripter: Открыть в текстовом редакторе и посмотреть что отобразиться. Если там не php кода, а какая-то абракадабра, то этот файл закодирован с вероятностью 97%. Правда, закодированные файлы могут подключаться, т.е. файлы, которые указаны в логе ошибок могут быть некодированными, но где-то в коде может быть include или require, который подключает кодированный файл.
multiscripter: Тогда нужно убедиться, что дело в закодированных файлах. Если так, то тогда искать в сторону "проблемы с кодированными через ionCube файлами". Как проверять? Отключить расширения (модули магенты), которые используют эти файлы и убедиться, что без них все ОК.
multiscripter: Да, такой момент. Сравните версии ionCube на новом и старом местах. Они должны совпадать. Если нет, то проблема может быть как раз в том, что модуль и-куба (так и хочется написать суккуба) на новом месте не может декодировать этот файл по причине того, что он не соотв. кодировщику. А на старом месте модуль и-куба соответствовал. Однако, вспоминаю, что вы писали, что хостинг тот же самый, т.е. окружение то же самое, только домен изменился... тогда то, что написано выше, забудьте. Смотрите в сторону привязки этих файлов к полному урлу сайта, т.е. на поддомене или в подпапке работать уже не будет. Для уточнения этой информации лучше писать тому, у кого вы брали эти кодированные файлы.
Что-то я не понимаю логики. Скрипт умирает если ИонКуб загружен?
if (!extension_loaded('ionCube Loader'))
{
$__oc=strtolower(substr(php_uname(),0,3));
$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');
if (function_exists('dl')){ @dl($__ln); }
if (function_exists('_il_exec')){ return _il_exec(); }
$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));
$__here=dirname(__FILE__);
if (strlen($__id)>1&&$__id[1]==':')
{
$__id=str_replace('\\','/',substr($__id,2));
$__here=str_replace('\\','/',substr($__here,2));
}
$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';
$__i=strlen($__rd);while($__i--)
{
if($__rd[$__i]=='/')
{
$__lp=substr($__rd,0,$__i).$__ln;
if (file_exists($__oid.$__lp)){ $__ln=$__lp;break; }
}
}
if(function_exists('dl')) { @dl($__ln); }
}
else { die('The file '.__FILE__." is corrupted.\n"); }
if (function_exists('_il_exec')){ return _il_exec(); }
echo('Site error: the file '.__FILE__.' requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the ionCube Loader Wizard to assist with installation.');
multiscripter: Вы предлагаете разобраться в логике этого кода? Если так, то здесь я вам не помогу. Суть моих соображений в том, что ionCube пытается декодировать файл, который ему не под силу. Если так, то нужно разбираться в том, почему на старом месте - мог, а тут, вдруг, не может. Можно еще обратиться за помощью к разработчику модуля, спросив его, к чему именно привязывается зашифрованный модуль.
Юра Герасименко: ИонКуб не доходит до разбора зашифрованной части скрипта. Он умирает в строке 0: "is corrupt. in Unknown on line 0". Этот код минифицирован в одну строку. Это я уж его переносы расставил.
Юра Герасименко: Всё на том же хостинге в той же папки. Для тестового сайта я создал папку в корне основного и запаролил её. То есть бой: example.com, а тест: example.com/test. Субдомен не делал.
Только сейчас обратил внимание на путь: /home/sitename/public_html/includes/src/Rugento_Ymlpro_Model_Source_Marketcategory.php
Это же путь из папки компиляции... т.е. компиляция не отключена, судя по логу. У вас все строки закомментированы в файле /includes/config.php?
Юра Герасименко: И на бое и на тесте одинаково: #RewriteBase /magento/
Закомментировано. Я для теста вносил правки в .htaccess, но это не трогал.
На бое всё лежит в папке publc_html.
multiscripter: Тестовый сайт в папке publc_html/test? Тогда пропишите для тестового RewriteBase /test/, т.е. раскоментируйте строку и измените путь по умолчанию. Что будет?
Юра Герасименко: Прописал. Надо тестить. Походил по страницам. Вроде всё норм. Но так и на бое норм. Валилось когда стали подключать ещё один модуль, который как-то взаимодействует с модулями Rugento.
Юра Герасименко: Пока до конца не выяснил. Возможно как раз из-за неверного RewriteBase. По крайней мере когда его раскомментил, то ничего не падало и в phperrorlog ничего не писалось.