0

https経由でphpスクリプトをトリガーするrubyコードがあります。

ユースケース: phpスクリプトは通常5分で終了するため、10分後にhttpsリクエストのタイムアウトを設定しました。httpsリクエストが開始されてから7分後にコードをトリガーするタイマーが必要です。

httpsリクエストを開始する直前に作成したスレッドを使用することを考えていました。これがこれにアプローチする正しい方法であるかどうかはわかりません。たぶん、スレッドをまったく使用する必要はありません。私はruby1.8.7(2010-08-16パッチレベル302)[i386-mingw32]を使用しています。また、httpsリクエストが正常に終了したときにスレッドを「強制終了」できるかどうかもわかりません。

uri = URI.parse(url)
start = Time.new
http_read_timeout=60*10

connection = Net::HTTP.new(uri.host, 443)
connection.use_ssl = true
begin   
        response = connection.start() do |http|
            http.open_timeout =  50
            http.read_timeout = http_read_timeout
            http.request_get(uri.request_uri)
            # here I need to place a code that is triggered 
            # in case of custom timeout is reached
        end
rescue Timeout::Error
#  "Connection failed
    time_out_message ="security time out - after #{http_read_timeout} sec"
return time_out_message         

end

puts "finished"
4

2 に答える 2

1

ruby 1.9.3は、タイムアウト機能を備えたタイムアウトモジュールを実装しています。あなたはここでそれを見ることができます。下にスクロールすると、[ソースの表示]をクリックして、タイムアウトメソッドの定義を確認できます。ruby 1.9.3にアップグレードしたくない場合は、コピーできます(1.8.7は1.9.3に比べて非常に遅いため、アップグレードをお勧めします)

于 2012-05-24T05:44:43.737 に答える
1

基本的な構造は次のようになります。

seconds_timer = MyDelay
counter = 0

test_thread = Thread.new do
  run_http_php_test
end

while test_thread.alive?
 counter += 1
 if counter > seconds_timer
   handle_custom_timeout_somehow       
   # if you want to halt run_http_php_test: 
   test_thread.kill if test_thread.alive?
   # otherwise:
   break
 end
 sleep 1
end
# the below doesn't apply if you kill the run_http_php_test thread
test_thread.join if test_thread.alive?

...しかしもちろん、それsleep 1を好きなポーリング間隔に変更することもできます。run_http_php_testカスタムタイムアウト値に達する前に実行するとコードがより速く終了するため、ポーリングは元のスレッドを強制的にスリープ状態にするよりも優れています。

上記のコードのほとんどまたはすべては、run_http_php_testメソッドに含めることも、直接挿入することもできます...どちらでもかまいません。

于 2012-05-24T15:15:38.413 に答える