WebAssembly और PHP एकीकरण का परिचय
\n\nWebAssembly (Wasm) एक बाइनरी इंस्ट्रक्शन फॉर्मेट है जो वेब ब्राउज़र और सर्वर पर हाई-परफॉर्मेंस कोड चलाने की सुविधा देता है। उन्नत स्तर पर, WebAssembly को PHP के साथ एकीकृत करने से हाइब्रिड एप्लिकेशन बनाने के नए रास्ते खुलते हैं, जहाँ प्रदर्शन-महत्वपूर्ण कोड (जैसे इमेज प्रोसेसिंग, क्रिप्टोग्राफी, सिमुलेशन) Wasm पर चलता है, जबकि सारा बिज़नेस लॉजिक PHP पर रहता है।
\n\nइस लेख में हम सीखेंगे कि एनवायरनमेंट कैसे सेट करें, PHP से Wasm मॉड्यूल को कॉल करें, जटिल डेटा ट्रांसफर करें और इंटरैक्शन को ऑप्टिमाइज़ करें। सभी उदाहरण Wasmtime रनटाइम पर आधारित हैं - जो सर्वर-साइड WebAssembly के लिए सबसे परिपक्व रनटाइम है।
\n\n1. एनवायरनमेंट तैयार करना: Wasmtime और PHP एक्सटेंशन इंस्टॉल करना
\n\nPHP में WebAssembly के साथ काम करने के लिए Wasmtime (Bytecode Alliance द्वारा) और उसी नाम का PHP एक्सटेंशन इंस्टॉल करना होगा। यह एक्सटेंशन Wasm मॉड्यूल को लोड करने, इंस्टेंशिएट करने और फंक्शन कॉल करने के लिए नेटिव इंटरफ़ेस प्रदान करता है।
\n\nWasmtime इंस्टॉल करना
\n# Linux/macOS के लिए\ncurl https://wasmtime.dev/install.sh -sSf | bash\n\n# Windows के लिए - आधिकारिक साइट से इंस्टॉलर डाउनलोड करें\n# https://github.com/bytecodealliance/wasmtime/releases\n\nPHP एक्सटेंशन wasmtime इंस्टॉल करना
\nएक्सटेंशन को PECL के माध्यम से या सोर्स कोड से बिल्ड करके इंस्टॉल किया जा सकता है:
\npecl install wasmtime\n\n# इंस्टॉलेशन जांचें\nphp -m | grep wasmtime\n\nइंस्टॉल करने के बाद php.ini में यह लाइन जोड़ें:
\nextension=wasmtime.so\n\nWasm मॉड्यूल कंपाइल करना
\nटेस्ट के लिए Rust में एक सरल मॉड्यूल बनाते हैं जो जोड़ फंक्शन एक्सपोर्ट करता है:
\n// lib.rs\n#[no_mangle]\npub extern "C" fn add(a: i32, b: i32) -> i32 {\n a + b\n}\nWasm में कंपाइल करें:
\nrustc --target wasm32-wasi -O -o add.wasm lib.rs\n\n2. PHP से Wasm मॉड्यूल लोड और कॉल करना
\n\nअब एक PHP स्क्रिप्ट बनाते हैं जो कंपाइल किए गए मॉड्यूल को लोड करेगी और add फंक्शन को कॉल करेगी।
बेसिक फंक्शन कॉल
\n<?php\n// Wasm मॉड्यूल लोड करें\n$engine = new Wasmtime\\Engine();\n$module = Wasmtime\\Module::new($engine, file_get_contents('add.wasm'));\n\n// स्टोर और इंस्टेंस बनाएं\n$store = new Wasmtime\\Store($engine);\n$instance = new Wasmtime\\Instance($store, $module, []);\n\n// एक्सपोर्टेड फंक्शन प्राप्त करें\n$add = $instance->exports($store)['add'];\n\n// फंक्शन कॉल करें\n$result = $add($store, 5, 3);\necho "परिणाम: " . $result; // 8 आउटपुट होगा\n?>\n\nएरर हैंडलिंग और डेटा टाइप्स
\nWasmtime केवल बेसिक टाइप्स सपोर्ट करता है: i32, i64, f32, f64। स्ट्रिंग और ऐरे ट्रांसफर करने के लिए Wasm की लीनियर मेमोरी का उपयोग करना होगा। मेमोरी के माध्यम से स्ट्रिंग ट्रांसफर का उदाहरण:
<?php\n// मान लें Wasm मॉड्यूल में यह फंक्शन है:\n// void greet(void* ptr, int len)\n\n$memory = $instance->exports($store)['memory'];\n$greet = $instance->exports($store)['greet'];\n\n// Wasm मेमोरी में स्ट्रिंग लिखें\n$str = "PHP से नमस्ते!";\n$len = strlen($str);\n$ptr = $instance->exports($store)['malloc']($store, $len);\n$memory->write($store, $ptr, $str);\n\n// फंक्शन कॉल करें\n$greet($store, $ptr, $len);\n\n// मेमोरी खाली करें (यदि free उपलब्ध हो)\n$instance->exports($store)['free']($store, $ptr, $len);\n?>\n\n3. प्रदर्शन अनुकूलन: कैशिंग और इंस्टेंस पूलिंग
\n\nWasm मॉड्यूल का इंस्टेंस बनाना एक महंगी प्रक्रिया है। उन्नत स्तर पर, कंपाइल किए गए मॉड्यूल को कैश करना और इंस्टेंस पूल का उपयोग करना आवश्यक है।
\n\nकंपाइल किए गए मॉड्यूल को कैश करना
\n<?php\n$cachePath = '/tmp/wasm_cache/';\n$moduleKey = md5_file('add.wasm');\n$cachedFile = $cachePath . $moduleKey . '.wasm';\n\nif (file_exists($cachedFile)) {\n $compiled = file_get_contents($cachedFile);\n} else {\n // मॉड्यूल कंपाइल करें और कैश करें\n $engine = new Wasmtime\\Engine();\n $module = Wasmtime\\Module::new($engine, file_get_contents('add.wasm'));\n $compiled = $module->serialize();\n file_put_contents($cachedFile, $compiled);\n}\n\n// कैश किए गए मॉड्यूल का उपयोग करें\n$engine = new Wasmtime\\Engine();\n$module = Wasmtime\\Module::deserialize($engine, $compiled);\n?>