Nasıl benim kod üretime dev hareket etmelidir?

6 Cevap php

Ben bir PHP web uygulaması oluşturduk.

DEV, TEST, PROD: I 3 ortamları var.

What's a good tool / business practice for me to move my PHP web-application code from DEV to TEST to the PROD environment?

Benim TEST ortamı hala sadece benim TEST veritabanına bağlanır ki fark; oysa, benim PROD veritabanına bağlanmak için ortam PROD gerekir. Yani kod benim TEST kodu bir kez PROD veritabanına bağlanmak için PROD taşındı olup TEST veritabanı değiştirmek gerektiğini dışında, mostly aynıdır.

Ben yeni bağlantılara izin vermez gibi uzak Apache aşağı alarak insanların duydum ve tüm mevcut bağlantıları boşta kez basitçe web sunucusunu çökertiyor.

Sonra insanlar elle kodu kopyalayın ve daha sonra manüel olarak da PROD örneğine işaret etmek PHP uygulama yapılandırma dosyaları güncelleyin.

Bu çok tehlikeli görünüyor.

Bir iyi uygulama var mı?

6 Cevap

Kodun geri kalanından 1) Ayrı yapılandırma. Kodun geri kalanı daha sonra bir değişiklik olmadan, tüm 3 yerle ilgili çalıştırmak mümkün olmalıdır. Tipik bir yapılandırma dosyası olabilir:

<? 
$db = "main_db"; $db_user="web1"; $db_pass = "xyz123"; 
$site ="example.com"; 
$htroot = "/var/www/prod/htdocs" 
?>

Ve test ortamı için:

<? 
$db = "test_db"; $db_user="web1"; $db_pass = "xyz123"; 
$site ="test.example.com"; 
$htroot = "/var/www/test/htdocs" 
?>

Kod tabanı şifreleri ile yapılandırma dosyaları dahil etmeyin. Kod tabanı güvensiz bağlantıları aracılığıyla kopyalanmış olabilir veya (aşağıya bakınız) barındıran sunucuları, daha sonra üçüncü taraf kod saklanabilir. Ve belki kod tüm yedek diskler üzerinde şifreleri istemiyorum.

Ayrıca, tek bir yapılandırma dosyası oluşturmak ve çevre üzerindeki kod çalışır bağlı bir anahtar kullanabilirsiniz:

<? 
$site = $_SERVER["HTTP_HOST"];

if ($site == "example.com"; ) {
  $db = "main_db"; $db_user="web1"; $db_pass = "xyz123"; 
  $htroot = "/var/www/prod/htdocs";
}
if ($site == "test.example.com") { 
  $db = "test_db"; $db_user="web1"; $db_pass = "xyz123"; 
  $htroot = "/var/www/test/htdocs";
}
?>

Ama şimdi yukarıda açıklandığı gibi daha az güvenli kod tabanı, içine geri koymak için cazip olabilir. Eğer 3 dosyalarını güncellemek zorunda, ya da sunucu başına sabit bir konumu kullanmak ve emin olmak için oraya koydum yoksa ve kod her sunucuda dosyayı bulur. Ben şahsen yukarıdan bir dosya site başına çözümü tercih ederim.

2) Zaten "versiyonları" var. Eşya üzerinde çalışan bir sürümü şimdi var. Tekrar asla değişmeyecek olan, benzersiz bir isim ve numara verin. Bunu sürüm adını yedekleme kodunu kullanabilirsiniz ve sürümüne bakın veya ne zaman bir yere taşıdığınızda sürümünden sonra onu contian olacak subdiectory isim.

Eğer yakın gelecekte eşya koyacağız sürümü farklı bir versiyonu, ve tekrar değişiklik yaparsanız, bu da farklı bir versiyonu.

Pratik bir kural olarak: taşıdığınızda sürüm sayısını artırmak veya takas zaman, kod ihracat veya döviz veya bir demo yaparken yerle arasında yükseltmek ve her özellik ya da dönüm noktası ve her bir süre sonra tam bir yedekleme yapmak zaman.

