Обратился клиент с проблемой следующего рода
Корректная последовательность вызовов
$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); |
Учитывайте данную особенность при разработке своей логики.
Были ли получены тексты самих ошибок ?