ripht_php_sapi/
lib.rs

1//! Rust bindings to PHP's Server API (SAPI) for embedding PHP in Rust applications.
2//!
3//! This crate provides a safe interface to execute PHP scripts from Rust, handling
4//! the request lifecycle, I/O callbacks, and superglobal population automatically.
5//!
6//! # Execution Model
7//!
8//! PHP runs in NTS (non-thread-safe) mode with one request executing at a time.
9//! Each request gets isolated state that's cleaned up after execution.
10//!
11//! # Example
12//!
13//! ```no_run
14//! use ripht_php_sapi::{RiphtSapi, WebRequest};
15//!
16//! let php = RiphtSapi::instance();
17//! let script = std::path::Path::new("/var/www/index.php");
18//!
19//! let request = WebRequest::get()
20//!     .with_uri("/api/users?id=42")
21//!     .build(script)
22//!     .expect("...");
23//!
24//! let result = php.execute(request).expect("execute");
25//! println!("Status: {}, Body: {}", result.status_code(), result.body_string());
26//! ```
27
28#![allow(static_mut_refs)]
29
30pub mod adapters;
31pub mod execution;
32
33mod sapi;
34
35pub use adapters::{
36    AdapterError, CliRequest, CliRequestError, Method, PhpSapiAdapter,
37    WebRequest, WebRequestError,
38};
39
40pub use sapi::{ExecutionError, Executor, RiphtSapi, SapiError};
41
42pub use execution::{
43    ExecutionContext, ExecutionHooks, ExecutionMessage, ExecutionResult,
44    NoOpHooks, OutputAction, ResponseHeader, StreamingCallback, SyslogLevel,
45};
46
47pub mod prelude {
48    pub use crate::{
49        AdapterError, CliRequest, CliRequestError, ExecutionContext,
50        ExecutionHooks, ExecutionMessage, ExecutionResult, Executor, Method,
51        NoOpHooks, OutputAction, PhpSapiAdapter, ResponseHeader, RiphtSapi,
52        SapiError, StreamingCallback, SyslogLevel, WebRequest, WebRequestError,
53    };
54
55    #[cfg(feature = "http")]
56    pub use crate::{from_http_parts, from_http_request};
57}
58
59#[cfg(feature = "http")]
60pub use adapters::{from_http_parts, from_http_request};
61
62#[cfg(test)]
63use std::path::PathBuf;
64
65#[cfg(test)]
66pub fn php_script_path(name: &str) -> PathBuf {
67    PathBuf::from(env!("CARGO_MANIFEST_DIR"))
68        .join("tests/php_scripts")
69        .join(name)
70}