Обратился клиент с проблемой следующего рода
Корректная последовательность вызовов
$IBLOCK_TYPE_ID = "altasib_feedback_".substr(md5(time()),0,3);
CModule::IncludeModule("iblock");
$arFields = array("ID" => $IBLOCK_TYPE_ID,
"LANG" => array ("ru" => array (
"NAME" => "feedback",),
"en" => array ("NAME" => "feedback",)
),
"SECTIONS" => "Y");
$obBlocktype = new CIBlockType;
if(!CIBlockType::GetByID($IBLOCK_TYPE_ID)->Fetch())
$IBLOCK_TYPE_ID = $obBlocktype->Add($arFields);
$arSites = Array();
$obSites = CSite::GetList();
while($arSite = $obSites->Fetch())
$arSites[] = $arSite["ID"];
$ib = new CIBlock;
$arFieldss = Array(
"NAME" => "GuestBook",
"CODE" => "altasib_guestbook",
"IBLOCK_TYPE_ID" => $IBLOCK_TYPE_ID,
"SITE_ID" =>$arSites,
);
if($ID = $ib->Add($arFieldss))echo "Ok!";
else
echo $ib->LAST_ERROR;
|
При этом проблема характерна только для сервера где установлен ZendOptimizer+
При диагностики было установлено, что проблема кроется в участке кода
... if(!CIBlockType::GetByID($IBLOCK_TYPE_ID)->Fetch()) $IBLOCK_TYPE_ID = $obBlocktype->Add($arFields); ... ... $ID = $ib->Add($arFieldss) ... |
В итоге диагностики было установлено, что проблема в последовательном вызове метода GetByID() в рамках одного хита, при наличии ZendOptimizer+ и включенном управляемом кэше .
(второй вызов GetByID() осуществляется в методе CheckFields() который находится в методе Add())
Проблема в zend сервере и в функции accelerator_reset(), которая является своего рода отложенной
(
Note: This is not an immediate action. The shared memory storage is reset when a request arrives while the shared memory storage is not being used by a script.
)
и не позволяет механизму управляемого кеша в ряде случаев корреткно обрабатывать файлы кэша (удалять и создавать их) в рамках одного хита
(ситуация, которая происходит при вызове одной функции два раза подряд в данном случае GetById() ).
Данной проблемы не замечено на при использовании GetList() т.к. используется два разных файла кэша формируемых методом GetList() и метода GetByID(), вызывающегося в методе Add().
Обойти проблему можно используя для проверки ID типа ИБ метод CIBlockType::GetList() с последующим вызовом $obBlocktype->Add() либо в dbconn.php определить константу
define("CACHED_b_iblock_type",false); |
Учитывайте данную особенность при разработке своей логики.
Были ли получены тексты самих ошибок ?