Stars: 902
Forks: 85
Pull Requests: 24
Issues: 43
Watchers: 26
Last Updated: 2022-12-07 16:39:32
PHP in Browser (powered by WebAssembly)
License: Apache License 2.0
Languages: Shell, C, Makefile, JavaScript, Dockerfile, HTML, PHP, CSS
Install with npm:
$ npm install php-wasm
You'll need to add the following postinstall
script entry to your package.json to ensure the static assets are available to your web application. Make sure to replace public/
with the path to your public document root if necessary.
{
"scripts": {
"postinstall": [
"cp node_modules/php-wasm/php-web.* public/"
]
},
}
If you're using a more advanced bundler, use the vendor's documentation to learn how to move the files matching the following pattern to your public directory:
./node_modules/php-wasm/php-web.*
Using php-wasm is easy.
Once the library is included in the page, you can run PHP right from a script tag! The src attribute is also supported for non-inline scripts.
<script type = "text/php">
<?php vrzno_run('alert', ['Hello, world!']);
</script>
First, grab an instance of the object:
const PHP = require('php-wasm/PhpWeb').PhpWeb;
const php = new PHP;
or, in es6:
import { PhpWeb as PHP } from 'php-wasm/PhpWeb';
const php = new PHP;
Then, add an output listener:
php.addEventListener('output', (event) => {
console.log(event.detail);
});
Be sure to wait until your WASM is fully loaded, then run some PHP:
php.addEventListener('ready', () => {
php.run('<?php echo "Hello, world!";');
});
Get the result code of your script with then()
:
php.addEventListener('ready', () => {
php.run('<?php echo "Hello, world!";').then(retVal => {
// retVal contains the return code.
});
});
So long as php.refresh()
is not called from Javascript, the instance will maintain its own persistent memory.
<?php
// Run this over and over again...
print ++$x;
See the example in action here
The DOM may be accessed via the VRZNO php extension. This is specially for the browser allowing PHP to access Javascript via a C api. It comes preinstalled with php-wasm.
See the example in action here
// Show an alert with vrzno_run. Note the second param is an array of args.
vrzno_run('alert', ['Hello, World!']);
$oldTitle = NULL;
$newTitle = 'Changed@' . date('h:i:s');
// Grab the current title.
$oldTitle = vrzno_eval('document.title');
// Change the document title.
vrzno_eval('document.title = "' . $newTitle . '"' );
Firefox is recommended for better user experience.
The quickest way to build PIB is by using Make & Docker. Simply issue the make
command after checking out the repo, and it will build.
make
Steps:
bash configure.sh
bash build-objects.sh
bash build.sh
to build the web binary