30.Jan 2007
C-Funktionen mit PHP
Um in PHP C-Funktionen nutzen zu können, muss man diese in einer eigenen Extension verpacken. Dann können diese wie normale Funktionen aufgerufen werden. Dieser Weg ist etwas aufwendiger als in Python.
// myExt.c
#include "php.h"
PHP_FUNCTION(fibonacci)
{
int n;
if ( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC,
"l|l", &n ) == FAILURE )
RETURN_NULL();
RETURN_LONG(fibonacci(n));
}
int fibonacci( int n )
{
if( n > 2 )
return fibonacci( n - 1 ) + fibonacci( n - 2 );
else
return 1;
}
static function_entry myExt_functions[] = {
PHP_FE(fibonacci, NULL)
{ NULL, NULL, NULL }
};
zend_module_entry myExt_module_entry = {
STANDARD_MODULE_HEADER,
"myExt", // Name der Extension
myExt_functions,
NULL, NULL, NULL, NULL, NULL,
"1.0", // Version
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(myExt)
Übersetzt wird die Extension mit den Kommandos
gcc -fpic -c `php-config --includes` myExt.c
gcc -shared myExt.o -o myExt.so
Um die Bibliothek einzubinden, kopiert man sie in das PHP Modulverzeichnis und ergäzt die php.ini um die Zeile extension=myExt.so
. Zum Testen der Performanceunterschiede kann man folgendes PHP-Skript ausprobieren:
function php_fibonacci( $n )
{
if ( $n > 2 )
return php_fibonacci( $n - 2 ) + php_fibonacci( $n - 1 );
else
return 1;
}
$t = time();
echo php_fibonacci(40);
echo ":" . ( time() - $t ) . "\n";
$t = time();
echo fibonacci(40);
echo ":" . ( time() - $t ) . "\n";
Auf meinem Testrechner benötigt die C-Variante dabei 2 Sekunden und das Skript ca. vier Minuten.