טיפים לאופטימיזציה של D7 ORM ובדיקת מהירות לאתרי ביטריקס

אתר Bitrix רץ לאט בגלל שאילתות ORM לא יעילות שיוצרות עומס ועיכובים נוספים. אנחנו מבצעים ביקורת ואופטימיזציה של שאילתות D7, מבטלים בעיות N+1 ומגדירים מטמון. הצוות שלנו מספק את הפרויקט במפתח מלא—מניתוח ועד יישום—ומבטיח ביצועים יציבים ותמיכה מתמשכת.
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
טיפים לאופטימיזציה של D7 ORM ובדיקת מהירות לאתרי ביטריקס
בינוני
~1-2 שבועות

הכישורים שלנו:

שאלות נפוצות

טיפים חיוניים לאופטימיזציית מהירות של Bitrix D7 ORM

D7 ORM הוא מיפוי האובייקטים-רלציונליים של ליבת Bitrix החדשה. עם ניסיון של 10+ שנים, ראינו פרויקטים שבהם שאילתה אחת רשלנית מוסיפה 5 שניות לטעינת העמוד. טעות אופיינית היא SELECT * עם שלושה JOINs מיותרים — בקטלוג גדול, זה 500 אלפיות שנייה במקום 10 אלפיות שנייה. לאחר אופטימיזציית שאילתות ORM בפרויקט אחד, זמן יצירת העמוד ירד מ-3 שניות ל-300 אלפיות שנייה (שיפור של 90%). לעיתים קרובות זה דורש רק הסרת N+1 ושדות מיותרים.

אילו בעיות ORM נפוצות משפיעות על הביצועים?

ORM קורא את תיאור הטבלה משיטת getMap(). לדוגמה, \Bitrix\Iblock\ElementTable משתמש ב-getMap() כדי להגדיר שדות ויחסים. בקשת IBLOCK.NAME מוסיפה LEFT JOIN שלעיתים קרובות מיותר. תמיד בדוק את ה-SQL שנוצר דרך b_iblock.

בעיית N+1 מתרחשת בעת שימוש ב-IBLOCK_ID. כל גישה לישות קשורה מפעילה שאילתת SQL חדשה:

// Плохо: N+1 запросов
foreach ($elements as $element) {
    echo $element->getSection()->getName(); // дополнительный запрос на каждый элемент!
}

// Правильно: подгружаем секции сразу
$result = \Bitrix\Iblock\ElementTable::getList([
    'select' => ['ID', 'NAME', 'IBLOCK_SECTION_ID', 'SECTION_' => 'IBLOCK_SECTION.NAME'],
    'filter' => ['=IBLOCK_ID' => 5],
]);

הסרת N+1 מפחיתה שאילתות מ-1001 ל-1, ומקצרת את זמן טעינת העמוד פי 2-5.

כיצד לבצע אופטימיזציה של select ולהשתמש בשדות Runtime?

תמיד ציין במפורש $query->getQuery(). השמטה שלו בוחרת את כל 20+ השדות מ-fetchObject(), כולל // Плохо: N+1 запросов foreach ($elements as $element) { echo $element->getSection()->getName(); // дополнительный запрос на каждый элемент! } // Правильно: подгружаем секции сразу $result = \Bitrix\Iblock\ElementTable::getList([ 'select' => ['ID', 'NAME', 'IBLOCK_SECTION_ID', 'SECTION_' => 'IBLOCK_SECTION.NAME'], 'filter' => ['=IBLOCK_ID' => 5], ]); (פוטנציאלית מגה-בייטים).

$result = \Bitrix\Iblock\ElementTable::getList([
    'select' => ['ID', 'NAME', 'PREVIEW_PICTURE_ID', 'DETAIL_PAGE_URL'],
    'filter' => ['=IBLOCK_ID' => 5, '=ACTIVE' => 'Y'],
    'order' => ['SORT' => 'ASC'],
    'limit' => 20,
]);

שדות Runtime מאפשרים חישובים בצד ה-SQL. לדוגמה, חישוב מחיר מוזל:

use Bitrix\Main\Entity;
$result = \Bitrix\Iblock\ElementTable::getList([
    'select' => ['ID', 'NAME', 'PRICE_VALUE'],
    'runtime' => [
        new Entity\ReferenceField(
            'PRICE',
            \Bitrix\Catalog\PriceTable::class,
            ['=this.ID' => 'ref.PRODUCT_ID', '=ref.CATALOG_GROUP_ID' => new Entity\ExpressionField('PTYPE', '1')],
            ['join_type' => 'LEFT']
        ),
        new Entity\ExpressionField('PRICE_VALUE', '%s', ['PRICE.PRICE']),
    ],
    'filter' => ['=IBLOCK_ID' => 5],
]);

זה מונע עיבוד PHP לאחר מכן ומשפר את המהירות. למעשה, שימוש בשדות Runtime הוא לעיתים קרובות מהיר פי 5 מחישובי PHP מקבילים.

טיפול במערכי נתונים גדולים וקאש

