परिचय: PHP में WebAssembly क्यों?
\nवेब डेवलपमेंट की दुनिया में, PHP सर्वर-साइड के लिए सबसे लोकप्रिय भाषाओं में से एक बना हुआ है। हालाँकि, जब उच्च-प्रदर्शन कंप्यूटिंग की बात आती है - इमेज प्रोसेसिंग, जटिल गणित, ऑन-द-फ्लाई कोड कम्पाइलेशन, या C/C++/Rust कोड का उपयोग - तो नेटिव PHP अक्सर पीछे रह जाता है। यहीं पर WebAssembly (WASM) मदद के लिए आता है।
\nWebAssembly एक बाइनरी इंस्ट्रक्शन फॉर्मेट है जो लगभग नेटिव गति से निष्पादित होता है। परंपरागत रूप से यह ब्राउज़रों से जुड़ा है, लेकिन आधुनिक रनटाइम (Wasmer, Wasmtime) सर्वर पर, PHP से भी WASM मॉड्यूल चलाने की अनुमति देते हैं। इस लेख में, हम PHP अनुप्रयोगों में WebAssembly को एकीकृत करने की उन्नत तकनीकों पर विचार करेंगे: पर्यावरण सेटअप से लेकर जटिल मॉड्यूल बनाने और प्रदर्शन अनुकूलन तक।
\n\n1. पर्यावरण सेटअप: Wasmer और PHP एक्सटेंशन
\nPHP में WebAssembly के साथ काम करने के लिए हमें एक विशेष एक्सटेंशन की आवश्यकता होगी। सबसे परिपक्व और दस्तावेजीकृत विकल्प wasmer-php है।
\nWasmer स्थापित करना
\nपहले Wasmer रनटाइम स्वयं स्थापित करें:
\ncurl https://get.wasmer.io -sSfL | sh\n# या पैकेज मैनेजर के माध्यम से (macOS/Linux)\nbrew install wasmer\nPHP एक्सटेंशन स्थापित करना
\nएक्सटेंशन को PECL के माध्यम से स्थापित किया जा सकता है या मैन्युअल रूप से बनाया जा सकता है:
\n# PECL के माध्यम से\nsudo pecl install wasmer\n\n# या स्रोत से बिल्ड (उन्नत के लिए)\ngit clone https://github.com/wasmerio/wasmer-php.git\ncd wasmer-php\nphpize\n./configure\nmake\nsudo make install\nस्थापना के बाद, अपने php.ini में extension=wasmer.so जोड़ें और सर्वर को पुनरारंभ करें। कार्यक्षमता जांचें:
<?php\necho class_exists('\\\\Wasmer\\\\Instance') ? 'WASM Ready' : 'Not installed';\n?>\n\n2. PHP से WASM मॉड्यूल लोड करना और निष्पादित करना
\nमान लीजिए, हमारे पास एक संकलित मॉड्यूल math.wasm है जो फ़ंक्शन add(a, b) (Rust या C में लिखा गया) को एक्सपोर्ट करता है। इसे लोड करें और PHP से कॉल करें।
मूल उदाहरण: फ़ंक्शन कॉल
\n<?php\nuse Wasmer\\Instance;\nuse Wasmer\\Module;\nuse Wasmer\\Memory;\nuse Wasmer\\Value;\n\n// 1. मॉड्यूल लोड करें\n$wasm_bytes = file_get_contents(__DIR__ . '/math.wasm');\n$module = new Module($wasm_bytes);\n\n// 2. एक इंस्टेंस बनाएं\n$instance = new Instance($module);\n\n// 3. एक्सपोर्टेड फ़ंक्शन प्राप्त करें\n$add = $instance->exports->get('add');\n\n// 4. आर्गुमेंट के साथ कॉल करें\n$result = $add(5, 7);\n\necho "परिणाम: " . $result->toInt(); // आउटपुट: 12\n?>\nमहत्वपूर्ण: WASM फ़ंक्शन सरल प्रकारों (i32, i64, f32, f64) के साथ काम करते हैं। जटिल संरचनाओं (स्ट्रिंग, ऐरे) के लिए लीनियर मेमोरी (Memory) के माध्यम से स्थानांतरण की आवश्यकता होती है।
\n\nमेमोरी के साथ कार्य: स्ट्रिंग स्थानांतरण
\nयदि आपका WASM मॉड्यूल एक स्ट्रिंग की अपेक्षा करता है, तो इसे साझा मेमोरी में लिखें और पॉइंटर पास करें:
\n<?php\n// मान लें, WASM फ़ंक्शन 'greet' स्ट्रिंग पर पॉइंटर (i32) स्वीकार करता है\n$memory = $instance->exports->get('memory');\n$greet = $instance->exports->get('greet');\n\n// मेमोरी में स्ट्रिंग लिखें (अंत में नल बाइट के साथ)\n$input = "Hello from PHP!";\n$ptr = 100; // मनमाना पता, खाली होना चाहिए\n$memory->write($ptr, $input . "\\0");\n\n// फ़ंक्शन कॉल करें\n$result_ptr = $greet($ptr);\n\n// मेमोरी से परिणाम पढ़ें\n$output = '';\n$offset = $result_ptr->toInt();\nwhile (($byte = $memory->read($offset, 1)) !== "\\0") {\n $output .= $byte;\n $offset++;\n}\necho $output; // WASM से अभिवादन\n?>\n\n3. स्वयं का WASM मॉड्यूल बनाना (Rust → PHP)
\nअधिकतम प्रदर्शन के लिए अक्सर Rust का उपयोग किया जाता है। एक न्यूनतम उदाहरण पर विचार करें।
\nRust कोड
\nएक नया प्रोजेक्ट बनाएं:
\ncargo new --lib wasm_math\ncd wasm_math\nफ़ाइल Cargo.toml:
[lib]\ncrate-type = ["cdylib"]\n\n[depend