مقدمة في WebAssembly وPHP
\n\nWebAssembly (Wasm) هو تنسيق تعليمات ثنائي منخفض المستوى يتم تنفيذه في آلة افتراضية بأداء قريب من الأداء الأصلي. في سياق PHP، يفتح آفاقًا جديدة: يمكنك تشغيل كود بلغة C أو C++ أو Rust أو Go مباشرة من سكريبت PHP دون مغادرة بيئة الخادم. هذا مفيد بشكل خاص للمهام كثيفة الاستخدام للموارد - معالجة الصور، التشفير، تحليل البيانات، أو الحسابات الرياضية.
\n\nفي هذه المقالة، سنستعرض دورة العمل الكاملة: من ترجمة الكود المصدري إلى Wasm إلى استدعاء الدوال من PHP باستخدام الإضافات wasmtime و wasmer. ستتعلم كيفية تحسين أداء تطبيقات PHP باستخدام قوة الكود الآلي.
أساسيات WebAssembly: ما يحتاج مطور PHP إلى معرفته
\n\nهندسة Wasm
\n\nيعمل WebAssembly في بيئة معزولة (sandbox). لا يتمتع وحدة Wasm بإمكانية الوصول المباشر إلى نظام الملفات أو الشبكة أو ذاكرة المضيف - فقط إلى ذاكرته الخطية والدوال المصدرة. هذا يضمن الأمان، ولكنه يتطلب إدارة صريحة للبيانات.
\n\nالمفاهيم الأساسية:
\n- \n
- الوحدة - ملف ثنائي مترجم (.wasm) \n
- الصادرات - الدوال والمتغيرات المتاحة من الخارج \n
- الواردات - الدوال التي يوفرها المضيف (PHP) للوحدة \n
- الذاكرة الخطية - مصفوفة مستمرة من البايتات التي تتعامل معها الوحدة \n
أدوات العمل مع Wasm في PHP
\n\nهناك إضافتان رئيسيتان:
\n- \n
- Wasmtime - من Bytecode Alliance، الأكثر شيوعًا واستقرارًا \n
- Wasmer - بديل يدعم العديد من الخلفيات (Cranelift، LLVM، Singlepass) \n
التثبيت عبر Composer:
\ncomposer require wasmtime/wasmtime-php\n# أو\ncomposer require wasmer/wasmer\n\nستحتاج أيضًا إلى تثبيت مكتبة النظام Wasmtime أو Wasmer. لأوبونتو:
\ncurl 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. التثبيت:
\ngit 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:
#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:
\nemcc 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 جاهز للاستخدام.
دمج 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()