Eski bir PHP uygulaması Tricky entegrasyonu ve Rails app yeni bir Ruby

5 Cevap php

Biz eski eski bir PHP uygulama var. Şimdi Ruby on Rails kullanarak yeni bir uygulama modülü yazmak istiyorum.

Dağıtım bir sorundur. Ben bir Apache sunucu üzerinde (mod_proxy'ye / melez üzerinden) (mod_php aracılığıyla) PHP uygulaması ve RoR uygulama çalıştırmak mümkün olmalıdır sanırım. Bu fcgi üzerinden php çalıştırmak gerekir çünkü ben mod_rails kullanmak istemiyorum. Yani bir şey kırma riski vardır. PHP ve RoR hem de aynı DB kullanmak olacaktır.

Zor kısmı PHP uygulaması RoR app giriş bilgisi geçmek için nasıl. Kullanıcılar PHP içine giriş ve onların bilgi PHP oturum veri saklanır. RoR app ana PHP uygulaması (örn. www.example.com / railsapp) bir alt alınacaktır. Yani RoR tüm HTTP çerezleri almalıdır. Ve soru RoR app PHP oturum veri ayıklamak için nasıl.

Bu yukarıda çünkü PHP mod ve RoR arasındaki olası yarış koşulları oldukça kötü, sadece benim ilk fikir. Bir kullanıcı oturum açtığında DB bazı bilgileri depolamak için PHP uygulaması değiştirebilirsiniz Ama PHP oturum veri dolmuş ve DB bazı veriler (bir kullanıcı sistemden çıkış) güncellendi edilmesi gereken bir davayı nasıl işleneceğini bilmiyorum.

Herkes benzer sorunu çözüldü mu? Ya da en azından en umut verici yönü işaret edebilir?

Güncelleme: SQL veritabanında oturum verilerini saklamak için mod_php'yi yapılandırmak mümkün olmalıdır. Bu yolda yarış koşulları olacaktır. DB motor yarış durumları önlemek gerekir.

Update2: Aslında prefork modunda Apache ile mod_rails kullanmak mümkündür. Mod_php tarafından gerekli olduğu. Mod_rails işçi mpm modunda Apache çalıştırmak için sadece tavsiye edilir. Yani PHP / RoR apps tüm dağıtım büyük ölçüde basitleştirilmiştir.

5 Cevap

Bir alt dizinde raylar app koyuyoruz Birincisi, eğer bu mod_rails kullanmak mümkündür. PHP site için konfigürasyonunda raylar için bir kök olan bir yer olabilir.

<Location /railsapp>
  DocumentRoot /.../app/public
</Location>

Raylar tarafa bir oturum almak için, raylar üzerinde bir bağlantı sayfası oluşturmak ve PHP tarafında onu aramak ve giriş için bazı veri geçebileceği ya. Sen değil sadece (yapmak kolay) localhost herhangi bir istek bu sayfayı korumak gerekir.

Ayrıca onun oturumları saklamak için bir veritabanı kullanmak raylar geçiş olabilir, daha sonra, bir oturum kimliği oluşturmak, doğru adı ve gizli ile bir çerez saklamak ve bu kimliği ile el veritabanındaki bir oturum oluşturmak gerekir.

Ayrıca, (I öneriyoruz) kullanıcıyı günlükleri ve istediğiniz sayfaya onları yönlendirmeleri raylar tarafında vekil sayfa olabilir. (Bu gibi yapabilirdik not actual working code, but you get the idea):

PHP

$key = md5hash($user_id . $user_password_hash . $timestamp)
$url = "/railsapp/proxy?userid=" . $user_id . "&key=" . $key . "&page=home%2Fwelcome"
<a href="<$ $url $>">Rayları App</a>

Rayları

map.proxy 'proxy', :controller => 'proxy', :action => 'connect'

class ProxyController < ActionController::Base
  def connect
    key = ...
    if params[:key] == key
      login_user params[:userid]
      redirect_to params[:page]
    else
      render :nothing, :status => 403
    end
  end
end

(Malzeme yeniden uygulanan var sabitleme gerektiği gibi, eski PHP kodu, yeni hawt RoR özellikleri) Daha önce karışık PHP / RoR uygulaması yaptık. Tüm bu gerçekten zor değil - sadece normal dosyaları olarak PHP sunmak ve Rails app için her şeyi yönlendirmek için bir 404 işleyici kullanın.

Bildiğim kadarıyla oturum verileri gider gibi, bir DB içine could şeyler o, ancak PHP'nin sıralıyor veri formatları, PHP kullanır {okumak ve yazmak bulmak / rutinleri yazmak için istekli iseniz [(1)] } oturum veri dosyası yazma / okuma hiçbir ırk koşullar var olduğundan emin olmak için. Minimal ağrı için Rails app aynı şeyi yapın.

Eğer iki teknolojileri karıştırarak sorun için soruyorsun gibi Birincisi, öyle görünüyor. Benim ilk önerim "böyle yapmayın" dir.

Muhtemelen bu tavsiye dinlemek için gitmiyorsun Ancak, ben senin gerçek soru hakkında bir öneri yapacağım. Ben veritabanında mağaza oturum veri gördüm PHP apps ben de veriyi temizleme yaklaşımları fark ettik. Hem onlar kadar eski biliyorum kayıtları damgalama ve kullanıcı aktif iken zaman zaman damgalama o zaman canlandırıcı her zaman vardır (bazen her sayfa görünümü, bazen daha az sıklıkta beklenen yüke ve sorgu sayısı bağlı olarak).

App nispeten az veritabanı çağrıları yapar, ve bu nedenle yedek için biraz zaman varsa, en azından bazı sayfalara her sayfa görünümü oturum tablosunda karşı ekstra bir sorgu çalıştırabilirsiniz. Bu ekstra bir sorgu ve bir sorun yoğun bir uygulama anlamına gelir. Alternatif süresi geçmiş kayıtlarını tablosunu temizlemek için periyodik olarak çalışan bir cron işi olma eğilimindedir. Bu periyodik temizlik işleri de özgü diğer görevler (bir kullanıcı gibi kurulum için oturum verileri beri zaten genellikle biraz yavaş olduğu, giriş) yapılır sadece çalıştırabilirsiniz alabilirsiniz.

Hey, Ive her zaman bu aslında php legacey apps / veri var ve onun daha sordu değil şaşırıyorum php den yakut hareket olanlardan oldukça yaygın bir sorundur düşündüm.

Ben geçmişte iyi çalışmış her ikisi de aşağıdaki iki yaklaşımdan, ya gitmek için cazip olacaktır. İkinci seçenek biraz daha fazla çalışma gerektiren gidiyor ve her ikisi de mevcut giriş kodu değişiklik gerektirecektir:

1) Kendi çözüm haddeleme konusunda endişelenmenize gerek yok bu yüzden giriş işlemek için OpenID kullanın. Kendi OpenID sunucusu çalıştırmak veya benzersiz bir alt alan olarak uygulamalar her çalıştırın google, yahoo vs de kullanabilirsiniz. Orada rayları ve php için OpenID eklentileri / kod vardır ve bu denenmiş ve test edilmiş güvenli standart