אל תטען את כל השורות לזיכרון; השתמש בעיבוד אצווה:

$offset = 0;
$limit = 500;
do {
    $result = SomeTable::getList([
        'select' => ['ID', 'NAME'],
        'limit' => $limit,
        'offset' => $offset,
        'order' => ['ID' => 'ASC'],
    ]);
    $rows = $result->fetchAll();
    foreach ($rows as $row) {
        // обработка
    }
    $offset += $limit;
} while (count($rows) === $limit);

לפיצ'ינג עמוק, פיצ'ינג עם סמן לפי ID (select) מהיר עד 60% יותר.

ל-D7 ORM יש קאש מובנה:

$result = \Bitrix\Iblock\ElementTable::getList([
    'select' => ['ID', 'NAME'],
    'filter' => ['=IBLOCK_ID' => 5, '=ACTIVE' => 'Y'],
    'cache' => [
        'ttl' => 3600,
        'cache_joins' => true,
    ],
]);

הקאש מתאפס אוטומטית כאשר הנתונים משתנים דרך ORM. עבור SQL ישיר, אפס ידנית.

רשימת בדיקה שלב אחר שלב לאופטימיזציית ORM

  1. זהה שאילתות איטיות באמצעות SqlTracker ופרופילר Bitrix.
  2. בדוק הגדרות getMap() כדי להבין יחסים.
  3. החלף לולאות ElementTable בשאילתות JOIN באמצעות סימון נקודה.
  4. ציין במפורש רק את השדות הדרושים ב-DETAIL_TEXT.
  5. המר חישובי PHP מורכבים לשדות Runtime.
  6. הפעל קאש ORM עבור שאילתות המבוצעות בתדירות גבוהה.
  7. יישם פיצ'ינג אצווה או סמן עבור מערכי נתונים גדולים.
  8. בדוק ותעד את שיפורי הביצועים.

תבניות ביצועים ופתרונות

שיטה ביצועים מורכבות מתי להשתמש
Join דרך select גבוהים נמוכה כאשר נדרשים שדות קשורים רבים
FetchObject + נפרד נמוכים (N+1) נמוכה רק עבור רשומות בודדות
שדות Runtime גבוהים בינונית חישובים מורכבים
שאילתה נפרדת עם קאש בינוניים בינונית יחסים בשימוש נדיר
בעיה ביטוי פתרון
SELECT * ללא צורך עומס רשת/DB גבוה $result = \Bitrix\Iblock\ElementTable::getList([ 'select' => ['ID', 'NAME', 'PREVIEW_PICTURE_ID', 'DETAIL_PAGE_URL'], 'filter' => ['=IBLOCK_ID' => 5, '=ACTIVE' => 'Y'], 'order' => ['SORT' => 'ASC'], 'limit' => 20, ]); מפורש
N+1 עם fetchObject() שאילתות קטנות רבות טעינה דרך JOIN
OFFSET על טבלאות גדולות פיצ'ינג עמוק איטי פיצ'ינג עם סמן
אין קאש על שאילתות תכופות פניות DB חוזרות הפעל קאש ORM
חישובי PHP עומס נוסף השתמש בשדות Runtime

מה כולל שירות אופטימיזציית שכבת ORM

אנו מציעים ביקורת ואופטימיזציה מקיפה של שאילתות ORM. בעת הזמנה, אתה מקבל:

  • דוח ניתוח שאילתות SQL מפורט באמצעות SqlTracker ופרופילר.
  • רשימת צווארי בקבוק שזוהו: SELECTs מיותרים, JOINs, בעיות N+1.
  • קוד שאילתות מותאם עם הגדרת קאש (הצעות TTL).
  • המלצות לאופטימיזציית פיצ'ינג (אצווה/סמן).
  • תיעוד מלא של השינויים עם מדדי ביצועים לפני/אחרי.
  • הדרכת מפתחים על שיטות עבודה מומלצות ב-D7 ORM.
  • תמיכה ל-30 יום דרך Slack או דוא"ל.
  • גישה לצוות שלנו לשאלות המשך.

תוצאה מובטחת: לפחות 30% שיפור במהירות, בדרך כלל 50-90% בעמודים כבדים.

לוח זמנים: 1-2 שבועות. עלות: ביקורת מ-$500, אופטימיזציה מלאה מ-$2000. לקוח טיפוסי חוסך מעל $10,000 בשנה בעלויות אירוח. במקרה אחד, חסכנו ללקוח $15,000 בשנה לאחר האופטימיזציה. בנוסף, לקוח אחר חסך $12,000 בהוצאות שרת לאחר ביקורת דומה.

ויקיפדיה: מיפוי אובייקטים-רלציונלי מספק רקע.

הצוות שלנו של מומחי 1C-Bitrix מוסמכים השלים מעל 100 פרויקטים. אנו מכירים את נבכי D7 ORM ומוצאים צווארי בקבוק שמנתחים סטטיים מפספסים. הזמן ביקורת שכבת ORM היום.