Config dosyalarını (3, eşya için bir test ve dev) sürümlerinin parçası DEĞİLDİR unutmayın. Yani yapılandırma dosyaları "etrafında sürümleri hareket" ama olamaz. Eğer yapabilirsen, kodun geri kalanı ile ağacın DIŞ yapılandırma dosyaları koymak, böylece daha sonra sürümlerinde gezinirken bunları ayırmak ve özen gerekmez. "Yukarı" Yapılandırma bir dizin taşımak ve bu gibi dosyaları onları erişebilir:

"Include .. / config.php";

Eğer sürüm kontrol sistemleri kullanmak istiyorsanız 3), büyük bir iş yapmak ama buna alışmak için biraz zaman gerekiyor ve size güncelleme ile bir aceleniz varsa o probaby şimdi canlı başlamak için doğru zaman değil. Ama gelecek için bir son nesil dağıtılmış sürüm kontrol sistemi kullanmanızı tavsiye ederim. Dağıtılmış kurulum, sunucu ve daha birçok avantajları gerek duymazsınız. Bunu yapabilirim ftp üzerinden güncellemek için gerekli ise ben, bazaar isim olacak. Yalnızca sürümler arasındaki farkları yazılır, çünkü bir sürüm kontrol sistemi çok hızlı bir sürümünü alışverişi yapar unutmayın. Bazaar başlatmak için kolay kılan bir topluluk ve dokümantasyon vardır. Orada tarih ticari hosting sitesine kadar en çok sahip olan, Git de: http://github.com. Çevrimiçi kodunu görüntülemek ve sürümleri arasında karşılaştırma ve orada çok daha yararlı özellikler sadece kodlayıcı bile vardır, ancak bir grup içinde daha da iyi olabilir. Sistemler arasında seçim kolay değildir. Ben eski olan CVS tavsiye edemez. Ayrıca SVN dağıtılmış sürüm kontrol sistemi son nesil değil, ben belirli bir sebebi yoksa bunu kullanmak için tavsiye etmem, ve can sıkıcı olabilir, özel subdirs ile tüm subdirs kirletir. Bunun için kullanılan ve ince olduğu içinde zaten kodu var, ama bir başlangıç ​​için ben söyleyebilirim edilir peolple yok.

Mercurial ve Darcs dağıtılan ve açık kaynak sürüm kontrol sistemleri arasında da vardır. Mercurial da işbirliği ve çevrimiçi kod görünümünde (http://bitbucket.org) için büyük bir ticari site var.

4) Sürece nasıl sembolik kullanımı hakkında bir versiyon kontrol sistemi, kullanımı yok gibi?

Bir yerde / sunucu src / sürümlerinde bir dizin var ve orada, kendi alt dizininde her biri adlandırılmış sürümlerini koyabilirsiniz. (Var olan bir sürüm değişmiş olmayacak, çünkü bunu değiştirmek eğer yeni bir sürüm olur) sadece sürümleri katacak

Sen src/versions/v001 / src/versions/v002 / src/versions/v003 olabilir / veya ne olursa adlandırma şeması kullanabilirsiniz.

Şimdi burada hile geliyor: / var / www / eşya / htdocs src/versions/v001 bir sembolik olduğunu /

Eğer V002 yükselttiğinizde sadece aşağıdakileri yapın:

  • kapatma apache
  • Eski symlink / var / www / eşya / htdocs kaldırın (bu noktada apache webroota gitti!)
  • Yeni symlink / var / www / eşya / htdocs src/versions/v002 bir bağlantı olmak oluşturmak
  • apache başlangıç

Ayrıca parametreleri ile bu için bir senaryo yazmak ve bu gibi çağırabilirsiniz:

upgrade-web prod 002

Bu boşluk daha kısa hale getirir.

Bazen yeni sürümü üretim hataları olduğunu öğrenmek zaman, bir "son çare" yapmak zorunda ve geri gitmek zorunda. (Eğer, eski dizinleri çıkarmayın sadece apache durdurmak, sembolik bağ silmek ve eski konumuna yeniden oluşturmak, çünkü bu durumda src/versions/v001 olarak), bu kolay olurdu

