+ .htaccess, как описал выше Роман Семёнов. Но проблема не ушла.
Написал в техподдержку, там мне посоветовали проверить, будет ли скрипт отрабатывать не с крона, а на хитах пользователей. Выставил агенты на хиты, и при обновлении страницы увидел наконец долгожданную ошибку:
Это значит, что объект $USER все - таки отсутствует. И т.к. его нет, то при попытке вызвать $USER->GetUserGroupArray() скрипт падал, а я не мог понять, в чем дело
Код
// применяем к цене скидку
$arDiscounts = \CCatalogDiscount::GetDiscountByProduct(
$arField['ID'],
$USER->GetUserGroupArray(), // тут то скрипт и запинался
"N",
1
);
До этого, по совету Евгения Жукова, я вставлял код в файл cron_events.php, и это тогда не помогло (к сожалению не как он советовал, "внутри агента (в самом начале)"):
Код
global $USER;
$USER = new CUSer();
Но, как пояснил сотрудник техподдержки:
Цитата
Перед запуском агента объект $USER удаляется, после выполнения агента он создается. Это сделано специально, чтобы не было дыр в безопасности сайта. Вы можете в вашем агенте создать объект $USER. Примерно так:
Код
global $USER;
if(!is_object($USER)) $USER = new CUser;
Но кто ж знал, что $USER удаляется, потом создается...это мне и в голову не могло прийти) В итоге заменил $USER->GetUserGroupArray() на массив array(2), и все заработало как и должно. Всем спасибо за помощь!
Дмитрий Козлов: Скорей всего не авторизован пользователь. Попробуйте авторизовать пользователя или сделать инфоблоки, используемые в скрипте доступными для всех
В кроне скрипт запускается от какого пользователя? Того же что и сайт? Если не поможет, попробуйте на локалке запустить в ide с отладчиком
Ответ: скрипт работает с данным инфоблоком, выполняются выборки CIBlockSection::GetList и CIBlockElement::GetList, но до $APPLICATION->IncludeComponent(). От вызовов компонентов я избавился, но та же беда всплыла теперь при получении скидки(писал об этом выше). Но на всякий случай попробовал $USER->Authorize(1), также делал доступным для всех инфоблок, не помогло. Дело еще в том, что сайт на виртуальном хостинге, рута нет. Крон запускался видимо от юзера, соответствующего аккаунту на reg.ru, где сайт и хостится. Крон выставляю через isp панель в соответствующем разделе данной панели. Ну а как настроить отладчик в ide на локали, чтобы выставить крон, и отлавливать с него ошибки - я к сожалению не знаю. Использую phpStorm. Если это возможно, и поможете - буду признателен!)
Создал объект $USER = new CUSer() после подключения пролога в файле cron_events.php, но ничего не изменилось. Так вышло, что я задублировал данный топик на соседнем клиентском форуме, там мне советовали:
Цитата
Роман Семёнов подобные скрипты битрикс и другие сложные CMS в кроне лучше запускать через curl/wget чтобы окружение соответствовало. запуск через командную строку имеет проблемы т.к. не установленны различные переменные $_SERVER $_REQUEST и т.п., настройки могут отличатся от версии для веб-сервера.
Цитата
Цитата
Иван Ганцев написал: На сервере файл error_log не содержит ошибок, хоть я и пытался через .htaccess
Для этого соответственно я вынес файл cron_events.php в публичный каталог /cron, т.к. раньше он лежал по адресу /bitrix/modules/main/tools/cron_events.php, и для запуска через wget был недоступен. Данный крон отрабатывает, отбойки в виде логов создаются раз в минуту. Но теперь перестали запускаться события агентов. Выставляю с запасом время следующего запуска агента вручную с учетом текущего серверного времени, и ничего не происходит. Зато появился глобальный объект $USER, а также переменная окружения $_SERVER. Ну и т.к. агенты не запускаются из под wget почему - то, соответственно ошибок тематических в error.log тоже нет. В какую сторону еще посоветуете копнуть, товарищи?
Да, действительно, при распечатывании глобального объекта $USER в файл, если скрипт запущен был с браузера вручную - то объект пишется в файл. А если скрипт запущен с агента - то вместо распечатанного объекта CUser в файл записался мой логин ftp. Скажите, а можно как - нибудь вручную ему подсунуть данный объект? От вызовов компонентов внутри выборки и формирования xml я избавился. Да вот только теперь те же симптомы при применении к цене скидки методом \CCatalogDiscount::GetDiscountByProduct().
Есть агент, создающийся другим агентом раз в сутки. Его цель - сформировать поэтапно xml файл выгрузки элементов инфоблока, т.е. он будет возвращать сам себя с периодом в 60 сек. до тех пор, пока не пройдет все разделы и элементы инфоблока. Сам метод содержит в себе вызов компонента $APPLICATION->IncludeComponent(...); Если запускаю метод вручную с браузера - отрабатывает на ура. Но если запускается именно через механизм агента, который в свою очередь запускается на кроне, то скрипт работает до строчки вызова данного компонента. На сервере файл error_log не содержит ошибок, хоть я и пытался через .htaccess выставить подробное логирование ошибок: php_value display_errors 1 php_value error_reporting E_ALL php_value display_startup_errors 1 php_value display_errors on К php.ini доступа нет. Поэтому отладку вел путем записи собственных меток в лог файл. И эти метки уже не пишутся при входе в компонент, ну и после него соответственно. Пролог подключен непосредственно в файле cron_events.php. Кто - нибудь сталкивался с подобным поведением? В документации ничего не нашел по поводу запуска компонентов через агенты на кроне