Skip to main content
Laravel هو إطار عمل ويب بلغة PHP يتضمن أداة مدمجة لربط الكائنات بقواعد البيانات (Eloquent)، ونظامًا لعمليات الترحيل (migrations)، وأداة سطر الأوامر artisan. في هذا الدليل، ستربط تطبيق Laravel جديدًا بخدمة ClickHouse Managed Postgres، وتنشئ جدول tasks عبر عملية ترحيل، ثم تعرض صفوفه من خلال مسار (route). تستخدم جميع الاتصالات بروتوكول TLS مع تحقق كامل من الشهادة.

المتطلبات الأساسية

  • PHP 8.3 أو إصدار أحدث، وهو ما يتطلبه Laravel 13، مع تثبيت الامتداد pdo_pgsql. شغّل الأمر php -m وتحقّق من ظهور pdo_pgsql في القائمة.
  • Composer
  • حساب على ClickHouse Cloud
  • psql، لإنشاء قاعدة البيانات. ويمكنك بدلًا من ذلك تشغيل عبارة CREATE DATABASE في SQL console.

إنشاء خدمة ClickHouse Managed Postgres

في وحدة تحكم ClickHouse Cloud، انقر على New service ثم اختر Postgres. سيصبح المثيل جاهزًا في غضون دقائق قليلة. للاطلاع على شرح تفصيلي للخطوات، راجع دليل البدء السريع.

الحصول على بيانات الاتصال

انقر على Connect في الشريط الجانبي الأيسر لخدمتك. تعرض النافذة المنبثقة اسم المستخدم وكلمة المرور والخادم والمنفذ، وتتضمن مفتاح تبديل بين Directly وvia PgBouncer. لا يحتفظ تطبيق PHP بمجمّع اتصالات بين الطلبات، إذ يفتح كل طلب افتراضيًا اتصالًا جديدًا بـ Postgres ويغلقه عند انتهائه. يربط هذا الدليل التطبيق عبر PgBouncer المضمَّن على المنفذ 6432، لكي تتشارك هذه الاتصالات قصيرة العمر عددًا محدودًا من عمليات Postgres الخلفية. أما عمليات الترحيل فتتصل بـ Postgres مباشرةً على المنفذ 5432، لأنها تنفّذ أوامر DDL وقد تُبقي معاملات طويلة مفتوحة. اختر via PgBouncer لعرض بيانات الاتصال عبر المجمّع. سيتغير المنفذ إلى 6432، وستتضمن سلاسل الاتصال sslmode=verify-full. في النافذة المنبثقة نفسها، انقر على Download CA certificate. ويمكنك أيضًا تنزيلها من Settings → CA Certificate. هذه الشهادة فريدة لمثيلك، ما يتيح للمشغّل استخدامها للتحقق من أنه يتصل بخادمك فعلًا.

إعداد المشروع

أنشئ مشروع Laravel:
هل تضيف إلى تطبيق موجود؟تخطَّ composer create-project. في مشروعك، تحقّق من أن pdo_pgsql يظهر ضمن مخرجات php -m، ثم اتبع بقية هذا القسم وانتقل بعدها إلى تهيئة الاتصال، إذ تنقل هذه الخطوة التطبيق من SQLite إلى Postgres. بعد ذلك، ينشئ الأمر php artisan migrate جداولك الحالية في Postgres، لكنه لا ينسخ البيانات من SQLite.
انقل شهادة CA التي نزّلتها إلى دليل المشروع، وأعد تسميتها إلى ca-certificate.pem. أنشئ قاعدة بيانات للتطبيق. استبدل <PASSWORD> والمضيف بالقيم الظاهرة في نافذة Connect:

تهيئة الاتصال

