Задать вопрос
@Ewig23

Как заставить собственную функцию в Битриксе работать из-под крона?

Возник затык с работой собственной функции с запуском из крона.

Эта функция обновляет кастомную валюту, которая привязана к курсу доллара (округляет текущий курс доллара до целого значения).

Проблема в том, что из командной php строки функция работает отлично, а вот при запуске из крона не работает вообще: курс не создается и не обновляется.

Обнаружил что не срабатывает API-метод CCurrencyRates::GetList. При дальнейшем изучении кода метода (файл bitrix/modules/currency/general/currency_rate.php) ввыяснилось, что проблема в методе
CharToDateFunction
в фрагменте кода
$DB->CharToDateFunction($DB->ForSql($val), "SHORT")


Файл метода CharToDateFunction: bitrix/modules/main/classes/general/database.php

Вот эта строка дает ошибочный формат даты:
$format = ($strType == "FULL" ? $culture->getFormatDatetime() : $culture->getFormatDate());


Из командной php строки она выдает DD.MM.YYYY

Из агента она выдает MM/DD/YYYY

Формат даты берется из переменной $culture, а сама переменная $culture задается в методе таким образом: $culture = $context->getCulture()
И уже из $culture агент на кроне берет дату в таком формате, что метод CCurrencyRates::GetList не может работать.
То есть при запуске из крона создается некорректная переменная $context и далее $culture.
Техподдержка Битрикса кивает на хостинг, а хостинг кивает на техподдержку Битрикса.
Как можно исправить данный момент?
  • Вопрос задан
  • 98 просмотров
Подписаться 1 Средний 5 комментариев
Пригласить эксперта
Ответы на вопрос 2
t-alexashka
@t-alexashka
Сразу пишу legacy код
У вас скорее всего настройки даты в php.ini разные для cli и web версии, т.к. для cli и web используются разные php.ini.

Вижу 2 варианта:

1. Найти настройку формата даты в php.ini CLI версии, и сделать её аналогичной в web версии
2. Принудительно переопределить настройку вверху выполнения метода через ini_set() функцию.
Ответ написан
а Вы константы бойлерплейта прописали? Если нет, то будут проблемы разного вида. Я использую такой:
<?php
define("SITE_ID", "s1"); // ID сайта, настройки которого будут применены
define("NO_KEEP_STATISTIC", true);
define('NO_AGENT_CHECK', true);
define("NOT_CHECK_PERMISSIONS", true);
define("BX_BUFFER_USED", true);

$_SERVER["DOCUMENT_ROOT"] = $DOCUMENT_ROOT = realpath( тут надо прописать корректное значение );

require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
// дальше пошёл код
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы