Notes
Slide Show
Outline
1
Python in PHP: Internals
  • Jon Parise <jon@php.net>


  • 2002 International PHP Conference
  • Frankfurt, Germany
  • November 6, 2002
2
About This Session
  • Some familiarity with PHP extensions is expected.
  • Python knowledge is not required, but familiarity will be helpful.
3
About Me
  • Bachelor of Science in Information Technology from the Rochester Institute of Technology
  • Completing Masters of Entertainment Technology at Carnegie Mellon University
  • Software engineer at Maxis on The Sims Online


  • Long history of involvement with PHP, PEAR, and The Horde Project
  • Co-author of Professional PHP4 Programming
  • Long-time Pythonista!
4
Ground Rules
  • Questions
    • Ask for clarification at any time.
    • Please save scope-expanding questions until the end.

  • Pacing
    • Ask me to slow down if I move too quickly.
    • I’m from New Jersey.
5
Session Agenda
  • Overview
  • Extension architecture
  • Type conversions
  • Object handling
  • PHP Python Module
  • Next Steps
  • Questions
6
Confessions
7
What Is The Python Extension?
  • Embedded Python interpreter
  • Interface handled by PHP extension
  • Python-to-PHP object proxy
  • Handles type conversions
  • Exposes PHP environment to Python
8
PHP Extension Architecture
9
Python Extension Architecture
10
How It Happens
  • PHP starts and initializes the Python extension.
  • The Python extension initializes the Python interpreter.
  • Python-related operations are performed in PHP.
  • PHP shuts down the Python extension, which cleans up the Python interpreter.
11
Executing Python Code
12
Executing More Python Code
13
How It Works
  • Extension initialization
  • Python initialization
  • Python code execution
  • Extension shutdown
  • Python shutdown
  • PHP_MINIT_FUNCTION


  • Py_Initialize()


  • PyRun_SimpleString()


  • PHP_MSHUTDOWN_FUNCTION


  • Py_Finalize()
14
py_eval()
  • Executes a string of Python code
  • Uses PyRun_SimpleString()
  • Only returns success or failure
  • Always executes in the same Python environment
15
Calling Python Functions
16
py_call()
  • Calls a function of a module
  • Uses PyObject_CallObject()
  • Implicitly imports the module
  • Allows parameter passing
  • Returns the result of the function call
17
PHP to Python Type Conversion
  • PHP
  • Boolean
  • Long (Integer)
  • Double (Float)
  • String
  • Null
  • Python
  • Integer
  • Long
  • Double
  • String
  • None
18
Python to PHP Type Conversion
  • Python
  • Integer
  • Long
  • Float
  • String
  • None
  • PHP
  • Long
  • Long
  • Double
  • String
  • NULL
19
Arrays, Sequences & Mappings
  • PHP only has hashes, indexed by:
    • Numbers: array(1, 2)
    • Strings: array('one' => 1, 'two' => 2)
  • Python has sequences:
    • Tuples: (1, 2)
    • Lists: [1, 2]
  • And mappings:
    • Dictionaries: {'one': 1, 'two': 2}
20
Array Conversions
  • PHP arrays (hashes) are always converted to Python dictionaries.
  • Results in no data loss.
21
Array Conversion Exceptions
  • Arrays of arguments are always passed as a tuple.
  • String keys are discarded.
22
Sequence Conversions
  • Python tuples and lists are always converted to PHP arrays.
  • The numerical indices are preserved.
23
Mapping Conversions
  • Python dictionaries are always converted to PHP associative arrays.
  • Keys will be converted to strings.
24
About Python Objects
  • The Python extension proxies Python objects
  • Python objects are represented as instances of a "python" class in PHP
25
Creating Python Objects
  • Python objects are creating using the Python() object constructor
26
Manipulating Python Objects
  • Python objects work like PHP objects
27
Python Class Internals
28
Storing Python Objects
  • Once created, Python objects are stored in the engine symbol hash
29
Retrieving Python Objects
  • Python objects are retrieved by their handle
30
Handling Method Calls
  • If the method name is 'python':
    • Import the requested module
    • Construct a new Python object
    • Register and return the new object
  • Else:
    • Retrieve the Python object handle
    • Look for the requested method
    • Call the method with any arguments
    • Convert and return the result
31
The Case-Sensitivity Problem
  • PHP converts all function and method calls to lowercase internally
    • You type: $test->GetSomeValue()
    • PHP sees: $test->getsomevalue()

  • Python is case-sensitive, making it impossible to call any function or method with capital letters from PHP!
32
The Case-Sensitivity Solution
  • Build a map of Python object methods!
33
Handling Object Attributes
  • Both "get" and "set" operations call the same attribute handler


  • Retrieve the requested Python object
  • Find the named attribute
  • Convert and return its value


  • Note:  No case-sensitivity hacks necessary here!
34
The PHP Python Module
  • Allows access to the PHP environment from within the embedded Python environment





  • Functionality is still very limited!
35
php.var() Implementation
36
Building the Python Extension
37
Next Steps
  • Extending Python objects from PHP
  • Exposing PHP objects to Python
  • More namespace sharing
    • Global and local variables
  • Multiple Python interpreters
  • Better threading support
  • Fix bugs
38
Questions
39
References

  • Presentation Slides
  • http://www.csh.rit.edu/~jon/pres/


  • Python in PHP
  • http://www.csh.rit.edu/~jon/projects/pip/


  • Python
  • http://www.python.org/