انتقل إلى المحتوى

مقدمة

Phasis محرك PHP JavaScript خالص. يحلل ECMAScript المعجمي والنحوي وينفذه في عملية المضيف PHP — دون exec('node …') أو FFI أو امتداد ثنائي مخصص. يتطلب ثلاثة امتدادات PHP قياسية: ext-mbstring وext-bcmath وext-curl (وسيلة النقل الافتراضية fetch()). أما ext-intl وext-openssl فاختياريان. راجع البدء للاطلاع على إصدارات لا تتضمن bcmath.

  • قابل للتضمين — أضف بيئة تشغيل JS إلى أي تطبيق PHP أو إطار عمل أو أداة CLI عبر الفئة Phasis\Engine.
  • متوافق مع المواصفات — يجتاز مجموعة الاختبارات الرسمية test262 بنسبة 100%، في جميع الفئات ومن دون تخطي أي اختبار.
  • واجهات ويب API — حزمة Web Platform كاملة (URL وTextEncoder/Decoder وatob/btoa وstructuredClone وperformance وDOMException)، وحزمة Fetch كاملة (fetch وRequest وResponse وHeaders وBody وAbortController/Signal وBlob وFile وFormData وEventTarget وWHATWG Streams بالكامل وnavigator)، إضافة إلى crypto وSubtleCrypto وWebSocket وXMLHttpRequest وحلقة أحداث حقيقية. تجتاز 100% من اختبارات Web Platform المستوردة.
  • واجهة حديثة — دوال السهم والفئات وasync/await وPromises والمولدات وSymbol وBigInt وProxy وReflect وTemporal وIntl وTypedArrays ودعم كامل للوحدات.
  • التشغيل البيني بين PHP وJS — مرّر القيم الأولية والمصفوفات PHP إلى JS (تُنسخ المصفوفات)، واربط إغلاقات PHP كدوال JS، واستدعِ دوال JS من PHP. لا يمكن مشاركة كائنات PHP مع JS بعد؛ راجع الكائنات المشتركة.

لماذا وُجد Phasis

عادةً ما تلجأ تطبيقات PHP التي تحتاج إلى تشغيل JavaScript يقدمه المستخدم — مثل محركات القوالب ووسائط SSR للواجهة الأمامية وقواعد التحقق من البيانات وعوازل المحتوى ومشغلات الاختبارات بلا واجهة — إلى تشغيل Node.js كعملية خارجية أو تتخلى عن الميزة. يضيف كلا الخيارين تعقيدًا تشغيليًا: بيئة تشغيل ثانية، وحدًا فاصلًا للتسلسل، وشبكة من قنوات العمليات الفرعية، وتعقيدات عند النشر على الاستضافات المشتركة.

يسد Phasis هذه الفجوة. يمكن لشيفرة PHP الخاصة بك تحليل JavaScript معجميًا ونحويًا وتنفيذها باستخدام PHP 8.2+ فقط، مع mbstring وbcmath وcurl. تُوزّع بيئة المحرك كحزمة Composer وتوفر واجهة API صغيرة موحدة.

