php_process 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.10
1
+ 0.0.11
data/lib/php_process.rb CHANGED
@@ -3,6 +3,7 @@ require "tsafe" if !Kernel.const_defined?(:Tsafe)
3
3
  require "php-serialize4ruby"
4
4
  require "base64"
5
5
  require "open3"
6
+ require "thread"
6
7
 
7
8
  #This class starts a PHP-process and proxies various calls to it. It also spawns proxy-objects, which can you can call like they were normal Ruby-objects.
8
9
  #===Examples
@@ -37,6 +38,7 @@ class Php_process
37
38
  @args = args
38
39
  @debug = @args[:debug]
39
40
  @send_count = 0
41
+ @send_mutex = Mutex.new
40
42
 
41
43
  @responses = Tsafe::MonHash.new
42
44
 
@@ -276,12 +278,16 @@ class Php_process
276
278
  def send_real(hash)
277
279
  $stderr.print "Sending: #{hash[:args]}\n" if @debug and hash[:args]
278
280
  str = Base64.strict_encode64(PHP.serialize(hash))
279
- @stdin.write("send:#{@send_count}:#{str}\n")
280
- id = @send_count
281
- @send_count += 1
282
281
 
283
- #Slep a tiny bit to wait for first answer.
284
- sleep 0.001
282
+ #Find new ID for the send-request.
283
+ id = nil
284
+ @send_mutex.synchronize do
285
+ id = @send_count
286
+ @send_count += 1
287
+ end
288
+
289
+ @responses[id] = Queue.new
290
+ @stdin.write("send:#{id}:#{str}\n")
285
291
 
286
292
  #Then return result.
287
293
  return read_result(id)
@@ -289,23 +295,12 @@ class Php_process
289
295
 
290
296
  #Searches for a result for a ID and returns it. Runs 'check_alive' to see if the process should be interrupted.
291
297
  def read_result(id)
292
- loop do
293
- if @responses.key?(id)
294
- resp = @responses[id]
295
- @responses.delete(id)
296
-
297
- if resp.is_a?(Hash) and resp["type"] == "error"
298
- raise "#{resp["msg"]}\n\n#{resp["bt"]}"
299
- end
300
-
301
- $stderr.print "Found answer #{id} - returning it.\n" if @debug
302
- return read_parsed_data(resp)
303
- end
304
-
305
- check_alive
306
- sleep 0.01
307
- $stderr.print "Waiting for answer to ID: #{id}\n" if @debug
308
- end
298
+ $stderr.print "Waiting for answer to ID: #{id}\n" if @debug
299
+ resp = @responses[id].pop
300
+ @responses.delete(id)
301
+ raise "#{resp["msg"]}\n\n#{resp["bt"]}" if resp.is_a?(Hash) and resp["type"] == "error"
302
+ $stderr.print "Found answer #{id} - returning it.\n" if @debug
303
+ return read_parsed_data(resp)
309
304
  end
310
305
 
311
306
  #Checks if something is wrong. Maybe stdout got closed or a fatal error appeared on stderr?
@@ -357,7 +352,7 @@ class Php_process
357
352
  $stderr.print "Received: #{id}:#{type}:#{args}\n" if @debug
358
353
 
359
354
  if type == "answer"
360
- @responses[id] = args
355
+ @responses[id].push(args)
361
356
  elsif type == "send"
362
357
  if args["type"] == "call_back_created_func"
363
358
  Thread.new do
data/php_process.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{php_process}
8
- s.version = "0.0.10"
8
+ s.version = "0.0.11"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Kasper Johansen"]
12
- s.date = %q{2012-08-10}
12
+ s.date = %q{2012-10-17}
13
13
  s.description = %q{Spawns a PHP process and proxies calls to it, making it possible to proxy objects and more.}
14
14
  s.email = %q{k@spernj.org}