Test ve dev aynı sunucuda Ve eğer, siz de elbette aynı dizin sembolik bir link, böylece bir hareket veya kopya için herhangi bir olmazdı.

Eğer sembolik olmadan manuel olarak yaparsanız 5), neden kopya yerine hareket etmiyor?

(Dosyaları aynı sunucu üzerinde henüz zaman, yere yakın bunları kopyalamak ve daha sonra göç ile başlar, bu nedenle böyle bir ling süre için sunucuyu durdurmak zorunda değilsiniz olabilir)

Projenin kök düzeyinde çeşitli dizinler varsa bunları teker teker hareket olabilir. Yapılandırma dosyaları HAREKET DEĞİL emin olun. Ya da onları bakc getirmek için bazı strateji bulmak. İş Akışı olacaktır:

  • Apache durdurmak
  • Yapılandırma dosyası dışında kök düzeyinde tüm mevcut eşya dizinleri ve dosyaları uzaklaşmaya (ler)
  • Yapılandırma dosyası dışında kök düzeyine tüm yeni eşya dizinleri ve dosyaları taşımak (ler)
  • Apache başlatın

6) mükemmel bir dosya ve dizin düzeni ve kusursuz iş akışı bulmaya çalışın. Bu belki biraz zaman ve bazı düşünce alır, ama o öder. Eğer iyi çözümü bulana kadar bir parça kağıt bunu. Bu kodunuzu refactor ve sunucu yapılandırma dosyaları değiştirmek zorunda, ancak yönetim ve yükseltmeleri yaptığınızda gelecek için hayat daha kolay olduğu anlamına gelebilir. Benim deneyim: Bu adımda bu kadar uzun beklemek yok. Sizin düzeni kolay ve güvenli yükseltme nmake shoudl. Yükseltme somehting olağanüstü değil, rutin ve güvenli ve yapılacak basit olmalıdır.

Eğer sunucu ve iş istasyonu ortamları (sunucu işletim sistemi sanırım linux, ancak barındırılan veya bir kök sunucu, ftp acces var mı ya da (SSH kabuk olan) erişim veya SFTP? Geliştirmek musun isim 7) ise , bir windows makine, ya da bir mac?) sonra insanlar kopyalama ve taşıma yapmak için araçlarını adlandırabilirsiniz. Ayrıca ilginç: testi ve dev sunucu değilse, nasıl bağlanır, aynı makine mi, yoksa değil mi? Eğer değilse, bir 3-yollu transferi (sunucuya o zaman yerel iş istasyonunda kopyalayın ve) yapacak.

8) dosya izinlerini düşünün. Eğer dosya taşımak veya kopyalamak, belki dosya izinlerini değiştirmek ve uygulama bazıları bağlıdır eğer belki chang kontrol etmek ve bir yol olmalıdır. Örnek: Bazı uygulamaların yüklenen dosyaları veya oturum dosyaları veya şablon önbelleğini koymak dizinleri yazılabilir gerekir. Diğer uygulamalar güvenlik için bazı dosyalar yazılabilir olması için izin vermez.

Eğer bağlanırken konum ne veritabanı belirlemek için yapılandırma dosyalarını kullanın. Yani, bir DEV yapılandırma dosyası, bir TEST yapılandırma dosyası, ve bir PROD yapılandırma dosyası var. Genellikle pahalı ve sinir bozucu hatalardan kaçınmak için en iyi yoldur.

