تصفح نتائج فحص الروابط الخلفية للـ URL دون فجوات أو حلقات لا نهائية
عدد الصفوف في كل طلب، الصفحات في كل استعلام، وحد أقصى صارم عند 50,000. إليك حلقة تحترم الثلاثة شروط وتعلمك متى تتوقف.

تعود ما يصل إلى 1,000 صف في كل طلب. يتم احتساب كل طلب مرة واحدة، بغض النظر عن عدد الصفوف التي يحملها. يتم تقييد التصفح العميق عند 50,000 صف، وهو ما يعادل 50 طلبًا بحجم 1,000 صف لكل منها.
لماذا يأتي الترتيب قبل الترقيم
يظهر التكرار عند التصفح فوق قائمة غير مرتبة. أرسل دائمًا sort و order مع page و per، بحيث تعني الصفحة 3 الشيء نفسه في كل طلب خلال التنفيذ.
سحب refdomains يكلف 2 رصيد في كل طلب، لذا فإن 50 طلبًا تصل إلى 100 رصيد، أو سنت واحد. حتى في أسوأ الحالات، التكلفة رخيصة؛ التكلفة الحقيقية هي حلقة لا تنتهي.
اختيار عمود الترتيب
يعتمد العمود الذي يتم الترتيب بناءً عليه على السؤال المطروح. يعد الترتيب من الأكبر إلى الأصغر هو الاختيار المعتود لعمليات التدقيق، لأن الحد الأقصى يقطع الذيل الطويل بدلاً من الجزء الذي يهمك.
ترتب حسب حقل لا معنى له لسؤالك، وقد يزيل الحد الأقصى الصفوف التي تريدها. اسحب عشرة صفوف لكل ترتيب مرشح أولاً وشاهد أي شريحة تنجو من الحد الأقصى.
اكتب الاختيار في التقرير، حتى يعرف الشخص التالي سبب سقوط الحد الأقصى حيث وقع.
السجلات التي تتحرك أثناء التنفيذ
لا تتحرك البيانات أثناء التنفيذ ما لم يحدث التحديث الشهري في منتصفه. نادر، لكنه حقيقي. يمكن أن يؤدي مهمة ليلية تتقاطع مع بداية الشهر إلى إرجاع صفحة من الفهرس القديم والأخرى من الفهرس الجديد، لذا سجل وقت البدء في سجلك وقارن.
اكتب وقت البدء في أعلى السجل ورقم الصفحة في كل سطر. بعد ذلك، يشير التباين في المخرجات إلى التوقيت، وليس إلى خطأ في التفسير.
إذا كانت المهمة مجدولة، تجنب وقت البدء مباشرة قبل تحديث متوقع. تظهر سجلاتك التحديث كتحول في الإجماليات بين تشغيلين يتطابقان في غير ذلك، لذا احتفظ بالإجماليات في كل سطر سجل.
التنفيذ الذي يتقاطع مع تحديث ليس خاطئًا بشكل افتراضي. إنه فقط غير متسق، لذا ضع علامة على تلك التشغيلات في السجل وأعد تشغيل الشريحة المتأثرة عندما يكون ذلك مهمًا لتقرير.
حلقة ترقيم تتوقف
TypeScript لـ Node 20 worker. تتوقف عند أول صفحة قصيرة، أو عند الحد الأقصى، أو عند أي ok غير صحيح.
const BASE = "https://seomasters.dev/api.php";
const CAP = 50_000;
const PER = 1000;
export async function pullAll(domain: string, key: string) {
const rows: unknown[] = [];
for (let page = 1; rows.length < CAP; page++) {
const u = new URL(BASE);
u.search = new URLSearchParams({
action: "refdomains", q: domain,
page: String(page), per: String(PER),
sort: "dr", order: "desc",
}).toString();
const res = await fetch(u, { headers: { Authorization: `Bearer ${key}` } });
if (res.status === 401 || res.status === 402) throw new Error(`stop: HTTP ${res.status}`);
const body = await res.json();
if (!body.ok) throw new Error(JSON.stringify(body).slice(0, 300));
const chunk = findRows(body); // see note below
rows.push(...chunk);
if (chunk.length < PER) break; // short page means we are done
}
return rows;
}استكشاف أخطاء تنفيذ الترقيم
| ما تراه | السبب المحتمل | ما يجب فعله |
|---|---|---|
| الصفحة 51 تعود فارغة أو تحتوي على أخطاء | لقد وصلت إلى حد 50,000 | ضيّق النطاق باستخدام إجراء آخر أو sort مختلف، ثم ادمج حسب المعرف |
| نفس النطاق في صفحتين | استعلام غير مرتب، أو إعادة بناء الفهرس أثناء التنفيذ | أرسل sort و order؛ قم بإزالة التكرار على مفتاح النطاق |
| صفوف أقل من الإجمالي المعروض في لوحة التحكم | الإجمالي الخاص بالرسوم البيانية الكاملة، والسحب محدود | إظهار "أعلى 50,000" في واجهة المستخدم |
| الحلقة لا تنتهي أبدًا | فحص الشروط rows.length فقط | كسر الحلقة عند صفحة قصيرة، كما هو موضح أعلاه |
| الفاتورة أعلى من المتوقع | إعادة المحاولة في كل حالة غير 200 | أعد المحاولة فقط في أخطاء الشبكة، انظر الأخطاء |