ما الذي يقدمه

  • ينفذ مكتبة ECMAScript القياسية كاملة: Array وString وObject وMath وJSON وDate وRegExp وMap وSet وPromise وProxy وReflect وSymbol وBigInt وTypedArray وTemporal وIntl والمولدات والمكررات غير المتزامنة والوحدات.
  • تتضمن واجهات Web Platform التي تتحقق منها مكتبات JS الفعلية مسبقًا: URL وURLSearchParams وTextEncoder/TextDecoder وatob/btoa وstructuredClone وperformance وDOMException. راجع واجهات الويب للاطلاع على الواجهة كاملة.
  • تتضمن fetch مع عائلة Fetch كاملة — Request وResponse وHeaders ومستهلكات الجسم وAbortController/AbortSignal وBlob وFile وFormData وEventTarget/Event وWHATWG Streams كاملة (ReadableStream وWritableStream وTransformStream وBYOB واستراتيجيات وضع البيانات في الطابور). تعمل HTTP الحقيقية فورًا عبر PHP وext-curl الخاصتين بها.
  • تتضمن crypto وSubtleCrypto كاملة (عائلة SHA وHMAC وAES-GCM/CBC/CTR وRSA-OAEP/PSS/PKCS1 وECDSA وECDH وHKDF وPBKDF2)، و WebSocket (RFC 6455 مع وسيلة نقل قابلة للتبديل)، و XMLHttpRequest (مبنية على وسيلة النقل نفسها التي تستخدمها fetch).
  • تتضمن حلقة أحداث حقيقية: setTimeout وsetInterval وclearTimeout وclearInterval وqueueMicrotask، إضافة إلى AsyncContext من المرحلة 3 لتمرير القيم عبر الحدود غير المتزامنة.
  • تدعم الصياغة الحديثة — التفكيك وspread/rest والخصائص المحسوبة والتسلسل الاختياري ودمج القيم الفارغة والقوالب النصية والقوالب الموسومة والفئات (بما فيها الحقول الخاصة والكتل الساكنة والمزخرفات) وawait على المستوى الأعلى.
  • تحوّل القيم عبر الحد الفاصل بين PHP وJS. تُنسخ القيم الأولية والمصفوفات إلى الداخل، وتصبح الدوال القابلة للاستدعاء في PHP دوال JS، وتعود نتائج JS كقيم أولية ومصفوفات PHP. راجع تحويل القيم للاطلاع على القواعد الدقيقة.
  • يعمل تحت تحكم المضيف. يتحكم المضيف في وسيلة النقل fetch وخطافات السياسات، وتعمل حلقة الأحداث وفق وقت افتراضي، ويمنع حد ثابت لمكدس الاستدعاءات التكرار الجامح. يوجد حد لعدد دورات الحلقة، لكنه لا يُفرض بعد على الحلقات التي تنفذها آلة البايت كود الافتراضية، ولا توجد حدود لطول السلسلة أو المخرجات أو الوقت الفعلي؛ راجع API: setLimit.
  • تم التحقق منه مقابل Node.js (V8). تشغّل CI مجموعات اختبارات الوحدات والمقارنة المرجعية مع كل دفع إلى main وكل طلب سحب، واختبارات Web Platform ومجموعات الحزم الشائعة عند تغيير مصدر المحرك؛ أما مصفوفة test262 الكاملة فتُشغّل يدويًا وتُحفظ نتائجها في COMPAT.md. راجع التوافق.

ما ليس عليه

Phasis ليس مترجم JIT، بل مفسر يتجول في الشجرة مع آلة بايت كود افتراضية تُستخدم عند الإمكان. توقّع أن يستغرق نحو 100× زمن V8 في أحمال العمل المحدودة بسرعة توزيع التعليمات. المقابل هو عدم وجود تبعيات، وكونه PHP خالصًا، وتنفيذًا يتحكم فيه المضيف — ما يجعله مثاليًا لتضمين JavaScript في تطبيقات PHP حيث تكون الصحة والعزل أهم من معدل المعالجة الخام.

من أين تبدأ

  • البدء — ثبّت أول سكربت وشغّله.
  • CLI — bin/phasis لتشغيل الملفات وتقييم المصدر وتفريغ AST.
  • API — تضمين Phasis\Engine في تطبيق PHP الخاص بك.
  • التشغيل البيني — مرّر قيم PHP والدوال القابلة للاستدعاء إلى JavaScript.
  • التوافق — تغطية test262 والميزات المدعومة.
  • المحلّل — تحليل JavaScript إلى AST محدد الأنواع أو ESTree دون تنفيذه.
  • المنسّق — تنسيق JavaScript وJSON وCSS بتخطيط متوافق مع prettier.
  • متقدم — البنية وآلة البايت كود الافتراضية والمعايير ونموذج اختبارات المقارنة المرجعية.