jayeshmepani / jpl-moshier-ephemeris-php
PHP FFI wrapper for the JME native ephemeris library with direct jme_* API access and bundled runtime library support
Package info
github.com/jayeshmepani/jpl-moshier-ephemeris-php
pkg:composer/jayeshmepani/jpl-moshier-ephemeris-php
Fund package maintenance!
Requires
- php: ^8.3
- ext-ffi: *
Requires (Dev)
- laravel/pint: ^1.29
- mockery/mockery: ^1.6
- nunomaduro/collision: ^8.0
- orchestra/testbench: ^9.0 || ^10.0
- phpstan/extension-installer: ^1.3
- phpstan/phpstan: ^2.0
- phpunit/phpunit: ^11.0
- rector/rector: ^2.0
Conflicts
- php: <8.3
README
PHP 8.3+ FFI wrapper for the independent JPL Moshier Ephemeris C library.
This package wraps the project-owned jme_* C API from the JPL Moshier Ephemeris native library.
Contract
- Primary public functions:
jme_* - Primary public constants:
JME_* - Current wrapper target: all 204 public
jme_*functions tracked by the native API inventory - Native headers contain 462
JME_*tokens including two header guards; the PHP wrapper exposes the semantic native constants and preserves existing compatibility aliases where present - Native backend:
libjme.so,libjme.dylib, orjme.dll - No hidden rounding, output reshaping, or dropped status/error buffers
- Incomplete native behavior should return
JME_ERRfrom the C library rather than pretending to provide production ephemeris output
Engine Selection
The low-level JmeEphFFI class exposes every native function directly. The optional Laravel-style JmeService::calc() convenience method sets ENGINE=... through jme_set_astro_models() and then calls jme_calc():
AUTO: let the native C core choose its standard JPL/fallback policyJPL: require JPL kernel-backed behaviorMOSHIER: force Moshier analytical behaviorVSOP_ELP_MEEUS: force VSOP87/ELP2000/Meeus analytical behavior
Use direct jme_jpl_* calls for raw JPL/CALCEPH kernel access. The PHP layer does not normalize or reinterpret native outputs.
Requirements
- PHP
^8.3 - PHP FFI extension (
ext-ffi) - A compiled JME shared library
- The matching CALCEPH runtime library when using the JPL/CALCEPH backend
By default, the wrapper loads the bundled platform library from this package, for example:
vendor/jayeshmepani/jpl-moshier-ephemeris-php/libs/linux-x64/libjme.so
Override it with:
export JME_LIBRARY_PATH=/path/to/libjme.so
Runtime Libraries and Kernels
Composer installs prebuilt runtime archives from this repository's GitHub releases when a local library is not already present. Each runtime archive contains:
- JME:
jme.dll,libjme.so, orlibjme.dylib - CALCEPH: the platform runtime library required by JPL kernel mode
JPL .bsp kernels are not shipped in this package. Download them separately from the native JME kernel release:
https://github.com/jayeshmepani/jpl-ephemeris/releases/tag/jpl-kernels
Supported kernel choices:
de440s.bsp- smallde440.bsp- mediumde441.bsp- large, published as split release parts because the full file exceeds GitHub's single asset size limit
Quick Start
use FFI; use JmeEph\FFI\JmeEphFFI; $jme = new JmeEphFFI(); $jd = $jme->jme_julian_day( 2000, 1, 1, 12.0, JmeEphFFI::JME_CALENDAR_GREGORIAN ); $xx = $jme->getFFI()->new('double[6]'); $error = $jme->getFFI()->new('char[256]'); $result = $jme->jme_calc_ut( $jd, JmeEphFFI::JME_BODY_SUN, JmeEphFFI::JME_CALC_NONE, $xx, $error ); if ($result === JmeEphFFI::JME_OK) { echo "Sun longitude: {$xx[0]}\n"; } else { echo 'JME error: ' . FFI::string($error) . "\n"; }
Test
composer install
composer verify:surface
composer test
The test suite verifies the PHP wrapper against the JME-native contract, including function inventory coverage, constant inventory coverage, key JME_* values, and convenience calculation paths. Set JME_SOURCE_PATH if the native source tree is not at the default local path.
composer verify:surface performs an exact low-level surface audit of the generated wrapper:
204trackedjme_*declarations compared against the native header prototypes462JME_*constants compared against native header values- numeric constants cross-checked through a compiled C probe instead of trusting PHP generation alone