תארו לעצמכם חנות מקוונת שמקבלת מחירונים מ-20 ספקים בפורמטים CSV, XML ו-HTML. עדכון ידני של 50,000 פריטים מדי יום מוביל לשגיאות בלתי נמנעות ולכפילויות שגורמות לאובדן מכירות. אנחנו פותרים את זה – אנו מפתחים פארסר ב-PHP המשולב ב-1C-Bitrix, אשר שולף נתונים אוטומטית מכל מקור וטוען אותם לבלוקי מידע. פארסר PHP עבור Bitrix מהיר פי 2 מפתרון Python בשל גישה ישירה ל-API. צרו קשר – נבחן את המשימה תוך יום עסקים אחד.
במשך חמש שנים, יישמנו יותר מ-20 פרויקטי פארסינג עבור Bitrix. כל פארסר מותאם למשימה ספציפית: בין אם טעינת 10,000 מוצרים מ-CSV או איסוף נתונים מתריסר אתרי מתחרים. אנו משתמשים ב-PHP כי זו השפה הטבעית עבור Bitrix. הפארסר יכול לעבוד ישירות עם ה-API של בלוקי המידע, ללא REST או תורי ביניים. זה מפחית את המורכבות ומאיץ את הפיתוח פי 2–3 בהשוואה למערכות היברידיות. למשימות שאינן דורשות רינדור JavaScript, PHP היא הבחירה הטובה ביותר.
ארכיטקטורה של פארסר PHP
הפארסר מורכב מארבעה רכיבים:
-
הגדרת מקור. מערך או טבלת מסד נתונים עם פרמטרים לכל מקור: URL, סוג (RSS, HTML, API), בוררי CSS לחילוץ נתונים, מיפוי שדות, תדירות עדכון.
-
לקוח HTTP. למשימות פשוטות – cURL דרך
CHttpClientמליבת Bitrix אוcurl_multiמקורי לבקשות מקבילות. למשימות מורכבות – Guzzle עם middleware לניסיונות חוזרים, רישום, סיבוב פרוקסי. מידע נוסף על בקשות מקבילות בתיעוד PHP. -
פארסר HTML/XML.
DOMDocument+DOMXPathלניווט DOM מדויק. עבור בוררי CSS – ספרייתSymfony\Component\DomCrawler. עבור RSS –SimpleXMLElement. -
מייבא. שכבה לכתיבת נתונים לבלוקי מידע של Bitrix דרך API D7 או ה-API הישן (
CIBlockElement).
איך להאיץ פארסינג פי 10?
צוואר הבקבוק העיקרי של פארסר PHP הוא בקשות רציפות. טעינת 1,000 עמודים ב-2 שניות כל אחד = 33 דקות. עם curl_multi, ניתן לטפל ב-10–20 בקשות במקביל:
$multiHandle = curl_multi_init();
$handles = [];
foreach ($urls as $i => $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_multi_add_handle($multiHandle, $ch);
$handles[$i] = $ch;
}
do {
$status = curl_multi_exec($multiHandle, $active);
curl_multi_select($multiHandle);
} while ($active > 0);מגבלה: יותר מ-50 חיבורים מקבילים – ו-PHP מתחיל לצרוך יותר מדי זיכרון. לפארסינג בקנה מידה גדול (10,000+ URLs), חלקו לקבוצות של 20–30 חיבורים.
אינטגרציה עם ליבת Bitrix
היתרון של פארסר PHP הוא גישה ישירה ל-API. אין צורך ב-REST או במסד נתוני ביניים. ייבוא לבלוקי מידע:
$element = new CIBlockElement();
$elementId = $element->Add([
'IBLOCK_ID' => IBLOCK_CATALOG,
'NAME' => $parsedData['title'],
'XML_ID' => $parsedData['external_id'],
'ACTIVE' => 'Y',
'PREVIEW_TEXT' => $parsedData['description'],
'DETAIL_TEXT' => $parsedData['content'],
'DETAIL_TEXT_TYPE' => 'html',
'PREVIEW_PICTURE' => CFile::MakeFileArray($parsedData['image_path']),
]);
if ($elementId) {
CIBlockElement::SetPropertyValuesEx($elementId, IBLOCK_CATALOG, [
'SOURCE_URL' => $parsedData['url'],
'ARTICLE' => $parsedData['sku'],
]);
}חשוב: במהלך ייבוא המוני, השבתו חיפוש ועדכון URL:
CIBlockElement::DisableEvents(); // Отключает обработчики событий ללא זה, כל $multiHandle = curl_multi_init(); $handles = []; foreach ($urls as $i => $url) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_multi_add_handle($multiHandle, $ch); $handles[$i] = $ch; } do { $status = curl_multi_exec($multiHandle, $active); curl_multi_select($multiHandle); } while ($active > 0); מפעיל אינדוקס מחדש של חיפוש, עדכוני אינדקס פנים ושאר handlers – ייבוא 10,000 מוצרים ייקח שעות.
קראו עוד על עבודה עם אירועים.
טיפול בשגיאות ועמידות
פארסר PHP בסביבת ייצור חייב לטפל ב:
- פסקי זמן – השרת לא מגיב, החיבור נתקע. הגדירו
$element = new CIBlockElement(); $elementId = $element->Add([ 'IBLOCK_ID' => IBLOCK_CATALOG, 'NAME' => $parsedData['title'], 'XML_ID' => $parsedData['external_id'], 'ACTIVE' => 'Y', 'PREVIEW_TEXT' => $parsedData['description'], 'DETAIL_TEXT' => $parsedData['content'], 'DETAIL_TEXT_TYPE' => 'html', 'PREVIEW_PICTURE' => CFile::MakeFileArray($parsedData['image_path']), ]); if ($elementId) { CIBlockElement::SetPropertyValuesEx($elementId, IBLOCK_CATALOG, [ 'SOURCE_URL' => $parsedData['url'], 'ARTICLE' => $parsedData['sku'], ]); }ו-CIBlockElement::DisableEvents(); // Отключает обработчики событий. - שגיאות HTTP – 403, 429, 503. עבור 429 (הגבלת קצב) – הגדילו את ההשהיה. עבור 403 – החליפו פרוקסי. עבור 503 – נסו שוב מאוחר יותר.
- HTML לא תקין –
Add()מייצר אזהרות. דכאו עםCURLOPT_TIMEOUTאוCURLOPT_CONNECTTIMEOUT, אבל רשמו URLs בעייתיים. - מיצוי זיכרון – דפי HTML גדולים (5+ MB) צורכים זיכרון. הגדירו
DOMDocument::loadHTMLכראוי ושחררו DOM לאחר העיבוד:@.
תבנית ניסיון חוזר עם השהיה אקספוננציאלית:
function fetchWithRetry(string $url, int $maxRetries = 3): ?string {
for ($i = 0; $i < $maxRetries; $i++) {
$response = @file_get_contents($url);
if ($response !== false) {
return $response;
}
sleep(pow(2, $i)); // 1, 2, 4 секунды
}
return null;
} שגיאות נפוצות ואסטרטגיות טיפול
| סוג שגיאה | אסטרטגיה |
|---|---|
| פסק זמן חיבור | נסו שוב לאחר 5 שניות, עד 3 ניסיונות |
| HTTP 429 (יותר מדי בקשות) | הגדילו את ההשהיה בין בקשות, השתמשו בפרוקסים |
| HTTP 403 (אסור) | שנו User-Agent, פרוקסי, אימות |
| HTTP 503 (שירות לא זמין) | נסו שוב עם השהיה אקספוננציאלית |
| HTML לא תקין | הפעילו libxml_use_internal_errors, רשמו URL |
| חריגה מ-memory_limit | חלקו לקבוצות, שחררו DOM |
רישום
ללא לוגים, ניפוי באגים בפארסר הוא בלתי אפשרי. סט מינימלי של אירועים לרישום:
- התחלה וסיום של סשן פארסינג (זמן, מספר URLs שעובדו).
- כל בקשת HTTP: URL, סטטוס תגובה, זמן טעינה.
- שגיאות פארסינג: URL, סוג שגיאה, הקשר.
- תוצאת ייבוא: נוצר, עודכן, דולג (כפילויות), שגיאות.
השתמשו ב-libxml_use_internal_errors(true) מ-D7 או כתבו לטבלת memory_limit נפרדת.
השוואה: PHP לעומת Python לפארסינג
| קריטריון | פארסר PHP | פארסר Python |
|---|---|---|
| אינטגרציה עם Bitrix | קריאת API ישירה (ללא REST) | דרך REST – איטי ב-20-30% |
| רינדור JS | לא (HTML בלבד) | כן (Puppeteer, Playwright) |
| נפח מקסימלי לסשן | עד 50,000 עמודים | עד 500,000 (אסינכרוני) |
| מהירות פיתוח מאפס | 5-10 ימים | 7-14 ימים (שילוב שתי מערכות) |
מתי PHP לא מספיק
פארסר PHP אינו מתאים כאשר:
- נדרש רינדור JavaScript – אתרי SPA, טעינת תוכן דינמית. כאן נדרש דפדפן headless (Puppeteer/Playwright), כלומר Node.js או Python.
- נפח הפארסינג עולה על 50,000 עמודים לסשן – PHP נתקל במגבלות עם single-threading וצריכת זיכרון.
- נדרש עיבוד טקסט מורכב (NLP, סיווג, חילוץ ישויות) – המערכת האקולוגית של Python עשירה בהרבה.
במקרים אלה, שקלו גישה היברידית: Python/Node.js לאיסוף נתונים, PHP לייבוא ל-Bitrix.
שלבי פיתוח פארסר
- ניתוח מקור – קביעת מבנה נתונים, פורמט, תדירות עדכון.
- עיצוב ארכיטקטורה – בחירת סכמת פארסינג, מקביליות, אסטרטגיית טיפול בשגיאות.
- יישום – כתיבת קוד PHP, אינטגרציה עם בלוקי מידע ומערכות חיצוניות.
- בדיקות – בדיקות עומס עם נתונים אמיתיים, סימולציית תקלות.
- תיעוד ומסירה – תיאור ארכיטקטורה, מדריך הפעלה, הדרכת מפתחים.
מה אתם מקבלים
- פארסר עובד המשולב במופע 1C-Bitrix שלכם.
- תיעוד מלא והערות קוד.
- אחריות ל-3 חודשים על ביצועי הפארסר לאחר מסירת הפרויקט.
- תמיכה חינם לאחר הפרויקט.
פיתוח פארסר PHP עולה פי 2 פחות מפתרון היברידי Python+Node.js, והתחזוקה זולה פי 3 כי כל הלוגיקה נמצאת במערכת אחת.
הזמינו פיתוח פארסר – אנו מבטיחים תוצאות ותיעוד מלא. פנו אלינו ונחבר אתכם למהנדס שיעבור על המשימה.

