العمل مع WebAssembly وPHP: من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في WebAssembly وPHP

\n\n

WebAssembly (Wasm) هو تنسيق تعليمات ثنائي منخفض المستوى يتم تنفيذه في آلة افتراضية بأداء قريب من الأداء الأصلي. في سياق PHP، يفتح آفاقًا جديدة: يمكنك تشغيل كود بلغة C أو C++ أو Rust أو Go مباشرة من سكريبت PHP دون مغادرة بيئة الخادم. هذا مفيد بشكل خاص للمهام كثيفة الاستخدام للموارد - معالجة الصور، التشفير، تحليل البيانات، أو الحسابات الرياضية.

\n\n

في هذه المقالة، سنستعرض دورة العمل الكاملة: من ترجمة الكود المصدري إلى Wasm إلى استدعاء الدوال من PHP باستخدام الإضافات wasmtime و wasmer. ستتعلم كيفية تحسين أداء تطبيقات PHP باستخدام قوة الكود الآلي.

\n\n

أساسيات WebAssembly: ما يحتاج مطور PHP إلى معرفته

\n\n

هندسة Wasm

\n\n

يعمل WebAssembly في بيئة معزولة (sandbox). لا يتمتع وحدة Wasm بإمكانية الوصول المباشر إلى نظام الملفات أو الشبكة أو ذاكرة المضيف - فقط إلى ذاكرته الخطية والدوال المصدرة. هذا يضمن الأمان، ولكنه يتطلب إدارة صريحة للبيانات.

\n\n

المفاهيم الأساسية:

\n
    \n
  • الوحدة - ملف ثنائي مترجم (.wasm)
  • \n
  • الصادرات - الدوال والمتغيرات المتاحة من الخارج
  • \n
  • الواردات - الدوال التي يوفرها المضيف (PHP) للوحدة
  • \n
  • الذاكرة الخطية - مصفوفة مستمرة من البايتات التي تتعامل معها الوحدة
  • \n
\n\n

أدوات العمل مع Wasm في PHP

\n\n

هناك إضافتان رئيسيتان:

\n
    \n
  • Wasmtime - من Bytecode Alliance، الأكثر شيوعًا واستقرارًا
  • \n
  • Wasmer - بديل يدعم العديد من الخلفيات (Cranelift، LLVM، Singlepass)
  • \n
\n\n

التثبيت عبر Composer:

\n
composer require wasmtime/wasmtime-php\n# أو\ncomposer require wasmer/wasmer
\n\n

ستحتاج أيضًا إلى تثبيت مكتبة النظام Wasmtime أو Wasmer. لأوبونتو:

\n
curl https://wasmtime.dev/install.sh -sSf | bash\n# أو\ncurl https://get.wasmer.io -sSfL | sh
\n\n

ترجمة C/C++ إلى WebAssembly

\n\n

للترجمة نستخدم Emscripten - مجموعة أدوات تعتمد على LLVM/Clang. التثبيت:

\n
git clone https://github.com/emscripten-core/emsdk.git\ncd emsdk\n./emsdk install latest\n./emsdk activate latest\nsource ./emsdk_env.sh
\n\n

مثال: دالة جمع بلغة C

\n\n

لننشئ ملف math.c:

\n
#include <emscripten.h>\n\nEMSCRIPTEN_KEEPALIVE\nint add(int a, int b) {\n    return a + b;\n}\n\nEMSCRIPTEN_KEEPALIVE\nint factorial(int n) {\n    if (n <= 1) return 1;\n    return n * factorial(n - 1);\n}
\n\n

نقوم بترجمته إلى Wasm:

\n
emcc math.c -o math.wasm -s WASM=1 -s EXPORTED_FUNCTIONS='["_add","_factorial"]' -s EXPORTED_RUNTIME_METHODS='["ccall","cwrap"]' -O3
\n\n

العلم -O3 يفعل التحسين الأقصى. الملف math.wasm جاهز للاستخدام.

\n\n

دمج Wasm مع PHP: أمثلة خطوة بخطوة

\n\n

السيناريو 1: استخدام Wasmtime

\n\n

قم بتثبيت الإضافة واكتب كود PHP التالي:

\n
<?php\nrequire 'vendor/autoload.php';\n\nuse Wasmtime\\Engine;\nuse Wasmtime\\Module;\nuse Wasmtime\\Store;\nuse Wasmtime\\Func;\nuse Wasmtime\\Val;\n\n// تحميل الوحدة\n$engine = new Engine();\n$module = Module::fromFile($engine, 'math.wasm');\n$store = new Store($engine);\n\n// إنشاء مثيل\n$instance = new Wasmtime\\Instance($store, $module, []);\n\n// الحصول على الدالة المصدرة\n$add = $instance->getExport($store, 'add');\n$factorial = $instance->getExport($store, 'factorial');\n\n// استدعاء الدوال\n$resultAdd = $add->call($store, 5, 7);\n$resultFact = $factorial->call($store, 10);\n\necho "5 + 7 = " . $resultAdd[0]->i32() . "\\n"; // 12\necho "10! = " . $resultFact[0]->i32()                

المدونات

توصيات الكتب