-
Notifications
You must be signed in to change notification settings - Fork 2
/
README
151 lines (104 loc) · 3.91 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
PHP/Erlang 0.0.3
Copyright 2008 Itai Zukerman <zukerman@math-hat.com>
INTRODUCTION
PHP/Erlang aims to be a PHP extension with a simple set of functions
for turning a PHP thread into an Erlang C-node. With this extension,
you can shift backend tasks to Erlang, where they belong: caching,
chat, database proxying, everything.
PHP/Erlang is released under the LPGL. See COPYING and COPYING.LESSER
for details.
INSTALLATION
Requirements.
You must have both the PHP and Erlang development headers and
the Erlang ei (and possibly erl_interface) libraries. In Debian
systems these are provided by php5-dev and erlang-dev.
Building.
$ phpize
$ ./configure --enable-erlang
$ make
Installation.
$ cp modules/erlang.so /path/to/php5/modules
Edit php.ini and add:
extension=erlang.so
erlang.node=node@host
erlang.cookie=secret
replacing node@host with your local Erlang node, and erlang.cookie
with the secret cookie for that node.
USAGE
This extension provides these functions:
erlang_init()
Must be called before any other erlang functions. This insures that
we have a (persistent) connection to the node defined in the php.ini.
erlang_self()
Return the PID of the PHP C-node as a resource.
erlang_term( $format, $params )
Build an Erlang term from a format string and an array of params.
The format string specifies the structure of the term with "{", "}",
"[", "|", and "]" chars, and includes values from the params with:
~a atom
~s string
~b binary
~l long
~d double
~p PID
~t an Erlang term
Params are used in the order in which they appear in the format
string. For example:
erlang_term( "{~a,~s}", array( "search", "apples" ) );
erlang_term( "{~a,[~s,~s,~s]}", array( "names", "bob", "joe", "marge" ) );
erlang_term( "{~p,~a,~d}", array( erlang_self(), "sqrt", 153 ) );
erlang_term( "{~a,~t}", array( "item", erlang_term( "{~s}", array( "something" ) ) ) );
erlang_extract( $term )
Take an Erlang term from erlang_receive() or constructed with
erlang_term() and turn it into PHP data. Tuples and lists are
turned into arrays, strings, longs, and doubles into the
corresponding values, and PIDs into PID resources. For example:
erlang_extract( {ok,["a","b"]} ) => array( "ok", array( "a", "b" ) )
erlang_extract( {sqrt,123.4} ) => array( "sqrt", 123.4 )
erlang_receive( [ $timeout ] )
Wait for an Erlang term for up to timeout milliseconds. On timeout
or error, return FALSE. Otherwise return a term to be decoded with
erlang_extract().
erlang_send( $pid, $term [, $timeout ] )
Send a term (probably constructed with erlang_term()) to the PID,
waiting at most timeout milliseconds for success, returning FALSE on
error.
erlang_send_reg( $name, $term [, $timeout ] )
Send a term (probably constructed with erlang_term()) to the
registered name, waiting at most timeout milliseconds for success,
returning FALSE on error.
EXAMPLE
On the Erlang side:
-module( echo ).
-export( [ start/0, echo/0 ] ).
start() ->
register( echo, spawn( ?MODULE, echo, [ ] ) ).
echo() ->
receive
{ Pid, X } ->
Pid ! X,
echo();
quit -> ok
end.
On the PHP side:
erlang_init();
$self = erlang_self();
for( $i = 0; $i < 4; $i++ ) {
$message = erlang_term( "{~p,~s}", array( $self, "foo{$i}" ) );
erlang_send_reg( "echo", $message, 100 );
}
for( $i = 0; $i < 4; $i++ ) {
$message = erlang_receive( 100 );
if( $message !== FALSE ) {
print_r( erlang_extract( $message ) );
} else {
echo( "No message received!\n" );
}
}
DEBUGGING
To trace the Erlang connects, sends, receives, etc., try this:
$ export EI_TRACELEVEL=8
before running Apache or your PHP script. It invokes debugging within
the Erlang library, which should (I think) show up in your Apache/PHP
error logs or in stderr.
$Date$