يستخدم Laravel قاعدة بيانات SQLite افتراضيًا. افتح الملف .env واستبدل السطر DB_CONNECTION=sqlite وأسطر DB_ المعطَّلة بعلامة التعليق أسفله بما يلي:
.env
استخدم المسار المطلق للملف ca-certificate.pem، إذ تحلّ libpq المسار النسبي انطلاقًا من دليل العمل الخاص بعملية PHP، وهذا الدليل يتوقف على طريقة تشغيل PHP لتطبيقك. إذا كانت كلمة المرور تحتوي على مسافات أو على الرمز #، فضعها بين علامتي اقتباس مزدوجتين. واحرص على إبقاء الملف .env خارج نظام التحكم في الإصدارات. يقرأ اتصال pgsql الافتراضي في config/database.php القيمة DB_SSLMODE، لكنه لا يقرأ مسار شهادة CA. لذا افتح config/database.php وأضف العنصرين sslrootcert وoptions إلى الاتصال pgsql:
config/database.php
يُلحق Laravel المعاملين sslmode وsslrootcert بسلسلة DSN الخاصة بـ PDO، ثم يمرّرهما الامتداد pdo_pgsql إلى libpq، الذي يتحقق بدوره من سلسلة الشهادات ومن اسم المضيف. يجعل الخيار PDO::ATTR_EMULATE_PREPARES مكتبة PDO ترسل كل استعلام وقيمه مربوطة به مسبقًا، بدلًا من إنشاء عبارة مُعدّة مسبقًا على جانب الخادم. فعّل هذا الخيار عند الاتصال عبر PgBouncer؛ إذ عندما يكون pdo_pgsql مبنيًا على الإصدار 16 من libpq أو ما قبله، كما هو الحال في Debian 12، تحرّر PHP كل عبارة مُعدّة مسبقًا باستخدام عبارة SQL DEALLOCATE. ولأن PgBouncer يعيد تسمية العبارات المُعدّة مسبقًا على الخادم، تفشل عبارة DEALLOCATE. وإذا وقع ذلك داخل معاملة، أُلغيت المعاملة، وفشل الاستعلام التالي مع الخطأ current transaction is aborted. أما مع الإصدار 17 من libpq أو ما بعده، فتعمل الإعدادات الافتراضية كذلك. نفّذ الأمر php -i | grep libpq لمعرفة الإصدار المثبّت لديك. تحقّق من الاتصال:
في غياب السطر sslrootcert، يفشل الوضع verify-full بالرسالة root certificate file ".../.postgresql/root.crt" does not exist، لأن libpq يلجأ إلى موقع CA الافتراضي الخاص به. أما عند استخدام CA غير صحيحة، فيفشل الاتصال بالرسالة SSL error: certificate verify failed.

إنشاء نموذج وملف ترحيل

أنشئ نموذج Eloquent وملف ترحيل للجدول tasks:
افتح ملف الترحيل الجديد في database/migrations/ (ينتهي اسمه بـ _create_tasks_table.php)، ثم أضف العمودين title وdone إلى الدالة up:
database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php
استبدل محتوى الملف app/Models/Task.php بما يلي، بحيث يمكن تعيين قيم الأعمدة دفعةً واحدة (mass assignment) وتُعاد قيمة done كقيمة منطقية (boolean):
app/Models/Task.php
شغّل عمليات الترحيل عبر الاتصال المباشر. تُقدَّم قيمة متغير البيئة على القيمة الموجودة في .env، لذا يكفي أن تغيّر المنفذ فقط:
إلى جانب tasks، يُنشئ هذا الأمر جداول users وsessions وcache وjobs التي يستخدمها أي تطبيق Laravel جديد افتراضيًا. ويسجّل Laravel عمليات الترحيل المُطبَّقة في الجدول migrations، فلا يشغّل في الاستدعاءات اللاحقة إلا عمليات الترحيل الجديدة.

الاستعلام من قاعدة البيانات

أضف بضعة صفوف باستخدام Eloquent من خلال artisan tinker:
أضف في نهاية الملف routes/web.php مسارًا يُعيد جميع المهام بتنسيق JSON:
routes/web.php
يطبّق Laravel خيارات الاتصال search_path وtimezone وisolation_level عند الاتصال باستخدام عبارات SET على مستوى الـ session، ولا تُحفَظ هذه الإعدادات بين المعاملات عند المرور عبر PgBouncer. لذا أبقِ هذه الخيارات على قيمها الافتراضية، أو اتصل مباشرةً عبر المنفذ 5432 إذا كنت بحاجة إليها. كذلك لا تعمل عبر PgBouncer الميزاتُ المعتمدة على الـ session، مثل LISTEN والأقفال الاستشارية (advisory locks) على مستوى الـ session. راجع الأسئلة الشائعة.

التشغيل والتحقق

شغّل خادم التطوير:
افتح http://localhost:3104/tasks في متصفحك، وستظهر لك استجابة مشابهة لما يلي:
لعرض البيانات في وحدة التحكم، افتح SQL console من الشريط الجانبي الأيسر لخدمتك، ثم وسّع guide_laravel ثم public، وانقر على الجدول tasks. يتضمن المخطط public أيضًا جداول Laravel الافتراضية، مثل users وsessions وmigrations:

الخطوات التالية