ext-php-rs/README.md

203 lines
6.7 KiB
Markdown
Raw Permalink Normal View History

2021-04-02 07:12:30 +02:00
# ext-php-rs
Windows support (#128) * Preliminary Windows support * Start work on cross-platform build script * Fix compilation on macOS * Updated README, tidied up build script * Check linker version before starting compilation It doesn't seem like it's possible to change the linker from within the build script, however, we can retrieve the linker in use and give the user a suggestion if the linker will not work. * Switch to using Github repository for bindgen * Split Windows and Unix implementations into two files * Fix building on Windows * Remove `reqwest` and `zip` as dependencies on Unix * Fix guide tests on Windows * Started work on Windows CI * runs -> run * Use preinstalled LLVM on Windows * Debugging for Windows CI * Switch to upstream `rust-bindgen` master branch * Switch to `rust-lld` for Windows linking * Don't compile `cargo-php` on Windows * Switch to using skeptic for tests * cargo-php: Disable stub generation, fix ext install/remove The plan is to replace the stub generation by generating them with PHP code. This is cross-platform and means we don't need to worry about ABI. We also don't need to embed information into the library. * cargo-php: Fix on unix OS * Fix clippy lint * Updated README * Re-add CI for Unix + PHP 8.0 * Fix building on thread-safe PHP * Tidy up build scripts * Use dynamic lookup on Linux, test with TS Windows * Define `ZTS` when compiling PHP ZTS * Combine Windows and Unix CI, fix linking for Win32TS * Fix exclusions in build CI * rust-toolchain -> rust * Set LLVM version * Only build docs.rs on Ubuntu PHP 8.1 * Fix build on Linux thread-safe * Update guide example
2022-03-18 04:36:51 +01:00
[![Crates.io](https://img.shields.io/crates/v/ext-php-rs)](https://lib.rs/ext-php-rs)
[![docs.rs](https://img.shields.io/docsrs/ext-php-rs/latest)](https://docs.rs/ext-php-rs)
[![Guide Workflow Status](https://img.shields.io/github/actions/workflow/status/davidcole1340/ext-php-rs/docs.yml?branch=master&label=guide)](https://davidcole1340.github.io/ext-php-rs)
![CI Workflow Status](https://img.shields.io/github/actions/workflow/status/davidcole1340/ext-php-rs/build.yml?branch=master)
Windows support (#128) * Preliminary Windows support * Start work on cross-platform build script * Fix compilation on macOS * Updated README, tidied up build script * Check linker version before starting compilation It doesn't seem like it's possible to change the linker from within the build script, however, we can retrieve the linker in use and give the user a suggestion if the linker will not work. * Switch to using Github repository for bindgen * Split Windows and Unix implementations into two files * Fix building on Windows * Remove `reqwest` and `zip` as dependencies on Unix * Fix guide tests on Windows * Started work on Windows CI * runs -> run * Use preinstalled LLVM on Windows * Debugging for Windows CI * Switch to upstream `rust-bindgen` master branch * Switch to `rust-lld` for Windows linking * Don't compile `cargo-php` on Windows * Switch to using skeptic for tests * cargo-php: Disable stub generation, fix ext install/remove The plan is to replace the stub generation by generating them with PHP code. This is cross-platform and means we don't need to worry about ABI. We also don't need to embed information into the library. * cargo-php: Fix on unix OS * Fix clippy lint * Updated README * Re-add CI for Unix + PHP 8.0 * Fix building on thread-safe PHP * Tidy up build scripts * Use dynamic lookup on Linux, test with TS Windows * Define `ZTS` when compiling PHP ZTS * Combine Windows and Unix CI, fix linking for Win32TS * Fix exclusions in build CI * rust-toolchain -> rust * Set LLVM version * Only build docs.rs on Ubuntu PHP 8.1 * Fix build on Linux thread-safe * Update guide example
2022-03-18 04:36:51 +01:00
[![Discord](https://img.shields.io/discord/115233111977099271)](https://discord.gg/dphp)
Bindings and abstractions for the Zend API to build PHP extensions natively in
Rust.
2021-04-09 02:36:30 +02:00
Windows support (#128) * Preliminary Windows support * Start work on cross-platform build script * Fix compilation on macOS * Updated README, tidied up build script * Check linker version before starting compilation It doesn't seem like it's possible to change the linker from within the build script, however, we can retrieve the linker in use and give the user a suggestion if the linker will not work. * Switch to using Github repository for bindgen * Split Windows and Unix implementations into two files * Fix building on Windows * Remove `reqwest` and `zip` as dependencies on Unix * Fix guide tests on Windows * Started work on Windows CI * runs -> run * Use preinstalled LLVM on Windows * Debugging for Windows CI * Switch to upstream `rust-bindgen` master branch * Switch to `rust-lld` for Windows linking * Don't compile `cargo-php` on Windows * Switch to using skeptic for tests * cargo-php: Disable stub generation, fix ext install/remove The plan is to replace the stub generation by generating them with PHP code. This is cross-platform and means we don't need to worry about ABI. We also don't need to embed information into the library. * cargo-php: Fix on unix OS * Fix clippy lint * Updated README * Re-add CI for Unix + PHP 8.0 * Fix building on thread-safe PHP * Tidy up build scripts * Use dynamic lookup on Linux, test with TS Windows * Define `ZTS` when compiling PHP ZTS * Combine Windows and Unix CI, fix linking for Win32TS * Fix exclusions in build CI * rust-toolchain -> rust * Set LLVM version * Only build docs.rs on Ubuntu PHP 8.1 * Fix build on Linux thread-safe * Update guide example
2022-03-18 04:36:51 +01:00
- Documentation: <https://docs.rs/ext-php-rs>
- Guide: <https://davidcole1340.github.io/ext-php-rs>
Add abstraction macros (#49) * Remove uses of `unwrap`, improve library safety * Started work on `#[php_function]` attribute * Added `PhantomData` to `ZendHashTable` Proper lifetimes for `HashTable` type * `#[php_function]` now accepts `Vec<T>` Refactored `ZendHashTable` iterators - there is now `Iter` and `IntoIter` depending on whether it will consume the HashTable or not. * Add support for nullable types * Allow `optional` parameter on attribute * Support primitive and `Option` return types * Tidied and refactored attribute * Added documentation for `#[php_function]` Implemented `IntoZval` for `Option<T>` when `IntoZval` is also implemented for `T`. `None` resolves to `null`. * Added `#[php_method]` attribute * Added `Callable` type, implemented `Drop` on `Zval` While implementing `Drop`, the `Copy` derivation was removed, however, this should not have been there in the first place (`Zval` is not valid for `Copy` if it contains a string). * Added some macro functions to example * Add support for boolean arguments * Added wrapper around binary data Future support for binary arguments with `#[php_function]` macros. Unpacking binary data is no longer unsafe. It was never really unsafe in the beginning, as we were always reading valid memory, just the contents of the data could not be trusted. * Added `#[php_module]` attribute, added support for binary arguments * Added defaults for functions * Add defaults for methods * Add startup function macro and prelude * Refactored method adding Now done through impl attribute * Don't rename functions - generate another internal fn Also hide all generated functions from docs * Generate startup function when not already defined * Add support for class and global constants * Updated `skel` project * Updated macro documentation, added executor globals * Remove `Copy` bound for HashMap to Zval * Updated documentation * Add `FromZval` trait, updated docs * Fixed clippy lints * Fixed ZTS executor globals * Fix clippy lint
2021-08-18 03:15:25 +02:00
## Example
Add abstraction macros (#49) * Remove uses of `unwrap`, improve library safety * Started work on `#[php_function]` attribute * Added `PhantomData` to `ZendHashTable` Proper lifetimes for `HashTable` type * `#[php_function]` now accepts `Vec<T>` Refactored `ZendHashTable` iterators - there is now `Iter` and `IntoIter` depending on whether it will consume the HashTable or not. * Add support for nullable types * Allow `optional` parameter on attribute * Support primitive and `Option` return types * Tidied and refactored attribute * Added documentation for `#[php_function]` Implemented `IntoZval` for `Option<T>` when `IntoZval` is also implemented for `T`. `None` resolves to `null`. * Added `#[php_method]` attribute * Added `Callable` type, implemented `Drop` on `Zval` While implementing `Drop`, the `Copy` derivation was removed, however, this should not have been there in the first place (`Zval` is not valid for `Copy` if it contains a string). * Added some macro functions to example * Add support for boolean arguments * Added wrapper around binary data Future support for binary arguments with `#[php_function]` macros. Unpacking binary data is no longer unsafe. It was never really unsafe in the beginning, as we were always reading valid memory, just the contents of the data could not be trusted. * Added `#[php_module]` attribute, added support for binary arguments * Added defaults for functions * Add defaults for methods * Add startup function macro and prelude * Refactored method adding Now done through impl attribute * Don't rename functions - generate another internal fn Also hide all generated functions from docs * Generate startup function when not already defined * Add support for class and global constants * Updated `skel` project * Updated macro documentation, added executor globals * Remove `Copy` bound for HashMap to Zval * Updated documentation * Add `FromZval` trait, updated docs * Fixed clippy lints * Fixed ZTS executor globals * Fix clippy lint
2021-08-18 03:15:25 +02:00
Export a simple function `function hello_world(string $name): string` to PHP:
2021-08-21 16:11:06 +02:00
```rust
Windows support (#128) * Preliminary Windows support * Start work on cross-platform build script * Fix compilation on macOS * Updated README, tidied up build script * Check linker version before starting compilation It doesn't seem like it's possible to change the linker from within the build script, however, we can retrieve the linker in use and give the user a suggestion if the linker will not work. * Switch to using Github repository for bindgen * Split Windows and Unix implementations into two files * Fix building on Windows * Remove `reqwest` and `zip` as dependencies on Unix * Fix guide tests on Windows * Started work on Windows CI * runs -> run * Use preinstalled LLVM on Windows * Debugging for Windows CI * Switch to upstream `rust-bindgen` master branch * Switch to `rust-lld` for Windows linking * Don't compile `cargo-php` on Windows * Switch to using skeptic for tests * cargo-php: Disable stub generation, fix ext install/remove The plan is to replace the stub generation by generating them with PHP code. This is cross-platform and means we don't need to worry about ABI. We also don't need to embed information into the library. * cargo-php: Fix on unix OS * Fix clippy lint * Updated README * Re-add CI for Unix + PHP 8.0 * Fix building on thread-safe PHP * Tidy up build scripts * Use dynamic lookup on Linux, test with TS Windows * Define `ZTS` when compiling PHP ZTS * Combine Windows and Unix CI, fix linking for Win32TS * Fix exclusions in build CI * rust-toolchain -> rust * Set LLVM version * Only build docs.rs on Ubuntu PHP 8.1 * Fix build on Linux thread-safe * Update guide example
2022-03-18 04:36:51 +01:00
#![cfg_attr(windows, feature(abi_vectorcall))]
Add abstraction macros (#49) * Remove uses of `unwrap`, improve library safety * Started work on `#[php_function]` attribute * Added `PhantomData` to `ZendHashTable` Proper lifetimes for `HashTable` type * `#[php_function]` now accepts `Vec<T>` Refactored `ZendHashTable` iterators - there is now `Iter` and `IntoIter` depending on whether it will consume the HashTable or not. * Add support for nullable types * Allow `optional` parameter on attribute * Support primitive and `Option` return types * Tidied and refactored attribute * Added documentation for `#[php_function]` Implemented `IntoZval` for `Option<T>` when `IntoZval` is also implemented for `T`. `None` resolves to `null`. * Added `#[php_method]` attribute * Added `Callable` type, implemented `Drop` on `Zval` While implementing `Drop`, the `Copy` derivation was removed, however, this should not have been there in the first place (`Zval` is not valid for `Copy` if it contains a string). * Added some macro functions to example * Add support for boolean arguments * Added wrapper around binary data Future support for binary arguments with `#[php_function]` macros. Unpacking binary data is no longer unsafe. It was never really unsafe in the beginning, as we were always reading valid memory, just the contents of the data could not be trusted. * Added `#[php_module]` attribute, added support for binary arguments * Added defaults for functions * Add defaults for methods * Add startup function macro and prelude * Refactored method adding Now done through impl attribute * Don't rename functions - generate another internal fn Also hide all generated functions from docs * Generate startup function when not already defined * Add support for class and global constants * Updated `skel` project * Updated macro documentation, added executor globals * Remove `Copy` bound for HashMap to Zval * Updated documentation * Add `FromZval` trait, updated docs * Fixed clippy lints * Fixed ZTS executor globals * Fix clippy lint
2021-08-18 03:15:25 +02:00
use ext_php_rs::prelude::*;
2021-11-20 02:33:41 +01:00
/// Gives you a nice greeting!
///
/// @param string $name Your name.
///
/// @return string Nice greeting!
Add abstraction macros (#49) * Remove uses of `unwrap`, improve library safety * Started work on `#[php_function]` attribute * Added `PhantomData` to `ZendHashTable` Proper lifetimes for `HashTable` type * `#[php_function]` now accepts `Vec<T>` Refactored `ZendHashTable` iterators - there is now `Iter` and `IntoIter` depending on whether it will consume the HashTable or not. * Add support for nullable types * Allow `optional` parameter on attribute * Support primitive and `Option` return types * Tidied and refactored attribute * Added documentation for `#[php_function]` Implemented `IntoZval` for `Option<T>` when `IntoZval` is also implemented for `T`. `None` resolves to `null`. * Added `#[php_method]` attribute * Added `Callable` type, implemented `Drop` on `Zval` While implementing `Drop`, the `Copy` derivation was removed, however, this should not have been there in the first place (`Zval` is not valid for `Copy` if it contains a string). * Added some macro functions to example * Add support for boolean arguments * Added wrapper around binary data Future support for binary arguments with `#[php_function]` macros. Unpacking binary data is no longer unsafe. It was never really unsafe in the beginning, as we were always reading valid memory, just the contents of the data could not be trusted. * Added `#[php_module]` attribute, added support for binary arguments * Added defaults for functions * Add defaults for methods * Add startup function macro and prelude * Refactored method adding Now done through impl attribute * Don't rename functions - generate another internal fn Also hide all generated functions from docs * Generate startup function when not already defined * Add support for class and global constants * Updated `skel` project * Updated macro documentation, added executor globals * Remove `Copy` bound for HashMap to Zval * Updated documentation * Add `FromZval` trait, updated docs * Fixed clippy lints * Fixed ZTS executor globals * Fix clippy lint
2021-08-18 03:15:25 +02:00
#[php_function]
pub fn hello_world(name: String) -> String {
format!("Hello, {}!", name)
}
// Required to register the extension with PHP.
#[php_module]
pub fn module(module: ModuleBuilder) -> ModuleBuilder {
module
}
```
2021-11-20 02:33:41 +01:00
Use [`cargo-php`] to build IDE stubs and install the extension:
```text
$ cargo install cargo-php
Installing cargo-php v0.1.0
$ cargo php stubs --stdout
Compiling example-ext v0.1.0
Finished dev [unoptimized + debuginfo] target(s) in 3.57s
<?php
// Stubs for example-ext
/**
* Gives you a nice greeting!
*
* @param string $name Your name.
*
* @return string Nice greeting!
*/
function hello_world(string $name): string {}
$ cargo php install --release
Compiling example-ext v0.1.0
Finished release [optimized] target(s) in 1.68s
Are you sure you want to install the extension `example-ext`? yes
$ php -m
[PHP Modules]
// ...
example-ext
// ...
```
Add abstraction macros (#49) * Remove uses of `unwrap`, improve library safety * Started work on `#[php_function]` attribute * Added `PhantomData` to `ZendHashTable` Proper lifetimes for `HashTable` type * `#[php_function]` now accepts `Vec<T>` Refactored `ZendHashTable` iterators - there is now `Iter` and `IntoIter` depending on whether it will consume the HashTable or not. * Add support for nullable types * Allow `optional` parameter on attribute * Support primitive and `Option` return types * Tidied and refactored attribute * Added documentation for `#[php_function]` Implemented `IntoZval` for `Option<T>` when `IntoZval` is also implemented for `T`. `None` resolves to `null`. * Added `#[php_method]` attribute * Added `Callable` type, implemented `Drop` on `Zval` While implementing `Drop`, the `Copy` derivation was removed, however, this should not have been there in the first place (`Zval` is not valid for `Copy` if it contains a string). * Added some macro functions to example * Add support for boolean arguments * Added wrapper around binary data Future support for binary arguments with `#[php_function]` macros. Unpacking binary data is no longer unsafe. It was never really unsafe in the beginning, as we were always reading valid memory, just the contents of the data could not be trusted. * Added `#[php_module]` attribute, added support for binary arguments * Added defaults for functions * Add defaults for methods * Add startup function macro and prelude * Refactored method adding Now done through impl attribute * Don't rename functions - generate another internal fn Also hide all generated functions from docs * Generate startup function when not already defined * Add support for class and global constants * Updated `skel` project * Updated macro documentation, added executor globals * Remove `Copy` bound for HashMap to Zval * Updated documentation * Add `FromZval` trait, updated docs * Fixed clippy lints * Fixed ZTS executor globals * Fix clippy lint
2021-08-18 03:15:25 +02:00
Calling the function from PHP:
```php
var_dump(hello_world("David")); // string(13) "Hello, David!"
```
2021-08-21 16:03:45 +02:00
For more examples read the library
2021-12-30 14:29:59 +01:00
[guide](https://davidcole1340.github.io/ext-php-rs).
2021-08-21 15:18:51 +02:00
2021-11-20 02:33:41 +01:00
[`cargo-php`]: https://crates.io/crates/cargo-php
2021-04-02 07:18:08 +02:00
## Features
- **Easy to use:** The built-in macros can abstract away the need to interact
with the Zend API, such as Rust-type function parameter abstracting away
interacting with Zend values.
- **Lightweight:** You don't have to use the built-in helper macros. It's
possible to write your own glue code around your own functions.
- **Extensible:** Implement `IntoZval` and `FromZval` for your own custom types,
allowing the type to be used as function parameters and return types.
Add abstraction macros (#49) * Remove uses of `unwrap`, improve library safety * Started work on `#[php_function]` attribute * Added `PhantomData` to `ZendHashTable` Proper lifetimes for `HashTable` type * `#[php_function]` now accepts `Vec<T>` Refactored `ZendHashTable` iterators - there is now `Iter` and `IntoIter` depending on whether it will consume the HashTable or not. * Add support for nullable types * Allow `optional` parameter on attribute * Support primitive and `Option` return types * Tidied and refactored attribute * Added documentation for `#[php_function]` Implemented `IntoZval` for `Option<T>` when `IntoZval` is also implemented for `T`. `None` resolves to `null`. * Added `#[php_method]` attribute * Added `Callable` type, implemented `Drop` on `Zval` While implementing `Drop`, the `Copy` derivation was removed, however, this should not have been there in the first place (`Zval` is not valid for `Copy` if it contains a string). * Added some macro functions to example * Add support for boolean arguments * Added wrapper around binary data Future support for binary arguments with `#[php_function]` macros. Unpacking binary data is no longer unsafe. It was never really unsafe in the beginning, as we were always reading valid memory, just the contents of the data could not be trusted. * Added `#[php_module]` attribute, added support for binary arguments * Added defaults for functions * Add defaults for methods * Add startup function macro and prelude * Refactored method adding Now done through impl attribute * Don't rename functions - generate another internal fn Also hide all generated functions from docs * Generate startup function when not already defined * Add support for class and global constants * Updated `skel` project * Updated macro documentation, added executor globals * Remove `Copy` bound for HashMap to Zval * Updated documentation * Add `FromZval` trait, updated docs * Fixed clippy lints * Fixed ZTS executor globals * Fix clippy lint
2021-08-18 03:15:25 +02:00
## Goals
Our main goal is to **make extension development easier.**
2021-04-02 07:18:08 +02:00
- Writing extensions in C can be tedious, and with the Zend APIs limited
documentation can be intimidating.
- Rust's modern language features and feature-full standard library are big
improvements on C.
- Abstracting away the raw Zend APIs allows extensions to be developed faster
and with more confidence.
- Abstractions also allow us to support future (and potentially past) versions
of PHP without significant changes to extension code.
Add abstraction macros (#49) * Remove uses of `unwrap`, improve library safety * Started work on `#[php_function]` attribute * Added `PhantomData` to `ZendHashTable` Proper lifetimes for `HashTable` type * `#[php_function]` now accepts `Vec<T>` Refactored `ZendHashTable` iterators - there is now `Iter` and `IntoIter` depending on whether it will consume the HashTable or not. * Add support for nullable types * Allow `optional` parameter on attribute * Support primitive and `Option` return types * Tidied and refactored attribute * Added documentation for `#[php_function]` Implemented `IntoZval` for `Option<T>` when `IntoZval` is also implemented for `T`. `None` resolves to `null`. * Added `#[php_method]` attribute * Added `Callable` type, implemented `Drop` on `Zval` While implementing `Drop`, the `Copy` derivation was removed, however, this should not have been there in the first place (`Zval` is not valid for `Copy` if it contains a string). * Added some macro functions to example * Add support for boolean arguments * Added wrapper around binary data Future support for binary arguments with `#[php_function]` macros. Unpacking binary data is no longer unsafe. It was never really unsafe in the beginning, as we were always reading valid memory, just the contents of the data could not be trusted. * Added `#[php_module]` attribute, added support for binary arguments * Added defaults for functions * Add defaults for methods * Add startup function macro and prelude * Refactored method adding Now done through impl attribute * Don't rename functions - generate another internal fn Also hide all generated functions from docs * Generate startup function when not already defined * Add support for class and global constants * Updated `skel` project * Updated macro documentation, added executor globals * Remove `Copy` bound for HashMap to Zval * Updated documentation * Add `FromZval` trait, updated docs * Fixed clippy lints * Fixed ZTS executor globals * Fix clippy lint
2021-08-18 03:15:25 +02:00
## Documentation
2021-08-21 16:03:45 +02:00
The library guide can be read
2022-08-27 18:05:24 +02:00
[here](https://davidcole1340.github.io/ext-php-rs).
2021-08-21 15:18:51 +02:00
The project is documented in-line, so viewing the `cargo` documentation is the
2021-09-05 08:46:38 +02:00
best resource at the moment. This can be viewed at [docs.rs].
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
Windows support (#128) * Preliminary Windows support * Start work on cross-platform build script * Fix compilation on macOS * Updated README, tidied up build script * Check linker version before starting compilation It doesn't seem like it's possible to change the linker from within the build script, however, we can retrieve the linker in use and give the user a suggestion if the linker will not work. * Switch to using Github repository for bindgen * Split Windows and Unix implementations into two files * Fix building on Windows * Remove `reqwest` and `zip` as dependencies on Unix * Fix guide tests on Windows * Started work on Windows CI * runs -> run * Use preinstalled LLVM on Windows * Debugging for Windows CI * Switch to upstream `rust-bindgen` master branch * Switch to `rust-lld` for Windows linking * Don't compile `cargo-php` on Windows * Switch to using skeptic for tests * cargo-php: Disable stub generation, fix ext install/remove The plan is to replace the stub generation by generating them with PHP code. This is cross-platform and means we don't need to worry about ABI. We also don't need to embed information into the library. * cargo-php: Fix on unix OS * Fix clippy lint * Updated README * Re-add CI for Unix + PHP 8.0 * Fix building on thread-safe PHP * Tidy up build scripts * Use dynamic lookup on Linux, test with TS Windows * Define `ZTS` when compiling PHP ZTS * Combine Windows and Unix CI, fix linking for Win32TS * Fix exclusions in build CI * rust-toolchain -> rust * Set LLVM version * Only build docs.rs on Ubuntu PHP 8.1 * Fix build on Linux thread-safe * Update guide example
2022-03-18 04:36:51 +01:00
- Linux, macOS or Windows-based operating system.
- PHP 8.0 or later.
- No support is planned for earlier versions of PHP.
- Rust.
- Currently, we maintain no guarantee of a MSRV, however lib.rs suggests Rust
1.57 at the time of writing.
- Clang 5.0 or later.
### Windows Requirements
- Extensions can only be compiled for PHP installations sourced from
<https://windows.php.net>. Support is planned for other installations
eventually.
- Rust nightly is required for Windows. This is due to the [vectorcall] calling
convention being used by some PHP functions on Windows, which is only
available as a nightly unstable feature in Rust.
- It is suggested to use the `rust-lld` linker to link your extension. The MSVC
linker (`link.exe`) is supported however you may run into issues if the linker
version is not supported by your PHP installation. You can use the `rust-lld`
linker by creating a `.cargo\config.toml` file with the following content:
```toml
# Replace target triple if you have a different architecture than x86_64
[target.x86_64-pc-windows-msvc]
linker = "rust-lld"
```
- The `cc` crate requires `cl.exe` to be present on your system. This is usually
bundled with Microsoft Visual Studio.
- `cargo-php`'s stub generation feature does not work on Windows. Rewriting this
functionality to be cross-platform is on the roadmap.
[vectorcall]: https://docs.microsoft.com/en-us/cpp/cpp/vectorcall?view=msvc-170
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
## Cargo Features
All features are disabled by default.
- `closure` - Enables the ability to return Rust closures to PHP. Creates a new
class type, `RustClosure`.
- `anyhow` - Implements `Into<PhpException>` for `anyhow::Error`, allowing you
to return anyhow results from PHP functions. Supports anyhow v1.x.
## Usage
2021-04-18 07:01:31 +02:00
Check out one of the example projects:
- [anonaddy-sequoia](https://gitlab.com/willbrowning/anonaddy-sequoia) - Sequoia
encryption PHP extension.
Windows support (#128) * Preliminary Windows support * Start work on cross-platform build script * Fix compilation on macOS * Updated README, tidied up build script * Check linker version before starting compilation It doesn't seem like it's possible to change the linker from within the build script, however, we can retrieve the linker in use and give the user a suggestion if the linker will not work. * Switch to using Github repository for bindgen * Split Windows and Unix implementations into two files * Fix building on Windows * Remove `reqwest` and `zip` as dependencies on Unix * Fix guide tests on Windows * Started work on Windows CI * runs -> run * Use preinstalled LLVM on Windows * Debugging for Windows CI * Switch to upstream `rust-bindgen` master branch * Switch to `rust-lld` for Windows linking * Don't compile `cargo-php` on Windows * Switch to using skeptic for tests * cargo-php: Disable stub generation, fix ext install/remove The plan is to replace the stub generation by generating them with PHP code. This is cross-platform and means we don't need to worry about ABI. We also don't need to embed information into the library. * cargo-php: Fix on unix OS * Fix clippy lint * Updated README * Re-add CI for Unix + PHP 8.0 * Fix building on thread-safe PHP * Tidy up build scripts * Use dynamic lookup on Linux, test with TS Windows * Define `ZTS` when compiling PHP ZTS * Combine Windows and Unix CI, fix linking for Win32TS * Fix exclusions in build CI * rust-toolchain -> rust * Set LLVM version * Only build docs.rs on Ubuntu PHP 8.1 * Fix build on Linux thread-safe * Update guide example
2022-03-18 04:36:51 +01:00
- [opus-php](https://github.com/davidcole1340/opus-php) - Audio encoder for the
Opus codec in PHP.
2022-03-30 14:52:46 +02:00
- [tomlrs-php](https://github.com/jphenow/tomlrs-php) - TOML data format parser.
- [php-scrypt](https://github.com/appwrite/php-scrypt) - PHP wrapper for the
scrypt password hashing algorithm.
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-03-09 08:58:07 +01:00
Add abstraction macros (#49) * Remove uses of `unwrap`, improve library safety * Started work on `#[php_function]` attribute * Added `PhantomData` to `ZendHashTable` Proper lifetimes for `HashTable` type * `#[php_function]` now accepts `Vec<T>` Refactored `ZendHashTable` iterators - there is now `Iter` and `IntoIter` depending on whether it will consume the HashTable or not. * Add support for nullable types * Allow `optional` parameter on attribute * Support primitive and `Option` return types * Tidied and refactored attribute * Added documentation for `#[php_function]` Implemented `IntoZval` for `Option<T>` when `IntoZval` is also implemented for `T`. `None` resolves to `null`. * Added `#[php_method]` attribute * Added `Callable` type, implemented `Drop` on `Zval` While implementing `Drop`, the `Copy` derivation was removed, however, this should not have been there in the first place (`Zval` is not valid for `Copy` if it contains a string). * Added some macro functions to example * Add support for boolean arguments * Added wrapper around binary data Future support for binary arguments with `#[php_function]` macros. Unpacking binary data is no longer unsafe. It was never really unsafe in the beginning, as we were always reading valid memory, just the contents of the data could not be trusted. * Added `#[php_module]` attribute, added support for binary arguments * Added defaults for functions * Add defaults for methods * Add startup function macro and prelude * Refactored method adding Now done through impl attribute * Don't rename functions - generate another internal fn Also hide all generated functions from docs * Generate startup function when not already defined * Add support for class and global constants * Updated `skel` project * Updated macro documentation, added executor globals * Remove `Copy` bound for HashMap to Zval * Updated documentation * Add `FromZval` trait, updated docs * Fixed clippy lints * Fixed ZTS executor globals * Fix clippy lint
2021-08-18 03:15:25 +02:00
Contributions welcome include:
- Documentation expansion (examples in particular!)
- Safety reviews (especially if you have experience with Rust and the Zend API).
- Bug fixes and features.
- Feature requests.
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
2021-08-21 16:03:45 +02:00
- Apache License, Version 2.0 ([LICENSE_APACHE] or
<http://www.apache.org/licenses/LICENSE-2.0>)
- MIT license ([LICENSE_MIT] or <http://opensource.org/licenses/MIT>)
at your option.
2021-08-21 16:03:45 +02:00
[LICENSE_APACHE]: https://github.com/davidcole1340/ext-php-rs/blob/master/LICENSE_APACHE
[LICENSE_MIT]: https://github.com/davidcole1340/ext-php-rs/blob/master/LICENSE_MIT
2021-09-05 08:46:38 +02:00
[docs.rs]: https://docs.rs/ext-php-rs