У одного клиента вдруг не с того не с сего начала падать выгрузка с ошибкой Segmentation fault как известно в выходные системный админов у таймвеба нет(как мне тут подсказали есть ), а проблему решать надо.
данная проблема в основном наблюдается при использовании сервера зенда, а именно его акселератора.
итак, имеем выгрузку запускаемую на кроне и ошибку Segmentation fault
решается все довольно таки просто, коль у нас нет возможности править конфигурационные файлы php будем использовать свой php.ini
создаем файл php.ini с содержанием
[PHP]
date.timezone=Europe/Moscow
max_execution_time = 600
max_input_time = 60
memory_limit = 64M
session.save_path = /tmp
upload_tmp_dir = /tmp
display_errors = On
allow_call_time_pass_reference = On
error_reporting = E_ALL
log_errors = On
post_max_size = 32M
register_globals = On
upload_max_filesize = 20M
теперь в параметре запуска за дания, или просто в консоле добавляем -c путь до нашего php.ini
В тесте Админ Базовый вот в этом ответе забыт предлог "в" <input type="radio" name="answer" value="7139"/> для любой базы данных, если ее поддержка установлена настройках PHP сервера
Необходимо было реализовать функционал отправки электронных ключей в подарок. Т.е. пользоватлеь покупает электронный ключ, оплачивает покупку и во время оплаты указывает дату/время отправки подарка и на какой email отправлять.
Для продажи электронных ключей используется модуль
Вроде все нормально, повешал событие OnBeforeEventSend , в котором хотел отпинывать неактуальные письма до тех пор, пока бы не пришел их час.
Код события довольно простой (SEND_DATE -- свойство в письме, содержащее дату в которую необходимо отправить письмо):
function OnBeforeEventSend($arFields) {
if (empty($arFields['SEND_DATE'])) {
return true;
}
if (strtotime($arFields['SEND_DATE']) <= time()) {
return true;
}
return false;
}
Т.е. если дата отправки не задана, то письмо улетает без проблем. Если дата задана и еще не наступила, то откладываем письмо в недолгий ящик.
И тут пришла она, проблема! В файле /bitrix/modules/main/classes/general/event.php , в функции CEvent::HandleEvent() вызывается обработчик OnBeforeEventSend, но не важно что вернет этот обработчик, письмо отошлется.
Лирическое отступление... Разработчики ядра Битрикс, обращение к вам! Хотелось бы, что бы вы допилили логику отправки event'ов, что бы была реакция на обработчик OnBeforeEventSend .
Теперь расскажу, как я это допилил, в ядре, стыд, да. Но я это делал с надеждой, что в скором времени разработчики ядра исполнят мое пожелание, так как оно вполне логично обоснуемо!
По человечески говоря, если событие вернет false, то письмо не отправляется и статус ему присваевается N , якобы оно еще не отсылалось. Насчет устанавливаемого статуса можно поспорить, конечно, но мне было нужно именно такое поведение .
Изменил немного mysql запросы в функции CheckEvents(), добавив условие
AND (NOW() > ADDTIME(DATE_EXEC, '0:1:0') OR ISNULL(DATE_EXEC)) ORDER BY DATE_EXEC ASC
То есть, если отправка письма еще не запускалась, либо с последней отправки уже прошло 10 минут, причем отправляются сначала письма, которые еще ни разу не пытались отправиться, у них DATE_EXEC NULL и они будут в выборке первыми. Если их не выбирать первыми, то очередь отправки забьется подарочными письмами, если у вас конечно хотя бы не по 10 хитов в минуту и 10 подарочных писем всего, грубо говоря.
Получилось два запроса в итоге.
$strSql=
"SEL ECT 'x' ".
"FR OM b_event ".
"WHERE SUCCESS_EXEC='N' ".
"AND (NOW() > ADDTIME(DATE_EXEC, '0:10:0') OR ISNULL(DATE_EXEC)) ".
"ORDER BY DATE_EXEC ASC " .
"LIMIT 1";
и
$strSql = "
SELECT ID, C_FIELDS, EVENT_NAME, MESSAGE_ID, LID, DATE_FORMAT(DATE_INSERT, '%d.%m.%Y %H:%i:%s') as DATE_INSERT, DUPLICATE
FR OM b_event
WH ERE SUCCESS_EXEC='N'
AND (NOW() > ADDTIME(DATE_EXEC, '0:10:0') OR ISNULL(DATE_EXEC))
ORDER BY DATE_EXEC, ID
LIMIT ".$bulk;
Теперь все прекрасно работает, создается событие через CEvent::Send(), потом неважно где пытается отправиться письмо, вызывается обработчик события OnBeforeEventSend и если он не разрешает отправку письма, то у письма остается статус N, если же обработчик разрешает отправку, то письмо пытается отправиться с обработкой статусов стандартной F,P,0 и так далее. Вот так вот были потрачены часы жизни, что бы подумать как решить без костылей, но нет, в итоге пришлось к ним прибегнуть.
P.S. Повторюсь .
Разработчики ядра Битрикс, обращение к вам! Хотелось бы, что бы вы допилили логику отправки event'ов, что бы была реакция на обработчик OnBeforeEventSend .
Хочу поделиться парой моментов - результат собственного опыта. Потребовалось создать пользовательское свойство с языкозависимыми полями. И еще - создать пользовательское свойство с типом, который описан в моем же модуле.
В целом, задача импорта пользователей из другой системы не такая уж и сложная: достаточно создать CSV-файл со списком пользователей, в котором будут заполнены как минимум поля "NAME" и "LAST_NAME"(). Но есть одна загвоздка: пароли пользователей, в большинстве случаев, хранятся в зашифрованном виде и сохранить эти пароли в базе Битрикса сразу нельзя. Чтобы решить эту задачу, потребуется прибегнуть к небольшой хитрости. Весь процесс можно разделить на 3 шага.
Довольно часто есть желание что-то быстро поправить в произвольном файле продукта через встроенный файловый менеджер. И досадно, когда секундное редактирование может окончиться сбоем в работе какой-то публичной страницы, а ещё хуже - ядра.
Задача: добавить поля "комментарий киента к заказу", "телефон", "название службы доставки", "название способа оплаты", "полный адрес клиента" в шаблон письма-уведомления о новом заказе
Идея решения: 1. Добавляем новые поля в шаблон почтового события SALE_NEW_ORDER. Поля добавляем в текст шаблона в виде
#<имя поля>#
2. Добавляем в систему обработчик события "перед отправкой почтового уведомления о новом заказе". 3. В обработчике события заполняем добавленные в шаблон поля
Решение Шаг 1. Шаблон SALE_NEW_ORDER
В шаблон добавил такой текст
... Контактный телефон: #PHONE# Комментарий: #ORDER_DESCRIPTION# Служба доставки: #DELIVERY_NAME# Способ оплаты: #PAY_SYSTEM_NAME# Адрес доставки: #FULL_ADDRESS# ...
Шаги 2 и 3. Код
в /bitrix/php_interface/init.php
вписал такой код
//-- Добавление обработчика события
AddEventHandler("sale", "OnOrderNewSendEmail", "bxModifySaleMails");
//-- Собственно обработчик события
function bxModifySaleMails($orderID, &$eventName, &$arFields)
{
$arOrder = CSaleOrder::GetByID($orderID);
//-- получаем телефоны и адрес
$order_props = CSaleOrderPropsValue::GetOrderProps($orderID);
$phone="";
$index = "";
$country_name = "";
$city_name = "";
$address = "";
while ($arProps = $order_props->Fetch())
{
if ($arProps["CODE"] == "PHONE")
{
$phone = htmlspecialchars($arProps["VALUE"]);
}
if ($arProps["CODE"] == "LOCATION")
{
$arLocs = CSaleLocation::GetByID($arProps["VALUE"]);
$country_name = $arLocs["COUNTRY_NAME_ORIG"];
$city_name = $arLocs["CITY_NAME_ORIG"];
}
if ($arProps["CODE"] == "INDEX")
{
$index = $arProps["VALUE"];
}
if ($arProps["CODE"] == "ADDRESS")
{
$address = $arProps["VALUE"];
}
}
$full_address = $index.", ".$country_name."-".$city_name.", ".$address;
//-- получаем название службы доставки
$arDeliv = CSaleDelivery::GetByID($arOrder["DELIVERY_ID"]);
$delivery_name = "";
if ($arDeliv)
{
$delivery_name = $arDeliv["NAME"];
}
//-- получаем название платежной системы
$arPaySystem = CSalePaySystem::GetByID($arOrder["PAY_SYSTEM_ID"]);
$pay_system_name = "";
if ($arPaySystem)
{
$pay_system_name = $arPaySystem["NAME"];
}
//-- добавляем новые поля в массив результатов
$arFields["ORDER_DESCRIPTION"] = $arOrder["USER_DESCRIPTION"];
$arFields["PHONE"] = $phone;
$arFields["DELIVERY_NAME"] = $delivery_name;
$arFields["PAY_SYSTEM_NAME"] = $pay_system_name;
$arFields["FULL_ADDRESS"] = $full_address;
}
Полезные ссылки
Прототип кода взял из комментария к статье "Артикул в уведомлении о заказе" Спасибо автору
События интернет-магазина Тут помог раздел "События связанные с отправкой почтовых шаблонов"
Курс разработчика, раздел "Обработка событий"
Документация для разработчика, раздел "Обработка событий"
Доброго дня всем, уважаемые. Сначала я хотел написать это на Хабр. Потом перечитал и понял что не стоит. Пост будет сначала о жизни вообще и добрый, а потом о жизни веб-разработчика на Битриксе и злой:evil:.
Поехали. Я думаю, каждый партнер, развивающаяся и активно работающая студия, проходит несколько стадий своего отношения к компании 1С-Битрикс. Некоторые стадии прошел я, многие проявления этих стадий вижу у других.
Сначала (до инициации) это легкая отрицательная эмоция. Зависть, непонимание, уверенность в плохом, негодование, боязнь мифов.
Потом (первая любовь) это слегка неуверенное применение платформы, первые сайты, первые деньги с продажи коробок, первая продажа в маркетплейсе, приятная и бесплатная помощь битриксоидов разного уровня, первые взаимные претензии и прочее. Это год-два. В это время руководство компании прощупывает Битрикс как бизнес-партнера, считая стоимость владения, изучая рынок труда и сбыта, продумывая перспективность отношений. В это время разработчики ковыряют платформу и попеременно радуются что все уже сделано до них и как оно круто/гибко/просто спроектировано, или ругаются страшными словами, находя какую-нибудь ароматную кучку. Но в целом любовь взаимная, все хорошо. Это ЗЕЛЕНЫЙ ПЕРИОД.
Если честно, от слова "стартап" меня воротит еще со времен когда на Хабре открыли бложики про стартапы, как их поднимать, и как их делать, и каждый в таком бложике старался максимум выложиться, потратив все оплаченное время. Меня тошнит от этого слова. Но у меня просто вопрос - как образуются команды?
Иду по улице возле торгового центра там орёт на всю улицу реклама приятным и соблазнительным голосом женщины лет так 17. По украински. Требуются к нам:
Уборшики
Грузчики
Продавцы
Шоумэны
А я так . И потом иду и думаю - а как же эволюция?
Шесть состояний человека из этих семи могут работать по трём первым профессиям, а седьмая нет. Справедливо это и на оборот - человек седьмой стадии не сможет работать по трём первым профффесиям. Разве не видно, он программирует. По четвёртой же профессии может работать любой человек из выше представленных. Это уже зависит от того сколько он употребляет на душу.
Несогласные - безработные, музыканты, сноубордисты, фетишисты, сведетели Бога, те кто переживал похищения (незаконные;)) инопланетянами и т. п.
Бывает попадается на глаза негативное мнение о Битрикс в сети. И как правило там пару слов, типа Битрикс - это зло, зло в чистом виде. Вся деятельность компании и компаний внедрителей укладывается в одно предложение. Есть вот такие удальцы. Всё они знают, всё у них под контролем.
Все западные технологии и вообще весь научный прог. двигает словянская расса ну и частично евреи подсматривают, славянин же широк в плечах и в душе, а еврей хитер. Просто был период , когда легче было на запад ехать, чем на земле-матушке загинаться. Потому и появились джумлы, вордпрессы и тдп на скороруку написанные. Как только кредиты выплатили , попокупали что хотели, так и перестали разрабатывать эти системы.
А Битрикс развивался уже в более благоприятное время. В период, когда необязательно ехать за бугор. Вот потому и возник такой мощнейший продукт. И главное всё ж по русски написано и разжёвано. Бедняги английский с трёх лет изучают некоторые, вместо того что бы с пацанами мяч гонять. Это уже всё в прошлом. Есть на земле русской продукт офигенный и всё там на родном русском разжёвано.
Итак предлагаю: Ввести понятие несогласных - это люди которые вот делают такое
Давно бились над проблемой с SEO и применением стандартных комплексных компонентов (bitrix:news, bitrix.catalog) при использовании ЧПУ.
Проблема заключалась вот в чем: при отдаче страницы с отсутствующим элементом или секцией инфоблока выставляется статус "404 Not Found" (в теле компонентов bitrix:news.list, bitrix:news.detail, bitrix:catalog.section, bitrix:catalog.element есть соответствующие строки, но к сожалению не было способа показать тело 404-ой страницы (мы обычно создаем страницу /404.php) с ее оформлением и пр.
Поначалу нас устраивал редирект на эту страницу вида:
LocalRedirect("/404.php", "404 Not Found");
но чтобы им воспользоваться приходилось создавать дубликаты компонентов в своем пространстве имен (anima:catalog.section, например).
Речь пойдет об оптимизации выборки элементов со свойствами из подразделов выбранного раздела - задача весьма стандартная. Возможно, это баян (хотя ссылок на подобное не нашел) или уже неактуально в новых версиях, но буду рад, если кому-то будет полезным.
Как правило, при попытке обращения к объекту, который не существует или более неактивен, стандартный компонент Битрикс выводит надпись "Элемент не найден".
Иногда вместо указанной надписи заказчик просит выводить содержимое страницы 404:
При этом, требуется соблюдение следующих условий: сохранение оригинального адреса обращения, установка правильного кода ответа (404) и отсутствие дополнительных перенаправлений (301 или 302). По мнению некоторых специалистов по продвижению, перечисленные требования необходимы для корректной обработки страницы поисковыми роботами.
Существует несколько решений данной задачи. Далее будет рассмотрено, пожалуй, наиболее лаконичное из всех. Единственным обязательным требованием, которое определяет работоспособность результата, является наличие сервера nginx "на входе". При этом, доступ к файлам конфигурации веб-сервера не требуется.
Решение
В файле с обработчиками событий (например, /bitrix/php_interface/init.php) следует разместить следующий обработчик:
define("PREFIX_PATH_404", "/404.php");
AddEventHandler("main", "OnAfterEpilog", "Prefix_FunctionName");
function Prefix_FunctionName() {
global $APPLICATION;
// Check if we need to show the content of the 404 page
if (!defined('ERROR_404') || ERROR_404 != 'Y') {
return;
}
// Display the 404 page unless it is already being displayed
if ($APPLICATION->GetCurPage() != PREFIX_PATH_404) {
header('X-Accel-Redirect: '.PREFIX_PATH_404);
exit();
}
}
Примечания:
Имя функции обработчика следует изменить согласно правилам наименования функций в вашем проекте;
Определение константы, содержащий путь к странице 404 также стоит заменить подходящими значениями.
Пояснения:
Первое условие проверяет наличие и значение константы ERROR_404. Данная константа определяется большинством стандартных компонентов Битрикс в том случае, если не удалось найти объект, к которому произошло обращение. В качестве объекта может выступать, например, элемент информационного блока.
Второе услове позволяет избежать бесконечного зацикливания — как правило, скрипт, отвечающий за вывод страницы 404, тоже устанавливает вышеупомянутую константу. Следующая строка определяет внутреннее перенаправление для nginx. При этом, все происходящее остается незаметным для клиента.
Особое внимание стоит обратить на служебный заголовок "X-Accel-Redirect". Этот заголовок ожидается исключительно веб-сервером nginx и позволяет организовать внутреннее перенаправление из PHP. Как ни странно, информации об этом заголовке в Сети незаслуженно мало: из разумных примеров мне удавалось найти лишь способ построения системы контролируемых скачиваний. На деле же, данный функционал предоставляет возможность для элегантного решения широкого класса задач.
Дополнение:
В начало файла 404.php, до включения urlrewrite.php, разумно добавить следующее условие:
if ($_SERVER['DOCUMENT_URI'] == "/404.php") {
$_SERVER['REQUEST_URI'] = $_SERVER['DOCUMENT_URI'];
}
Данный блок кода позволит избежать бесконечной цикличной переадресации (и ошибки 500) в случаях, когда PHP работает в режиме FastCGI с типовыми настройками, например, через php-fpm. В случае работы через proxy_pass – наиболее частый вариант – проблема не возникает.
Интересно, а кто-нибудь считал бюджет поездки на партнерскую конференцию 1С-Битрикс для партнеров из регионов?
Долететь туда и обратно и Красноярска — 7500 x 2 = 15000р.
Участие в конференции — 2500р.
Гостиница бюджетная подальше от центра — 2150р. * 2 ночи = 4300р.
Питание (в Москве дорогое) — 500р. * 3 раза * 3 дня = 4500р.
Расходы на проезд (такси, метро) — 1000р. (хватит ли ???)
Непредвиденные расходы — +30%
Итого: ~35490р.
При этом материальной выгоды по сравнению с просмотром конференции on-line, для бизнеса никакой. А любое бизнес-предприятие должно окупаться..
Я предлагаю проводить летнюю ПАРТНЕРСКУЮ конференцию в Тайланде — бюджет примерно тот же что и поездка в Москву, но можно совместить с полезным приятное В крайнем случае — Калининград (там тоже есть море..) А в Москве оставить КЛИЕНТСКУЮ партнерскую конференцию
У одного из хостеров лежит у меня кучка доменов Решил как то зайти посмотреть И так и сяк ну - не пускает меня хостер в кабинет Решил пароль восстановить - ни в какую в общем далее проверяю домены - ну нет у них этих доменов Вот жесть то Пошел в ТП пишу и получаю ответ - а ваш аккаунт удален за задолженность ПРИ ТОМ, что все было оплачено по предоплате Много гадал, а оказалось, что на парковке у данного хостера ввели абонплату рубль в месяц ну и наверное как то остаток съелся, а был он несколько рублей после всех операций. но дело не в этом главное, что предупреждений мне никаких не приходило а вот у хостера походу робот оказался шустрый, который тупо удалил все аккаунты с отрицательным балансом
ну а теперь ответ хостера:
Добрый день. К сожалению, аккаунт *** был удален в связи с задолженностью. Аккаунт *** Дата блокировки: 20-08-2011 Дата удаления: 05-10-2011 Долгом: 0.01 руб. домены на аккаунте *** К сожалению, восстановить удаленные аккаунт невозможно.
вот это я понимаю - отжиг проблема конечно решена хостер то в принципе неплохой и ТП мне нравится Но вот такая абсурдность ситуации Что нельзя просто было заблокировать аккаунт? Просто кретинизм какой то Надо удалить без возможности восстановления.
Цена ошибки - копейка Потери - все домены А еще надо подкинуть идею операторам мобильной связи: пусть удаляют телефонные номера без возможности восстановления за неуплату или задолженность вот это наверное будет еще более крутой отжиг.