Goro
This is an implementation of PHP, written in pure Go (as much as possible, right now pcre doesn't exist in pure go and require usage of libpcre).
Why?
That's a good question. PHP is a nice language but is having trouble keeping up with modern languages. This implementation, while far from finished, is trying to make a number of things possible:
Usage of goroutines, go channels, etc from within PHP
Better caching of compiled code by allowing sharing of compiled or live objects (classes, objects, etc) between running PHP scripts
Use Go's memory management within PHP
Ability to run functions or code sandboxed (including filesystem) to limit security risks
Easily call the PHP engine from Go to execute pieces of PHP code (user provided or legacy)
Install
In order to run php code as cli:
go get github.com/MagicalTux/goro/sapi/php-cli
Status
This is still a very early implementation and most of the core is missing.
TODO
The following needs to be done before we can call this an alpha version.
Fix arguments passed by reference for builtin methods
Error reporting, lower level of errors (warnings, etc)
php.ini handling
Streams & filesystem support
command line flags handling
Class and object implementation is still very early. Access checks are missing. Class inheritance, etc are missing
Class abstract
Builtin class methods
Interfaces
Exception throwing
Traits
break/continue needs improvement/fixing
declare
goto ?
namespaces
generators
predefined superglobals
Allow process to run in containers on linux (see https://github.com/lizrice/containers-from-scratch - would be useful to create a play interface for goro)
Extensions
Sorted by priority.
Extension
Status
Notes
standard
5%
a lot of work remaining
json
33%
Need custom impl to support php arrays
pcre
5%
currently using cgo version of libpcre
session
date
1%
SPL
iconv
using golang.org/x/text/transform
curl
using net/http
hash
50%
mysqli
gmp
20%
Using math/big
mbstring
mcrypt
openssl
using crypto packages
Reflection
tokenizer
already in core/tokenizer, needs to be exposed
xml...
gd
without gd
bz2
1%
zlib
calendar
Phar
ctype
100%
sockets
Concepts
Process
A process object will typically be created only once in a runtime environment, and is used to keep some objects cached, as well as global stream wrapper resources. Persistant connections, run time cache, etc are stored at the Process level.
GlobalCache (optional)
A special global status intermediate between Process and Global that causes declarations of classes and functions to be kept between scripts, typically useful when using an autoloader.
Global
When a request is received or execution of a script is requested, a new Global context is created. The global context contains runtime level details such as global variables, declared functions, classes, constants, etc.
Context
Context is a local context, such as within a running function etc. Global has a root context, and each function call causes instantiation of a new context so that variables space is kept separated.
Contributing
A lot of work is needed. The most important part is improving the documentation, followed by improving support of core features (see TODO in this file), and implement individual functions from the various PHP extensions.
Writing an extension is simple. Create a directory in ext, write code prefixed with a magic function defining comment and run the tools/buildext.php script to generate bindings/etc. Add your newly created extension to the main.go of each sapi to enable it by default.
Before contributing, please join the telegram group and/or create an issue on github in order to discuss and find out which parts you can work on and how to proceed.