2) Bir db karşıt olarak) (giriş oturumlarını saklamak için memcached kullanın. Bir giriş sayfası (php app veya app raylar ya) var. Eğer uygulamayı yakut veya php app erişilen olsun oucome buna benzer olacaktır.

a) Kullanıcı bir giriş korumalı sayfaya erişmeye çalıştığında

b) Uygulama kullanıcı oturum olup olmadığını görmek için kendi oturum verileri denetler

doğru oturum veri varsa c) sonra kullanıcı ve uygulama hasılatı kaydediliyor

App tarayıcı çerezi için geçerli oturumda kontrolleri bulamıyor d)

e) Daha sonra App bu çerez anahtar için memcache denetler.

çerez anahtar sonra varsa f) kullanıcı) aksi Giriş sayfasına yönlendirir (giriş yapmalısınız

g) app kapmak memcached (çerez tuşu olarak depolanır) den user_id böylece oturum açmış olan kullanıcı bilir

gitmek zorunda değildir bu yüzden h) uygulama setleri oturumu giriş geçmiş c tekrar oturumu sona sürece

This is an overly simplified version of what is happening but does work. I would use memcached in this scenario because it has auto expiration of values which you define and is damn fast. Remember dont pass usernames and passwords between apps or even userids for that matter. Pass a unique key which is merely a pointer to information stored in your DB/memcached

1) başarıyla Yolcu kullanımı ve geliştirme makinede ve sunucu üzerinde hem tek prefork Apache, aynı anda mod_php.

2) Ben paylaşılan memcached tuşları ile bir HTTP sınama / yanıt dizisi aracılığıyla ya da belki uygulamaları bağlamak istiyorum.