Aslında, ben TEST çevre mucizevi herhangi bir sunucu kapatmalar olmadan PROD göç için bir neden görmüyorum. TEST üretim test amaçlı olması gerekiyordu. Ve aslında üretim sunucusuna TEST olsa bile, (kapatma apache) aşağı getirmek ana yapılandırma dosyasında bir satır değiştirmek, o) kullanmak için küçük yapılandırma dosya kümesi ne belirlenmesi ve (apache başlangıç) tekrar gündeme getirmek. Bu işlemin tamamlanması için değil daha 1-3 den dakika sürer ve kesinlikle on iki kez bir gün, iyi olacağını yapmayacak beri.

  1. Bir revizyon kontrol sistemi sizin kodu var (I Subversion (svn) tercih). Bu kolay senkronize DEV, TEST ve PROD ortamlar için yapar, size değiştirilmiş dosyaları takip etmek zorunda değilsiniz. Eğer DEV üzerinde değişiklikler ile mutlu sonra, svn değişiklikleri taahhüt ve sonra TEST üzerinde "svn update" çalıştırmak ve sonunda PROD sunucu üzerinde test ettikten sonra. Çoğu linux hosting sağlayıcıları istemci yüklü svn var ya da kendiniz yükleyebilirsiniz.

  2. Ben elle bir dosyayı yeniden adlandırma ve diğer iki kaldırarak gerektirir, çünkü her site için bir yapılandırma dosyası farklı bir sürümünü sahip sevmiyorum. Ben aynı config dosyasında DEV, TEST ve PROD yapılandırmaları olan tercih. Yapılandırma dosyasında ben kod hostname veya istek url ya da kontrol ederek çalışmakta olan sunucu belirlemek. Sonra şu kodu çalıştığı sunucu tabanlı yapılandırma ayarları yüklemek istiyorum "eğer" veya "switch" ifadesini olabilir.

  3. Ayrıca sunucular arasında veritabanı yapısını senkronize etmek gerekebilir. Ben 2 veritabanı yapıları karşılaştırır ve bunları senkronize etmek için SQL hazırlar yerleşik bir veritabanı yapısı senkronizasyon aracı var, bu amaç için SQLyog kullanın.

Biz güncellemeleri canlı bastığınızda, genellikle biz apache yeniden başlatmak zorunda değil. Bu belki yüksek trafik sitelerine sahip olmayan bir yan etkisi (<1M bir ay pagedraws).

Alfa (kenar kanama ancak non-geliştiriciler ve test tarafından görüntüleme için kullanılabilir), beta (belirli bir sürümü, son QA faz için biraz dondurulmuş) ve canlı (üretim): Biz kalkınma / QA çeşitli aşamaları için 3 şubesi var.

Bir daldan diğerine göç, biz bu birleştirme işlemek, diyelim alfa ve beta arasında bir birleştirme gerçekleştirmek. Ardından beta belge kök rsync en kodu web sunucuları sonra, bizim geliştirme makinede SVN şube güncelleştiren bir dağıtım komut dosyasını çalıştırın.

Daha önce başkaları tarafından belirtildiği, her şube çevre farklılıkları karşılamak için uygun ayarları ile kendi yapılandırma dosyası içerebilir.

Biz büyük projeler / sürümleri için SVN biraz travmatik olabilir şube birleştirme sürecini yumuşatmak için git'e göç sürecinde.

Ortamı ayrıntılarını içeren tüm ortamlarda var olan bir tablo oluşturun. PHP kaynak duyarlı PROD şifreleri hardcoding edilmemelidir.

Tüm ortamlar daha sonra bir veritabanı bağlantısı kurmak için aşağıdaki algoritmayı var:

  1. "Çevre" vekil kullanıcı ile veritabanına bağlanın.
  2. Kullanıcı adı, şifre ve çevre kimliği için ortam tablo sorgula.
  3. Veritabanı bağlantısını kapatın.
  4. 2. adımda alınan kimlik bilgilerini kullanarak bağlayın.

Hepiniz aynı veritabanı dayanarak, gelecekte farklı uygulamalar olabilir: bir uygulama kimliği ekleyerek tabloyu genişletmek. Uygulama yukarıdaki gibi aynı adımları uygulayın, ancak kullanıcı adı ve şifre almak için sorgu uygulama kimliği filtre olur.

Bu PROD için TEST DEV göç zaman PHP kodu değiştirmek zorunda önler.

Ayrıca, güvenli bir ortam tabloyu korumak. Siz, örneğin, yanlışlıkla şifre görüşlerini önlemek için (basit bir şifre ile ya da XOR) bir rot13 ekleyebilirsiniz. Mümkünse, bir güvenli yuva katmanı ekleyin. Masaya haklarına sahip kullanıcıları kısıtlamak.