Florian 提供的链接具有 Amit Solanki 的代码,该代码有效!
这是我为使其与 Capistrano 一起工作所做的工作:
安装宝石
创建一个名为的文件script/delayed_delta
,其内容为:
#!/usr/bin/env ruby
require 'rubygems'
require 'daemons'
dir = File.expand_path(File.join(File.dirname(__FILE__), '..'))
daemon_options = {
:multiple => false,
:dir_mode => :normal,
:dir => File.join(dir, 'tmp', 'pids'),
:backtrace => true
}
puts 'delayed_delta'
Daemons.run_proc('job_runner', daemon_options) do
if ARGV.include?('--')
ARGV.slice! 0..ARGV.index('--')
else
ARGV.clear
end
Dir.chdir dir
RAILS_ENV = ARGV.first || ENV['RAILS_ENV'] || 'development'
require File.join('config', 'environment')
Delayed::Worker.new(
:min_priority => ENV['MIN_PRIORITY'],
:max_priority => ENV['MAX_PRIORITY']
).start
end
配置 Capistrano
Capistrano 需要启动Sphinx和job_runner(使用我们的script/delayed_delta
)。
将这样的内容添加到deploy.rb
:
deploy.task :restart, :roles => :app do
run "export RAILS_ENV=production && cd #{deploy_to}/current && /usr/bin/rake ts:rebuild"
run "export RAILS_ENV=production && cd #{current_path} && /usr/bin/ruby script/delayed_delta start"
end
配置whenever
gem
在config/schedule.rb
添加行以更新 Sphinx 的索引并启动 job_runner(如果它尚未运行)
every 30.minutes do
command "export RAILS_ENV=production && cd /path/to/rails/production && /usr/bin/rake ts:index && /usr/bin/ruby script/delayed_delta start"
end
这将转换为每 30 分钟运行一次以更新 sphinx的crontab
最后的笔记和经验教训
使用script/delayed_delta
daemon_generator gem 来启动job_runner后台工作脚本。这相当于rake thinking_sphinx:delayed_deltas
在控制台上运行,但持久化。
确保一次只运行一个job_runner或rake thinking_sphinx:delayed_deltas
进程
让 Capistrano 启动 Sphinx (rake ts:rebuild) 和script/delayed_delta
. 当我从不同用户或不同环境启动 sphinx 和 delay_deltas 时遇到问题