ext-php-rs/README.md

73 lines
2.7 KiB
Markdown
Raw Normal View History

2021-04-02 07:12:30 +02:00
# ext-php-rs
Bindings for the Zend API to build PHP extensions natively in Rust. Inspired by [killertux/solder](https://github.com/killertux/solder) and its predecessors.
[![PHP Discorders](https://discord.com/api/guilds/115233111977099271/widget.png?style=banner1)](https://discord.gg/dphp)
2021-04-09 02:36:30 +02:00
## Documentation
We are currently unable to deploy our documentation to `docs.rs` due to the crate requiring PHP 8.0, which is unavailable in the default Ubuntu repositories.
Documentation can be viewed [here](https://davidcole1340.github.io/ext-php-rs/). It is generated from the latest `master` branch. Documentation will be moved to `docs.rs` when Ubuntu updates its repositories
to PHP 8.0.
2021-04-02 07:18:08 +02:00
## Features
This is not a set feature list, but these are the features on my roadmap. Create an issue if there's something you'd like to see!
- [x] Module definitions
- [x] Function implementation
- [x] Class implementation
- [x] Class methods
- [ ] Class properties
- [x] Class constants
- [x] Module constants
2021-04-02 07:18:08 +02:00
- [x] Calling PHP functions
Implemented classes (#17) * Add PHP thread safety to build matrix * Revert "Add PHP thread safety to build matrix" This reverts commit 7de868e6b6e329b87c412af8daf61cba1a3e29c5. * Fixed arguments not being reconized by PHP * Added function to create interned Zend string * Changed statup/shutdown function types to Rust types Prevents users having to import from bindings * Added flags for classes * WIP: class builder * Added properties to classes * Added class constants * Added PHP base extensions Added class inheritance * Fixed memory leak with constants Created C wrapper which is compiled and linked in the `build.rs` script. In the process removed the `build_id()` function as now we can just export the macro via a function which is defined in `wrapper.c`. * Fixed lint issue * Added functions to set zval as different strings Regular strings, persistent strings and interned strings * Updated README with requirements * Fixed lint issues * Changed properties to use proper function * Free zend string when it is changed for a persistent one * WIP: overriding zend objects * Added comments to the top of modules. * Fixed some comments * Initialize hash map with initial size when converting from HashMap and Vec * Removed unused imports * WIP: object overrides * Added DerefMut implementation for ZendClassObject Tidied up lints that clippy was complaining about, removed debugging statements. * Fixed pointer dereference error in macro * Added missing comments for trait * All functions now take mutable references vs ptr Removed SetZval implementation for *mut Zval. Made bindings public, removed duplicate bindings. Fixed `create_object` handler not working. Note to self: smaller commits. * Showcase ability to use shared object * WIP: debugging property errors Changed `function` to `method` in classes Fixed doctest for `c_str` * Disabled class properties temporarily See #16 * Initialize args array with size
2021-04-02 03:18:45 +02:00
## Requirements
2021-04-02 07:19:37 +02:00
- PHP 8.0 or later
- No support is planned for lower versions.
2021-04-20 06:40:35 +02:00
- Linux or Darwin-based OS
Implemented classes (#17) * Add PHP thread safety to build matrix * Revert "Add PHP thread safety to build matrix" This reverts commit 7de868e6b6e329b87c412af8daf61cba1a3e29c5. * Fixed arguments not being reconized by PHP * Added function to create interned Zend string * Changed statup/shutdown function types to Rust types Prevents users having to import from bindings * Added flags for classes * WIP: class builder * Added properties to classes * Added class constants * Added PHP base extensions Added class inheritance * Fixed memory leak with constants Created C wrapper which is compiled and linked in the `build.rs` script. In the process removed the `build_id()` function as now we can just export the macro via a function which is defined in `wrapper.c`. * Fixed lint issue * Added functions to set zval as different strings Regular strings, persistent strings and interned strings * Updated README with requirements * Fixed lint issues * Changed properties to use proper function * Free zend string when it is changed for a persistent one * WIP: overriding zend objects * Added comments to the top of modules. * Fixed some comments * Initialize hash map with initial size when converting from HashMap and Vec * Removed unused imports * WIP: object overrides * Added DerefMut implementation for ZendClassObject Tidied up lints that clippy was complaining about, removed debugging statements. * Fixed pointer dereference error in macro * Added missing comments for trait * All functions now take mutable references vs ptr Removed SetZval implementation for *mut Zval. Made bindings public, removed duplicate bindings. Fixed `create_object` handler not working. Note to self: smaller commits. * Showcase ability to use shared object * WIP: debugging property errors Changed `function` to `method` in classes Fixed doctest for `c_str` * Disabled class properties temporarily See #16 * Initialize args array with size
2021-04-02 03:18:45 +02:00
- Rust - no idea which version
2021-04-20 06:40:35 +02:00
- Clang 3.9 or greater
Implemented classes (#17) * Add PHP thread safety to build matrix * Revert "Add PHP thread safety to build matrix" This reverts commit 7de868e6b6e329b87c412af8daf61cba1a3e29c5. * Fixed arguments not being reconized by PHP * Added function to create interned Zend string * Changed statup/shutdown function types to Rust types Prevents users having to import from bindings * Added flags for classes * WIP: class builder * Added properties to classes * Added class constants * Added PHP base extensions Added class inheritance * Fixed memory leak with constants Created C wrapper which is compiled and linked in the `build.rs` script. In the process removed the `build_id()` function as now we can just export the macro via a function which is defined in `wrapper.c`. * Fixed lint issue * Added functions to set zval as different strings Regular strings, persistent strings and interned strings * Updated README with requirements * Fixed lint issues * Changed properties to use proper function * Free zend string when it is changed for a persistent one * WIP: overriding zend objects * Added comments to the top of modules. * Fixed some comments * Initialize hash map with initial size when converting from HashMap and Vec * Removed unused imports * WIP: object overrides * Added DerefMut implementation for ZendClassObject Tidied up lints that clippy was complaining about, removed debugging statements. * Fixed pointer dereference error in macro * Added missing comments for trait * All functions now take mutable references vs ptr Removed SetZval implementation for *mut Zval. Made bindings public, removed duplicate bindings. Fixed `create_object` handler not working. Note to self: smaller commits. * Showcase ability to use shared object * WIP: debugging property errors Changed `function` to `method` in classes Fixed doctest for `c_str` * Disabled class properties temporarily See #16 * Initialize args array with size
2021-04-02 03:18:45 +02:00
See the following links for the dependency crate requirements:
- [`cc`](https://github.com/alexcrichton/cc-rs#compile-time-requirements)
- [`bindgen`](https://rust-lang.github.io/rust-bindgen/requirements.html)
## Usage
This project only works for PHP >= 8.0 (for now). Due to the fact that the PHP extension system relies heavily on C macros (which cannot be exported to Rust easily), structs have to be hard coded in.
2021-04-18 07:01:31 +02:00
There is only inline documentation for the time being. Starting by creating a C extension is a good start as well.
Check out one of the example projects:
- [ext-skel](example/skel) - Testbed for testing the library. Check out previous commits as well to see what else is possible.
- [opus-php](https://github.com/davidcole1340/opus-php/tree/rewrite_rs) - Work-in-progress extension to use the Opus library in PHP.
2021-03-09 08:58:07 +01:00
## Contributions
Contributions are very much welcome. I am a novice Rust developer and any suggestions are wanted and welcome. Feel free to file issues and PRs through Github.
2021-05-16 05:27:32 +02:00
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.
## Resources
- [PHP Internals Book](https://www.phpinternalsbook.com/)
## License
Licensed under either of
* Apache License, Version 2.0
([LICENSE_APACHE](LICENSE_APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license
([LICENSE_MIT](LICENSE_MIT) or http://opensource.org/licenses/MIT)
at your option.