قراءة الصفوف دون تخمين أسماء الحقول
تم ترك مساعد findRows أعلاه مفت عمدًا. قم بإجراء طلب حقيقي واحد، انظر إلى JSON، واكتب المصلح بناءً على ما تراه بدلاً من ما وعدت به الدروس التعليمية.
للنسخة الأرخص من هذا العمل، وهي تقييم العديد من النطاقات في وقت واحد دون أي ترقيم على الإطلاق، اقرأ سكربت DR الضخم.
تجميد استجابة واحدة كملف ثابت
ثم جمّدها باختبار. احفظ استجابة واحدة كملف ثابت وقم بالتحقق من عدد الصفوف ومفتاح الصف الأول، بحيث يفشل التغيير المستقبلي في CI وليس في رسم بياني لعميل.
احتفظ بالملف الثابت في التحكم بالإصدارات بجانب الاختبار، حتى يرى المراجع الشكل الذي يتوقعه الكود دون تشغيل أي شيء.
عندما تضيف API حقلًا لاحقًا، يخبرك فرق الملف الثابت عما إذا كان المصلح قد لاحظها أو تجاهلها بصمت.
سمِّ الملف الثابت بناءً على الاستعلام الذي جاء منه، مثل الإجراء، والنطاق والترتيب. ملف يسمى response1.json لا يخبر القارئ التالي شيئًا عما يثبت.
عد الصفوف التي قمت بتخزينها
قارن الصفوف التي حفظتها مع الإجمالي الذي أبلغت عنه الحلقة. الفجوة تعني أن صفحة تم إسقاطها، والتكرار يعني أن صفحة تم جلبها مرتين وتمت إضافتها كصف واحد.
قم بتشغيل هذا التحقق بعد كل سحب اختبار، وليس فقط بعد الأول. الانحراف في العدد هو عادةً العرض الأول لتغير الترتيب أو تحديث يهبط في منتصف التنفيذ.
احتفظ بالعدد في نفس سطر السجل ورقم الصفحة، بحيث يمكن قراءتهما معًا في لمحة.
تقسيم العمل فوق الحد الأقصى
بعض الأسئلة تتجاوز الحد الأقصى. للقوائم فوق السقف، قم بتقسيم المشكلة بدلاً من التصفح بقوة أكبر. اسحب أفضل 50,000 بترتيب واحد، ثم اسأل إجراءات أخرى عن النقاط الثقيلة، نظرًا لأنها تكلف 2 رصيد أيضًا وتجب إجابات مختلفة. التصفح بقوة أكبر لا يتجاوز أبدًا نقطة القطع.
اسحب أفضل 50,000 بترتيب واحد
خذ الحد الأقصى كحقيقة في API. اسحب أفضل 50,000 صف بترتيب واحد، احفظها وسمِّ النتيجة كشريحة علوية في أي تقرير.
لوحة تحكم تعرض عددًا محدودًا وكأنه الإجمالي الكامل تضلل القراء. التكلفة لا شيء، وتقرير فحص الروابط الخلفية للقراءة يكون أكثر صدقًا معه.
قرر حجم الشريحة قبل التنفيذ واكتبه في رأس التقرير، حتى لا يبدو الرقم أكبر مما هو عليه. سطر الرأس لا يكلف شيئًا، والقارئ الذي يجد صفًا مفقودًا لاحقًا سيشكرك على ذلك.
اسأل النقاط الثقيلة سؤالاً مختلفًا
تجيب anchors و toppages عن أسئلة أخرى، مثل أي نص ربط يهيمن أو أي صفحات تجذب الروابط. بالنسبة لنطاق يتجاوز الحد الأقصى، يمكن أن تكون هذه الإجابات أكثر أهمية من الصفحة التالية من القائمة نفسها.
احتفظ بنتائجها في جداولها الخاصة، والمفاتيح حسب النطاق، بحيث يمكن استبدال سحب لاحق لنفس النطاق لها دون لمس صفوف الشريحة العلوية.
كل إجراء إضافي يكلف مخصصاته الخاصة، لذا اسعره قبل التنفيذ، وليس بعد وصول الفاتورة.
قائمة قصيرة لأثقل النطاقات، المسحوبة مرة واحدة شهريًا، غالبًا ما تعطي سياقًا أكثر فائدة من قائمة أطول مسحوبة كل ليلة.
الدمج على مفتاح النطاق
عندما يتداخل سحبان، ادمجهما على مفتاح النطاق واحتفظ بالطابع الزمني الأحدث. ثم لا يعتمد الدمج أبدًا على أي سحب انتهى أولاً.
سجل أي سحب فاز بكل صف. إذا تحرك رقم بين تقريرين، يخبرك السجل عما إذا كان الفهرج أو الدمج قد تغير.
احتفظ بالدمج في دالة واحدة مع اختبار، لأنه المكان الوحيد الذي يلتقي فيه سحبان.
استئناف بعد الانهيار
الانهيارات تحدث. إعادة تشغيل النشر للـ worker، أو نوم الكمبيوتر المحمول، أو انقطاع VPN، وتموت الحلقة في الصفحة 31 من 50.
احفظ الصفحة بعد كل طلب
أرشف رقم الصفحة الأخير المكتمل بعد كل طلب. أعد التشغيل من ذلك الرقم زائد واحد، وليس من الأعلى، وتدفع مقابل 2 رصيد لكل صفحة بدلاً من إعادة شراء السحب بالكامل.
احفظه بعد تحليل الاستجابة، وليس قبلها. صفحة لم تنجح في قراءتها يجب جلبها مرة أخرى، ورقم الصفحة المحفوظ يجب أن يعني دائمًا الصفوف التي لديك.
الحفظ الذي يحدث مرة في الدقيقة بدلاً من مرة في الطلب يترك نافذة حيث يمكن للانهيار تكرار إنفاق الرصيد. اجعل الكتابة صغيرة، بحيث تكون رخيصة للقيام بها في كل مرة.
سجل المدة التي يستغرقها كل حفظ وكذلك المدة التي يستغرقها كل طلب. الحفظ الذي يضاهي الطلب نفسه يشير إلى طبقة التخزين، وهذا يستحق الإصلاح قبل نمو الحلقة.
إضافة أو تحديث على مفتاح النطاق
احتفظ بكتابة متطابقة. أضف أو حدّث كل صف على مفتاح النطاق الخاص به، بحيث تترك صفحة جلبت مرتين صفًا واحدًا، وليس اثنين.
استخدم المفتاح نفسه في كل مسار كتابة، بما في ذلك نص الإصلاح اليدوي. مسارين للكتابة بمفتاحين هما كيف تبقى التكرارات بعد الاستئناف.
غالبًا ما يُكتب نص الإصلاح في عجلة من أمره، بعد فشل التنفيذ. هذا هو الوقت الذي يتسلل فيه مفتاح ثانٍ، لذا راجعه بعناية مثل الحلقة الرئيسية.
رفض الاستئناف عندما يتغير الترتيب
سجل الترتيب والترتيب جنبًا إلى جنب مع رقم الصفحة. إذا غير شخص ما sort بين انهيار وإعادة التشغيل، لم يعد رقم الصفحة المحفوظ يعني نفس الشريحة. ارفض الاستئناف وابدأ نظيفًا.
احفظ سجل استئناف صغير مع الترتيب، والترتيب، والصفحة والوقت. تقرأ الحلقة ذلك السجل أولاً، وترفض الاستمرار إذا لم يتطابق أي حقل مع الطلب الذي ستقوم به.
الاستئناف المرفوض ليس فشلًا. إنه الحلقة تقول إن الصفحة المحفوظة لم تعد تعني الصفوف نفسها، والبدء نظيفًا هو الخطأ الأرخص.
تشغيل الحلقة في الإنتاج
- 1
ابدأ بنطاق صغير
شغل الحلقة ضد نطاق يحتوي على بضع مئات من الصفوف، بحيث تنطلق توقف الصفحة القصيرة وتشاهد مسار الخروج يعمل.
- 2
تحقق من صفحة بعينك
افتح استجابة واحدة محفوظة وتأكد من أن المصلح لا يزال يقرأ الصفوف. لا تثق في تحليل لم تنظر إليه.
- 3
احتفظ بالحدود في الإعدادات
ضع الحد الأقصى وحجم الصفحة في ملف إعداد واحد، حتى يظهر التغيير في المراجعة ولا يختبئ داخل دالة.
- 4
سجل سبب انتهاء الحلقة
سجل ما إذا كان التشغيل انتهى على صفحة قصيرة، أو على الحد الأقصى، أو على خطأ. هذه النهايات الثلاثة تعني أشياء مختلفة لمن يقرأ السجل.