120 likes | 135 Views
Explore the Phalanger system, which allows running PHP on .NET Framework. Learn about its main features, performance benchmarks, interesting issues, and future developments.
E N D
Outline • Introduction to the Phalanger System • main features and goals • Why PHP on .NET Framework? • Performance benchmarks • Interesting Issues • inclusions, local variables optimization, multi-version types/functions • accessing .NET objects, adding fields on .NET objects at run-time • using PHP native libraries • Future Work: Phalanger 2.0 • PHP/CLR – extending PHP to the first-class .NET language • Support for Mono Platform
Phalanger • Extends the family of .NET languages with PHP versions 4, 5, and 6 • introduces language extensions for using .NET types (PHP/CLR) • Makes it possible to run existing PHP applications on ASP.NET web server • Significant performance improvement • Higher reliability of the web server • Better configurability • More errors revealed by the compilation • Source-free application deployment • Brings virtually all PHP libraries to .NET Framework • migration from PHP interpreter is simple in practice without additional costs • Enriches both worlds • PHP applications with the functionality of the .NET platform • .NET applications with a possibility to use a popular dynamic language • Integrates PHP with Visual Studio .NET
PHP Sample include "a.php"; class C extends D implements I, J { public function m($a, $b = 1, $c = array(3,2,1)) { $f = "sort"; $f($c); $x = "b"; if ($$x) { function f() { echo "version 1"; } } else { function f() { echo "version 2"; } } f(); eval('$a++;'); } private $d; function__get($field_name) { return$d->$field_name; } function __set($field_name, $value) { $d->$field_name = $value; } }
Micro-benchmarks • each operation performed 10M times in a loop; machine: Pentium M Dothan 1.8GHz/2MB cache • the lesser the better
MSDE 2000 SP3 MySQL 4.1.11 PHP + Zend Optimizer Phalanger 1.0 PHP phpBB Benchmark Results (Apache 2.0.54) requests per second the greater the better
Major Issues • missing specification • “correctness” criteria: existing applications should work well without modifications • inclusions • standard PHP mode • inclusions similar to C language; the included file needn’t to be known at compile-time • pure mode (since Phalanger 2.0) • C# like project – unconditional declarations visible in all files comprising the project • multi-version and compile-time unknown types/functions • classes and functions can be declared conditionally in multiple versions • classes and functions can be generated at run-time • class can extend/implement compile-time unknown class/interface • local variables optimization • creating a hash table for each call is expensive and unnecessary • compile-time known variables can be stored in CLR locals in majority cases
Using PHP Native Extensions • a necessity for a seamless migration from PHP interpreter • PHP • Many functions and classes implemented in PHP extensions • php_imap.dll, php_pdf.dll, php_sockets.dll, php_gtk.dll, … • PHP interpreter exposes so called Zend API to extensions (php4ts.dll) • Phalanger • Makes the functionality in PHP extensions available for any .NET app. • managed wrappers • encapsulates and shields out native implementation • Extension Manager • emulates the PHP interpreter environment (Zend API) • within the application process using the extension or • in a separate process, isolating untrustworthy extensions Native Code php_imap.dll Managed Code Mixed Code Application (PHP, C#, …) Extension Wrapper Extension Manager C++/CLIphp4ts.dll php_pdf.dll … Zend API optional process boundary bridged by .NET Remoting via Shared Memory Channel
php_sockets.dll php_sockets.mng.dll .method public hidebysig static int32 socket_write( class [PhpNetCore]PHP.Core.PhpResource socket, string buf, int32 length) cil managed { .custom instance void PhpNetCore]PHP.Core.ImplementsFunctionAttribute ... // ... call object [PhpNetCore]PHP.Core.Externals::InvokeFunction(...) // ... ret } .method public hidebysig static int32 socket_write( class [PhpNetCore]PHP.Core.PhpResource socket, string buf) cil managed { .custom instance void PhpNetCore]PHP.Core.ImplementsFunctionAttribute ... // ... call object [PhpNetCore]PHP.Core.Externals::InvokeFunction(...) // ... ret } ... PHP_FUNCTION(socket_write) { zend_parse_parameters(...); ZEND_FETCH_RESOURCE(...); // ... RETURN_LONG(...); } ... php_sockets.xml ... <functionreturnType="int" name="socket_write" > <paramtype="resource" name="socket" /> <paramtype="string" name="buf" /> <paramoptional="true" type="int" name="length" /> </function> ... Managed Wrappers • Assemblies generated automatically from native extensions and optional type information in XML format
Summary & Future Work • Phalanger 1.0 • goal achieved: to make existing application working under .NET • much better performance in practice • final version available for download • Phalanger 2.0, PHP/CLR • Make PHP a first-class language for .NET • extensions to the language enabling PHP programs to work directly with .NET types, methods, delegates, events, generics, … • extending .NET classes, overload resolution, run-time fields addition, … • multi-threading • support for Language Integrated Query (LINQ) • minimize necessary language modifications • keep the dynamic nature of the language • e.g. run-time specified generic type arguments, etc. • ASP.NET Controls in PHP etc.
Related Work • Dynamic languages on .NET • IronPython • Python is a bit more dynamic • e.g. replacing methods at run-time • less optimizations possible • PyStone benchmark • overall improvement by factor 1.84 • micro-benchmark results range from 10x faster to 10x slower • Ruby, Perl, JScript, … • PHP compilers • Resin Quercus • PHP to Java translation, compilation to JVM byte-code • Roadsend Compiler • PHP to C translation, compilation to native code