هذا هو الجزء الرابع من سلسلة مساند. تناول الجزء الثالث مزامنة LDAP والصلاحيات.
كل قصة تكامل في هذه السلسلة تبدأ بالجملة نفسها: البيانات التي نحتاجها تعيش في مكان لم يُدعَ PHP إليه. وبالنسبة للقسائم — السجلات خلف إحدى أبرز ميزات مساند — كان ذلك المكان هو Oracle.
سلسلة الاعتمادات التي لا يحذرك منها أحد
ربط PHP بـ Postgres أو MySQL تثبيت حزمة بسطر واحد. أما ربط PHP بـ Oracle فطقس عبور. السلسلة كالتالي: Laravel يحتاج امتداد oci8؛ وoci8 لا يُترجم دون Oracle Instant Client؛ وInstant Client ليس في أي مدير حزم تستمتع باستخدامه. إنه تنزيل من موقع Oracle (مع قبول الترخيص)، ومجموعة ملفات مضغوطة تُفك في مسار لا يعرفه الرابط الديناميكي، ما يعني ضبط ldconfig أو LD_LIBRARY_PATH، إضافة إلى ترويسات التطوير لمرحلة الترجمة — وإصدار Instant Client المحدد يجب أن يتفق مع إصدار PHP ومع خادم قاعدة البيانات في الطرف الآخر.
أخطئ في أي حلقة من هذه السلسلة وستجد رسائل خطأ عديمة الفائدة بشكل مذهل. خسرت أيامًا حقيقية في هذا. والمعاناة ليست تكلفة لمرة واحدة: كل خادم جديد يحتاج الطقس نفسه، وهو — كما سأغطي في المقال الأخير — أحد أسباب تجهيزي الحالي لصور Docker تتضمن Instant Client لمنصة OpenShift، ليحدث الطقس مرة واحدة في Dockerfile بدلاً من كل يوم نشر.
عندما لا يكفي المُعرّف: أكثر من مليوني سجل
بعد أن عمل oci8، كانت الاستعلامات العادية على ما يرام — عمليات البحث والتصفية ومسارات القراءة اليومية. المشكلة كانت في المعالجة الضخمة. مجموعة بيانات القسائم تجاوزت مليوني سجل وُزّعت على بائعي الطرف الثالث، وبعض العمليات كانت تحتاج المرور على المجموعة كاملة. سحب ملايين الصفوف عبر مُعرّف PHP، وتحميلها في الذاكرة، ومعالجتها صفًا صفًا لن يصل أبدًا إلى أزمنة معالجة مقبولة — فتكلفة PHP لكل صف مضروبة في الملايين هي بالضبط الحساب الذي لا تريده.
الحل كان التوقف عن معاملة Oracle كمخزن أصم، والبدء بمعاملته كالمحرك الفائق القدرة الذي هو عليه فعلاً. للعمليات الثقيلة، يستدعي مساند SQL*Plus — عميل Oracle السطري نفسه، الذي يأتي مع Instant Client أصلاً. النمط: توليد الـ SQL، ثم تنفيذه عبر SQL*Plus حيث يجري العمل داخل قاعدة البيانات بسرعة أصلية، ثم استهلاك النتيجة الموجزة. ما كان سيصبح زحفًا طويلاً عبر حلقة PHP أصبح عملية سريعة متوقعة داخل القاعدة.
بدا الأمر قديم الطراز تقريبًا — تطبيق Laravel حديث يفوّض أداة سطر أوامر من زمن آخر. لكن الهندسة ليست نقاءً جماليًا. كان SQL*Plus أسرع مسار موثوق للعمل الضخم، وكان موجودًا على الخادم أصلاً، وتغليفه في صنف خدمة (المزيد عن هذا النمط في الجزء السادس) أبقى بقية الكود في جهل سعيد بطريقة صنع الحل.
ما كنت سأقوله لنفسي في الماضي
أتمت إعداد Instant Client من اليوم الأول. اكتبه سكربتًا أو ضعه في حاوية؛ ولا تفعله يدويًا مرتين.
طابق الإصدارات قبل تصحيح أي شيء آخر. معظم أعطال oci8 «الغامضة» خلافات إصدارات متنكرة.
ادفع العمل الضخم داخل قاعدة البيانات. المُعرّف للمحادثات؛ وهو الأداة الخاطئة لنقل البضائع.
أخفِ الآلية خلف حدود واضحة. المستدعون يطلبون النتائج؛ وصنف واحد فقط يعرف بوجود SQL*Plus.
التالي في السلسلة: فصل MSSQL — بيانات عملاء الفايبر، وملحمة مُعرّف ثانية بشخصية مختلفة.
اترك تعليقاً
لن يتم نشر عنوان بريدك الإلكتروني.