seanmorris / php-wasm

PHP in Browser, powered by WebAssembly.
https://seanmorris.github.io/php-wasm/
Apache License 2.0
735 stars 38 forks source link

PhpNode and PhpCgiNode locateFile breaks dynamic imports #55

Open mglaman opened 3 weeks ago

mglaman commented 3 weeks ago

I'm trying out PhpNode and the following:

        const php = new PhpNode({
            persist: {
                mountPath: '/persist',
                localPath: process.cwd() + '/tests/fixtures/'
            },
            sharedLibs: [
                await import('php-wasm-zlib'),
                await import('php-wasm-libzip')

All is good until the following: See following screenshot

        args.locateFile = path => {
            let located = userLocateFile(path);
            if(located !== undefined)
            {
                return located;
            }
            if(urlLibs[path])
            {
                return urlLibs[path];
            }
        };

Screenshot 2024-08-21 at 4 23 28 PM

The path is php8.3-zlib.so, but urlLibs[path] has the proper URL. But located returns a value even though it is wrong.

locateFile never returns undefined when using PhpNode and returns files which do not exist. See result in the next screenshot.

Screenshot 2024-08-21 at 4 26 24 PM

mglaman commented 3 weeks ago

Possible workaround:


import { PhpBase } from 'php-wasm/PhpBase.mjs';
import PhpBinary from 'php-wasm/php-node.mjs';

        const php = new PhpBase(PhpBinary, {
            persist: {
                mountPath: '/persist',
                localPath: process.cwd() + '/tests/fixtures/'
            },
            sharedLibs: [
                await import('php-wasm-zlib'),
                await import('php-wasm-libzip')
``
mglaman commented 3 weeks ago

I don't think this is quite working either as when I debug I find it trying to load php83-zlib.so.so

mglaman commented 3 weeks ago

WIP branch where I'm trying this out: https://github.com/mglaman/wasm-drupal/blob/9768d93d0b4bca056a87d40dfc5a06264b2c5190/tests/init-phpcode.test.js

Warning: PHP Startup: Invalid library (maybe not a PHP library) 'libzip.so' in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'php8.3-zlib.so' (tried: ./php8.3-zlib.so (Tried to lookup unknown symbol "_zend_extension_entry" in dynamic lib: libzip.so), ./php8.3-zlib.so.so ()) in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'zlib.so' (tried: ./zlib.so (), ./zlib.so.so ()) in Unknown on line 0
mglaman commented 3 weeks ago

Okay, I got it working this way: using PhpBase and not PhpNode

import { PhpBase } from 'php-wasm/PhpBase.mjs';
import PhpBinary from 'php-wasm/php-node.mjs';

        const php = new PhpBase(PhpBinary, {
            persist: {
                mountPath: '/persist',
                localPath: process.cwd() + '/tests/fixtures/'
            },
            sharedLibs: [
                {
                    name: `php${PhpNode.phpVersion}-zip.so`,
                    url: `${process.cwd()}/node_modules/php-wasm-libzip/php${PhpNode.phpVersion}-zip.so`,
                    ini: true
                },
                {
                    name: `libzip.so`,
                    url: `${process.cwd()}/node_modules/php-wasm-libzip/libzip.so`,
                    ini: false
                },
                {
                    name: `php${PhpNode.phpVersion}-zlib.so`,
                    url: `${process.cwd()}/node_modules/php-wasm-zlib/php${PhpNode.phpVersion}-zlib.so`,
                    ini: true
                },
                {
                    name: `libz.so`,
                    url: `${process.cwd()}/node_modules/php-wasm-zlib/libz.so`,
                    ini: false
                },
            ]
        });