15
15
  s.extra_rdoc_files = [
@@ -151,6 +151,7 @@ describe "PhpProcess" do
151
151
 
152
152
  #Send argument 'kasper' which will be what "$callback_from_php" will be changed to.
153
153
  func.call("kasper")
154
+ sleep 0.1
154
155
  raise "Expected callback from PHP to change variable but it didnt: '#{$callback_from_php}'." if $callback_from_php != "kasper"
155
156
 
156
157
 
@@ -162,6 +163,29 @@ describe "PhpProcess" do
162
163
  raise "Cache count should be below #{cache_info1["count"]} but it wasnt: #{cache_info2}." if cache_info2["count"] >= cache_info1["count"]
163
164
 
164
165
 
166
+ #Test thread-safety and more.
167
+ ts = []
168
+ 1.upto(25) do |tcount|
169
+ ts << Thread.new do
170
+ str = $php.func("substr", "Kasper Johansen", 0, 100)
171
+
172
+ 0.upto(250) do
173
+ kasper_str = $php.func("substr", str, 0, 6)
174
+ johansen_str = $php.func("substr", str, 7, 15)
175
+
176
+ raise "Expected 'Kasper' but got '#{kasper_str}'." if kasper_str != "Kasper"
177
+ raise "Expected 'Johansen' but got '#{johansen_str}'." if johansen_str != "Johansen"
178
+
179
+ STDOUT.print "."
180
+ end
181
+ end
182
+ end
183
+
184
+ ts.each do |t|
185
+ t.join
186
+ end
187
+
188
+
165
189
  #Destroy the object.
166
190
  $php.destroy
167
191
  end
metadata CHANGED
@@ -1,105 +1,103 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: php_process
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.11
4
5
  prerelease:
5
- version: 0.0.10
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Kasper Johansen
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2012-08-10 00:00:00 +02:00
12
+ date: 2012-10-17 00:00:00.000000000 +02:00
14
13
  default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
17
16
  name: php-serialize4ruby
18
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: &15324340 !ruby/object:Gem::Requirement
19
18
  none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
24
23
  type: :runtime
25
24
  prerelease: false
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
25
+ version_requirements: *15324340
26
+ - !ruby/object:Gem::Dependency
28
27
  name: wref
29
- requirement: &id002 !ruby/object:Gem::Requirement
28
+ requirement: &15323460 !ruby/object:Gem::Requirement
30
29
  none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: "0"
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
35
34
  type: :runtime
36
35
  prerelease: false
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
36
+ version_requirements: *15323460
37
+ - !ruby/object:Gem::Dependency
39
38
  name: tsafe
40
- requirement: &id003 !ruby/object:Gem::Requirement
39
+ requirement: &15322720 !ruby/object:Gem::Requirement
41
40
  none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- version: "0"
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
46
45
  type: :runtime
47
46
  prerelease: false
48
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
47
+ version_requirements: *15322720
48
+ - !ruby/object:Gem::Dependency
50
49
  name: rspec
51
- requirement: &id004 !ruby/object:Gem::Requirement
50
+ requirement: &15322080 !ruby/object:Gem::Requirement
52
51
  none: false
53
- requirements:
52
+ requirements:
54
53
  - - ~>
55
- - !ruby/object:Gem::Version
54
+ - !ruby/object:Gem::Version
56
55
  version: 2.8.0
57
56
  type: :development
58
57
  prerelease: false
59
- version_requirements: *id004
60
- - !ruby/object:Gem::Dependency
58
+ version_requirements: *15322080
59
+ - !ruby/object:Gem::Dependency
61
60
  name: rdoc
62
- requirement: &id005 !ruby/object:Gem::Requirement
61
+ requirement: &15321440 !ruby/object:Gem::Requirement
63
62
  none: false
64
- requirements:
63
+ requirements:
65
64
  - - ~>
66
- - !ruby/object:Gem::Version
67
- version: "3.12"
65
+ - !ruby/object:Gem::Version
66
+ version: '3.12'
68
67
  type: :development
69
68
  prerelease: false
70
- version_requirements: *id005
71
- - !ruby/object:Gem::Dependency
69
+ version_requirements: *15321440
70
+ - !ruby/object:Gem::Dependency
72
71
  name: bundler
73
- requirement: &id006 !ruby/object:Gem::Requirement
72
+ requirement: &15320700 !ruby/object:Gem::Requirement
74
73
  none: false
75
- requirements:
76
- - - ">="
77
- - !ruby/object:Gem::Version
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
78
77
  version: 1.0.0
79
78
  type: :development
80
79
  prerelease: false
81
- version_requirements: *id006
82
- - !ruby/object:Gem::Dependency
80
+ version_requirements: *15320700
81
+ - !ruby/object:Gem::Dependency
83
82
  name: jeweler
84
- requirement: &id007 !ruby/object:Gem::Requirement
83
+ requirement: &15320000 !ruby/object:Gem::Requirement
85
84
  none: false
86
- requirements:
85
+ requirements:
87
86
  - - ~>
88
- - !ruby/object:Gem::Version
87
+ - !ruby/object:Gem::Version
89
88
  version: 1.8.3
90
89
  type: :development
91
90
  prerelease: false
92
- version_requirements: *id007
93
- description: Spawns a PHP process and proxies calls to it, making it possible to proxy objects and more.
91
+ version_requirements: *15320000
92
+ description: Spawns a PHP process and proxies calls to it, making it possible to proxy
93
+ objects and more.
94
94
  email: k@spernj.org
95
95
  executables: []
96
-
97
96
  extensions: []
98
-
99
- extra_rdoc_files:
97
+ extra_rdoc_files:
100
98
  - LICENSE.txt
101
99
  - README.rdoc
102
- files:
100
+ files:
103
101
  - .document
104
102
  - .rspec
105
103
  - Gemfile
@@ -115,34 +113,31 @@ files:
115
113
  - spec/spec_helper.rb
116
114
  has_rdoc: true
117
115
  homepage: http://github.com/kaspernj/php_process
118
- licenses:
116
+ licenses:
119
117
  - MIT
120
118
  post_install_message:
121
119
  rdoc_options: []
122
-
123
- require_paths:
120
+ require_paths:
124
121
  - lib
125
- required_ruby_version: !ruby/object:Gem::Requirement
122
+ required_ruby_version: !ruby/object:Gem::Requirement
126
123
  none: false
127
- requirements:
128
- - - ">="
129
- - !ruby/object:Gem::Version
130
- hash: -2945607344719233429
131
- segments:
124
+ requirements:
125
+ - - ! '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ segments:
132
129
  - 0
133
- version: "0"
134
- required_rubygems_version: !ruby/object:Gem::Requirement
130
+ hash: -3803288112951647499
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
132
  none: false
136
- requirements:
137
- - - ">="
138
- - !ruby/object:Gem::Version
139
- version: "0"
133
+ requirements:
134
+ - - ! '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
140
137
  requirements: []
141
-
142
138
  rubyforge_project:
143
139
  rubygems_version: 1.6.2
144
140
  signing_key:
145
141
  specification_version: 3
146
142
  summary: Ruby-to-PHP bridge
147
143
  test_files: []
148
-