دمج WebAssembly وPHP: دليل عملي

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

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

ابدأ الدورة

مقدمة: لماذا يحتاج PHP إلى WebAssembly؟



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



PHP هي لغة برمجة نصية تقليدياً أقل أداءً من اللغات المترجمة. ومع ذلك، باستخدام WebAssembly يمكنك:



  • تنفيذ الخوارزميات الحرجة من حيث السرعة (معالجة الصور، التشفير، التحليل) على وحدات Wasm.
  • استخدام مكتبات C/C++ الموجودة في تطبيقات PHP.
  • تقليل الحمل على الخادم من خلال التعليمات البرمجية الثنائية المحسّنة.


في هذه المقالة، سننظر في كيفية دمج WebAssembly مع PHP عملياً: من تحميل الوحدة إلى نقل البيانات ومعالجة النتائج.



1. أساسيات العمل مع WebAssembly في PHP



للعمل مع Wasm في PHP، يتم استخدام الامتداد wasm (أو wasmer لـ PHP). يتم التثبيت عبر Composer:



composer require wasm/wasm


بعد التثبيت، يمكنك تحميل وتنفيذ وحدات Wasm. لنلقِ نظرة على مثال بسيط: وحدة بلغة C تجمع رقمين.



أولاً، سنقوم بتجميع كود C إلى Wasm:



// sum.cint add(int a, int b) {    return a + b;}


التجميع (يتطلب Emscripten أو wasi-sdk):



emcc sum.c -o sum.wasm -s WASM=1 -s EXPORTED_FUNCTIONS='["_add"]'


الآن سنقوم بتحميل الوحدة في PHP واستدعاء الدالة:



<?phpuse Wasm\\Instance;use Wasm\\Module;

// تحميل الملف الثنائي$wasmBytes = file_get_contents('sum.wasm');$module = new Module($wasmBytes);$instance = new Instance($module);

// استدعاء الدالة المُصدّرة add$result = $instance->add(10, 20);echo "النتيجة: " . $result; // 30?>


الكود بسيط وبديهي: نقوم بإنشاء مثيل للوحدة واستدعاء دوالها كطرق لكائن PHP. من المهم أن نتذكر أن دوال Wasm تعمل مع الأنواع البدائية (int, float)، لذلك بالنسبة لهياكل البيانات المعقدة، ستكون هناك حاجة إلى معالجة إضافية.



2. نقل البيانات المعقدة: السلاسل والمصفوفات



يتعامل WebAssembly مع الأرقام فقط. لنقل السلاسل أو المصفوفات، من الضروري تخصيص ذاكرة داخل وحدة Wasm وتمرير المؤشرات. لنلقِ نظرة على مثال لمعالجة سلسلة نصية.



سنقوم بإنشاء وحدة بلغة C تحول سلسلة نصية إلى أحرف كبيرة:



// uppercase.c#include <string.h>#include <ctype.h>

void to_upper(char* str, int len) { for (int i = 0; i < len; i++) { str[i] = toupper(str[i]); }}


نقوم بالتجميع مع تصدير دوال العمل مع الذاكرة:



emcc uppercase.c -o uppercase.wasm -s WASM=1 -s EXPORTED_FUNCTIONS='["_to_upper", "_malloc", "_free"]' -s ALLOW_MEMORY_GROWTH=1


كود PHP للاستدعاء:



<?php$wasmBytes = file_get_contents('uppercase.wasm');$module = new Module($wasmBytes);$instance = new Instance($module);

$input = "hello webassembly";$len = strlen($input) + 1; // +1 للفاصل الصفري

// تخصيص ذاكرة في وحدة Wasm$ptr = $instance->malloc($len);// كتابة السلسلة في ذاكرة الوحدة$instance->memory->write($ptr, $input);

// استدعاء دالة التحويل$instance->to_upper($ptr, $len);

// قراءة النتيجة من الذاكرة$result = $instance->memory->read($ptr, $len);echo "النتيجة: " . trim($result); // HELLO WEBASSEMBLY

// تحرير الذاكرة$instance->free($ptr);?>


يتطلب هذا الأسلوب إدارة يدوية للذاكرة، لكنه يمنح تحكماً كاملاً في البيانات. للتبسيط، يمكن استخدام مكتبات مغلّفة، مثل wasm-php-bridge.



3. معالجة

المدونات

توصيات الكتب