Php uygulama için dağıtım yapmak nasıl

6 Cevap php

Ben şu anda bir yardım kuruluşu için bir php-uygulama geliştiriyorum ve dağıtım uygulamalarını tanımlama aşamasında şimdi duyuyorum.

Bizim uygulama Zend Framework ve Doctrine hem de kullanıyor. Uygulama farklı sunucu, farklı bir yapılandırma dosyası ile her dışarı alınır. Makineler Windows hem de Linux (ama tüm Apache ve php 5.2 + ile).

Kaynak subversion deposunda mevcuttur ve biz bir Linux sunucu üzerinde bizim paketleri oluşturmak ve saklamak istiyorum.

Tercihen biz güncelleme işlemi güncelleme komutu da (doktrin komut ile) veritabanını günceller ve çerçevelerin bağımlılıklarını sağlayan uygulama dizininde, bir güncelleştirme komutu koşma gibi kolay olmasını istiyoruz. Bu güncelleştirme komutu (biz onlara ssh'tan olamaz) makinede bir komut olması gerekir. Tercihen yeni bir sürümünü indirerek veya yeni bir sürümü ile zaten indirilen tar paketinin sağlama seçeneği var. (Ama sadece indirme ya da sadece arşivini da Tamam)

Kurulumları ve güncellemeleri (yeni sürümleri) ile paketler, tercihen tek bir komut tarafından inşa de vardır.

Ben PHAR ait, armut, Phing hakkında biraz okuma olmuştur ama ben bunu yapmak için en iyi yolu nedir hiçbir ipucu var. Sürekli entegrasyon sunucu gerçekten gerekli değil, ama ben bir sürümünü oluşturduktan sonra otomatik olarak test ortamları dağıtma düşünüyorum.

Başlangıçta sadece php app güncelleme yükleyerek elle yapılabilir zaman başlangıçta bir yapılandırma dosyasını doldurma, çok kolay olmalı.

6 Cevap

Ben çeşitli sunucuları bir SVN çalışma kopyası uygulama kökü yaparak başlamak istiyorum. Siz insanların doğrudan. Svn dizinleri ele vermemek için (IIS için veya IIRF ASAPI filtreleri) mod_rewrite kurallar ekleyebilirsiniz.

Ardından, son kaynağına güncellenirken bir SVN güncelleme gibi basit olabilir. Veritabanı güncelleme ihtiyaçları için, ben SVN de veritabanı modifikasyonu komut korumak istiyorum. Büyük olasılıkla komut indirildikten sonra veritabanı güncellemeleri gerçekleştirmek için bir toplu / kabuk içinde SVN güncelleştirmeyi kaydırmak gerekir.

Canlı sunucularında değişiklik yönetimi için, ben de gövde onların çalışma kopyalarını değil, ancak bir bırakma kolu olur. Eğer bir serbest bırakılması için hazır olduğunda bırakma dala gövde birleştirebilirsiniz. Bu dağıtma sınamak ve canlı sunucularında gerçekleştirmeden önce sağlam olduğundan emin olmak için izin verecektir. Ayrıca size sorunları sonrası başlatmak izini ihtiyaç halinde site yayın sürümleri güzel bir kopyasını vererek güzel bir yan etkiye sahiptir.

Son olarak, bu güncelleştirmeleri yoğunluğu ve zamanlama bağlı, ayrıca kullanıcı geçici olarak yerine kırık bir site daha uygun bir mesaj ile karşılanır böylece güncelleme komut bir "bakım altında" anahtarı çevirmek isteyebilirsiniz.

Benjamin Eberlei birkaç hafta önce başlıklı bir blog yayınlanmıştır Trying a Two Step PEAR/PHAR approach to develop and deploy. O bir PHP uygulama dağıtmak için bir çok ilginç ve şık bir işlemdir açıklar.

Ben büyük etkisi bir dağıtım aracı olarak yıkıcılık kullandım.

Tüm üretim sunucuları veya kullanım Phing üzerinde svn update kullanın. (Hatta, svn güncelleme phing kullanın.)

Kurtulma ve yedeklerini bir çırpıda yapar. Sadece herhangi bir. Svn dizinlere erişimini kaldırmak için hatırlıyorum.

Her iki şekilde de, ben senin Phing veya benzeri ile inşa yönetmek olacaktır. , Bu testler çalışmasına izin dokümanlar oluşturmak, inşa etmek ve paket / arşivini yayımlamak.

Dağıtımı gibi, olabilir run your own PEAR server. Gerekçe burada size kullanıcıların güncellemeleri çekmek istiyorum dedi, sen hem Windows hem de Linux kullanıcıları var ve onlar için bağımlılıkları işlemek istiyorum. ARMUT tek bir komut ile tüm bu işlemek gerekir.

O dedi, ben çalışır ve kullanıcılara uygun basit bir şey ile gitmek istiyorum. Bu sadece HTTP ve küçük bir PHP komut dosyası yükseltme ile kullanılabilir bir arşivini olabilir (ya da bir Phing hedef.)

Kesinlikle bir önceki sürüme geri almak için basit bir yol sağlar. Kodu / yapılandırması ile sadece bir kopyasını tutabilirsiniz. DB, (zaten yapıyoruz gibi geliyor ki.) Göçleri kullanın

Eğer bir Claster olduğunu söyledi. Biz aynı konumda değiliz ve ZF ve Doktrini kullanın. Bu, sorunu çözmüş nasıl:

<?xml version="1.0" encoding="UTF-8"?>
<project name="yourprojectname" basedir=".">

<target name="deploy" depends="apply-deltas,update-app01,update-app02">

</target>

<target name="update-app01">

  <sshexec host="app01"
    username="yourusername"
    password="yourpassword"
    trust="true"
    command="cd path/to/root/directory &amp;&amp;
      svn update &amp;&amp;
      php cmd/clear_cache.php
      "/>

</target>

<target name="update-app02">

  <sshexec host="app02"
      username="yourusername"
      password="yourpassword"
      trust="true"
      command="cd path/to/root/directory &amp;&amp;
      svn update &amp;&amp;
      php cmd/clear_cache.php
      "/>

</target>

  <target name="apply-deltas" depends="liquibase-prepare">
     <updateDatabase
          changeLogFile="${db.changelog.file}"
          driver="${database.driver}"
          url="${database.url}"
          username="${database.username}"
          password="${database.password}"
          promptOnNonLocalDatabase="${prompt.user.if.not.local.database}"
          dropFirst="false"
          classpathref="classpath" >
          <changeLogProperty name="table.name" value="ant_param_table"/>
     </updateDatabase>
  </target>


<target name="liquibase-prepare">
    <path id="classpath">
    <fileset dir="${basedir}/libNoPackage">
        <include name="**/*.jar" />
    </fileset>
    </path>

    <taskdef resource="liquibasetasks.properties">
        <classpath refid="classpath"/>
    </taskdef>
  </target>

</project>

Bu ideal olmaktan uzak ama bizim için çalışıyor. Umut olur.

Links:

Apache Ant

LiquiBase

Eğer bazı sorular varsa ben answer.t güncelleyebilirsiniz lütfen bana bildirin

Belki bazen basit bir yaklaşım iyi çalışır. Sadece svn repo içinde etiketlendi kararlı sürümlerinin tutarsanız o zaman sadece hiçbir kullanıcı müdahalesi ile eski yedekleme iken yeni revizyon indirmek için bir toplu / bash komut dosyası yazabilirsiniz - sen de bu şekilde gerekli herhangi bir komut çalıştırabilirsiniz. Başka bir alternatif PHP bu basit bir arayüz yazıyor ama olması gereken kadar basit bağlıdır.