Soru Büyük bir site için en ölçeklenebilir PHP tabanlı dizin yapısı nedir?


Ben php sınıfları, javascripts ve birçok css dosyaları (MVC için büyük miktarda dosya bahsetmiyorum) büyük bir kütüphanesi olacak çok büyük bir PHP MVC tabanlı bir site oluşturuyorum.

İlk defa, aslında temiz ve organize bir dizin yapısını planlamak için zaman ayırıyorum.

Genellikle hangi dizin yapılarını kullanıyorsunuz ve binlerce dosya olduğunda manevra için en kolay olanı hangileridir?


25
2017-09-07 04:25


Menşei


Bu sadece bir düşünce. CakePHP gibi zaten var olan bir PHP MVC framework kullanmayı düşündünüz mü? Bir öğrenme eğrisi olabileceğini anlıyorum, ama açık bir kaynağın, popüler çerçevenin faydalarını dikkate almak faydalı olabilir. Yıllarca kendi kodumu oluşturdum ve sürdürdüm, ancak özellikle büyük siteler için üçüncü parti bir çerçeve kullanmanın daha ölçeklenebilir olduğunu fark ettim. Uzun vadede size zaman kazandıracağını ve gelecekteki dış kaynak kullanımı projeleri için değerli becerilere sahip olacağınızı öğrenebilirsiniz. - Dooltaz
Aslında bunu düşündüm ... ve sonunda eninde sonunda bir tane kullanabilirim ... ama hareket edebilmeden önce kendim yapabilmem lazım :) onun nevrotik bir ha - johnnietheblack


Cevaplar:


Bu benim kurulumum. Küçük - çok büyük projeler için (sosyal ağ dahil) benim için harika çalıştı.
Bu klasörler hep ana uygulama klasörümde yaşayacak:

  • config - özel PHP yapılandırma dosyaları içerir
  • css - projenin CSS dosyalarını içerir
  • yardımcılar - 'yardımcı' dosyaları içerir (her dosya bir işlevler topluluğudur)
  • görüntüler - projenin görüntülerini içerir
  • js - projenin Javascript dosyalarını içerir
  • lib - projeye özgü PHP sınıfları içerir
  • modüller - MVC çerçevem, paket bölüm bölümlerini modül olarak sağlar
    • blog - Örnek bir modül
      • kontrolörler - modül için kontrolörleri içerir
      • modeller - modül için modeller içerir
      • views - modülün görünümlerini içerir
  • görüntüleme - genel olarak erişilebilir olması gereken görünümler içerir (sayfa başlığı, altbilgi, vb.)

Tüm dizinler, dosyalarınızı daha da organize edecek alt klasörleri içerebilir. Örneğin, 'css' klasörü 'web' ve 'mobile' adlı alt klasörlere sahip olabilir. 'İmages' klasörü daha sonra '' profile '' içerebilen bir 'user_uploaded' klasörü içerebilir. Tabii ki, uygun gördüğünüz klasörleri de ekleyebilirsiniz, bir projede, sadece tek başına yükleme komut dosyaları içeren 'yükleyiciler' adlı bir klasörüm var.

Yüklemek istediklerimin dosya isimlerini oluşturmaya yardımcı olan kolaylık yöntemleri de kullanıyorum. Örneğin, loadView () seçeneğim mevcut modül dizinindeki görünüm dosyasını arayacak veya isteğe bağlı bir $ modül argümanını iletirseniz, özellikle bu modülün klasörüne bakacaktır.

Umarım bu yardımcı olur.


22
2017-09-07 05:03



Bu, herhangi bir php kodu, konfigürasyon, vb. - OIS
OIS doğrudur. Bu kurulumda, birisi dosya adını biliyorsa, tarayıcıdan çağırabilir. Bu cevabı Symfony'ye (tüm arkaplan dosyalarını gizleyen) geçmeden önce yayınladım ve herkese açık olmayan tüm dosyaları herkese açık web erişimi dışında taşımanızı kesinlikle tavsiye ediyorum. - Steven Mercatante
lib - contains PHP classes specific to the project Burada "spesifik değil" mi demek istiyorsun? Lib'in yazdığınız şeyler için genel ve / veya kullandığınız mevcut kütüphaneler için olduğunu düşünürdüm. Ayrıca, merak ediyorum - hakkında ne düşünüyorsun jsve css modüller kadar klasörleri gitmek? Ayrılır mısın js lib ve modüllere benzer şekilde dizin? - Chris Middleton


Web kökü olarak bir dizininiz olmalı, yalnızca tüm internete maruz kalmak istediğiniz dosyaların bulunması gerekir.

project/
 web/
  index.php
  css/
  js/
  images/
 config/
 lib/
  • web / ziyaretçilere gösterilen köken
  • lib / kütüphane klasörü ve dosyaların otomatik yüklendiği yer.

Denetleyici, modüller, görünüm, yardımcı vb projeye / projeye daha fazla alt klasör ekleyebilirsiniz. Bu, çerçevenize bağlıdır.

DÜZENLE:

Eğer besteci (ki bunu öneririm) kullanırsanız ve belki npm ile homurdanır ve daha az dosya yapınız aşağıdaki gibi olur:

project/
    web/
        js/
        css/
        images/
        index.php
    cli/
    config/
        config.php
    node_modules/
    src/
    test/
    vendor/
    composer.json
    composer.lock
    packages.json
  • web / tüm ortak dosyalarınıza sahiptir
  • komut satırından çalıştırılacak cli / scriptler ve programlar
  • config / config dosyalarınızın tümü vardır (sitedeki config.php dosyasını yok sayarsınız ve bunun yerine kullanıcı adı, şifre, doğrulama kodu ve tablo önekleri / sonekleri ve diğer "sırlar" olmaksızın config.dist.php'iniz var)
  • node_modules / tüm kütüphane dosyalarınızı npm'den alır (bunu bir alt modüle koymanızı öneririm)
  • src, tüm yerel PHP dosyalarını psr4 yapısında, composer.json'da otomatik yüklemeye ayarlanmıştır.
  • composer.json'da autload-dev içinde kurulmuş olan src sınıflarınız için tüm birim testlerinizi test edin / test edin (kullanmayı unutmayın) besteci yükleme --no-dev canlı, belki ekleyin -O eğer çok fazla dersiniz yoksa
  • Satıcı tüm kütüphane dosyalarınızı besteci ve ONE VE SADECE autoload.php web / index.php dosyasında ve herhangi bir betikte (bu satıcı klasörünü görmezden gelmenizi öneririm) bulunacaktır.

Projeniz için gereken diğer klasörleri ve dosyaları ekleyin.

Dağıtım için bu yapıyı kullanın:

/sites/project/ (project is your projectname)
    current (alias to current release folder releases/v1.1.0)
    previous (optional alias to previous release folder releases/v1.0.1)
    releases/
        v1.0.0/ (git checkout of tag v1.0.0)
        v1.0.1/ (git checkout of tag v1.0.1)
        v1.1.0/ (git checkout of tag v1.1.0)
    shared/ (has all your shared files and folders to be aliased in all releases - maybe something like GlusterFS)

Dağıtım komut dosyası hazırlayın. Böyle bir şey:

İlk olarak db'nin yedeğini alın ya da yeni bir veritabanına kopyalayın, çıkış etiketli yeni klasöre git'e gidin, tüm git altmodüllerini alın, composer install --no-dev'i çalıştırın, paylaşılan klasörler ve yüklenen resimler gibi dosyalar için herhangi bir takma ad oluşturun konfigürasyon dosyaları, junt / css ile daha az ya da eşdeğeri js / css üretir, etiket ile yeni klasöre mevcut takma ismi atar, güncelleme veritabanı komut dosyasını çalıştırır, nginx / apache / fpm-php servislerini yeniden başlatır, web sitesini kontrol etmek için testleri çalıştır.

Bir önceki sürüme (veya ne yapacağınızı bildiğiniz bir rehbere) geri dönmek için bir betikiniz var.


18
2017-09-07 08:19



Temiz ve basit ancak iki önemli klasörden yoksundur: project/tests/ve project/class/ (böylece lib klasör üçüncü taraf kitaplıkları için kullanılabilir). Sizler, partinin yapısının yapısı için başka önerileriniz olabilir misiniz? - Wernight


Dahil olan çekirdek dosyalar için: AppRoot / inc /

Veri erişim fonksiyonları ve sınıfları için: AppRoot / dao /

Javascriptler için: AppRoot / komut /

CSS için: AppRoot / stilleri /

Resimler için: AppRoot / img /

Statik içerik için (normalde kullanıcı profili resimleri veya yüklenen görüntüler için): AppRoot / static /

Önbellekler için: AppRoot / önbellekler /

Şablonlar veya Görünüm dosyaları için: AppRoot / templates /

Tüm sayfalar dosyası: AppRoot /

Yapısı Samstyle PHP Framework


Buraya yazdığım cevap 2009'dan beri oldu. Yıllar içinde daha fazla standart yayınlandı. PSR-0 Hangi klasör yapısı konusunu ele alır. Ayrıca yeni (ve daha iyi olduğunu hissediyorum) klasör yapısı ile Packfire Framework.


5
2017-09-07 04:31



Bu neden oylandı? - johnnietheblack
fikrim yok. seçmenden de öğrenmeyi çok isterim. - mauris
@mauris hala bu yapıyı kullanıyor musunuz? - Sarah James
@Sarah hayır Artık değil. github.com/packfire/config veya Packfire'daki paketler tarafımdan yaratılır ve hiçbiri artık bu yapıyı kullanmaz. - mauris
@mauris Bana geri döndüğün için teşekkürler. Klasörlerimi yapılandırırken biraz uğraşıyorum ve profesyonel geliştiricilerin bunu nasıl yaptığını görmek beni çok ilgilendirdi. Klasörlerim her yerdedir ve bu da beni tekrar yazım kurallarını yerine getirmeye zorluyor. Klasörü indirdim ama ne aradığımı anladım. - Sarah James


Benim tecrübemde, bunun için asla plan yapamazsın. Çerçevelerin ne yaptığını takip etmeye çalışabilirsin, ama asla kalıplarına tam olarak uymadığımı anladım.

Bir dizinde en fazla 20 dosya için iyi bir kural oluşturmanızı tavsiye ederim. Daha fazlasına ihtiyacınız varsa, sadece birkaç alt dizin oluşturun ve oradaki ortak bileşenleri taşıyın.


4
2017-09-07 04:38



çerçevelerden öğrenme konusunda harika bir fikir ... ama bazı iyi şeyler nelerdir ve yapılarını nerede bulabilirim? Teşekkürler! - johnnietheblack


Küçük ve büyük projeler için codeigniter kullanıyorum. MVC özelliği orta derecede iyi.

  • codeIgniter \ system \ application \ config: DB, Payment gateway, ftp config, route ve ... gibi tüm konfigürasyon dosyalarını içerir
  • codeIgniter \ system \ application \ models: her türlü veritabanı sınıfını içerir, ihtiyacınıza göre alt klasörler oluşturmalısınız, müşteriler, mailData, paymentModel, rapor, web-service ve ...
  • codeIgniter \ system \ application \ views: istemciler için çıktı olarak çalışacak her türlü dosyayı, mümkünse bu dosyaları yeniden kullanmayı düşünmelisiniz. Modeller gibi yönetim, raporlar, e-posta, email_template gibi alt klasör oluşturmalısınız .....
  • codeIgniter \ system \ application \ controllerlers: Bu en önemli kısımdır. Bu SEO url oluşturmak için yardımcı olacaktır, bu yüzden bu sefer alt klasörler hakkında daha dikkatli olmalısınız. Yönetim, ürünler, raporlar, siparişler vb. Oluşturabilir ve kontrolör sınıfının fonksiyonları için iyi bir isim düşünebilirsiniz.

Bunlar PHP / HTML dosyası içindi.

Şimdi diğer dosyalar hakkında:

  • codeIgniter \ images: görüntüler için
  • codeIgniter \ scripts: Java komut dosyaları ve bunların çerçevesi için
  • codeIgniter \ styles: CSS için
  • codeIgniter \ uploads: Yüklenen dosyalar için, dosyaları DB'ye koymak istemiyorsanız

Detay için codeIgniter çerçevesine bakınız.

Burada "codeIgniter \" onaylandı


2
2017-09-07 07:21



Index.php'yi web kök klasörüne ve PHP'nin geri kalanını denetleyiciye koyabilir miyim? Şimdiden teşekkürler. - Koushik Das


Bu çoğunlukla bir tercih meselesidir, hızlı bir Google araması birçok farklı proje yapısını açığa çıkaracaktır. Eğer üzerinde anlaşılmış bir standart varsa, bu gerçekten güzel olurdu. bunu düşünüyorum girişim PHP Paket Geliştirme Standartları tarafından iyi bir adaydır.

Bu teklif ettikleri dizin yapısıdır:

  • çöp Kutusu/: komut satırı çalıştırılabilir
  • config /: yapılandırma dosyaları
  • docs /: dokümantasyon dosyaları
  • halka açık/: web sunucusu dosyaları
  • kaynakları /: diğer kaynak dosyaları
  • src /PHP kaynak kodu
  • testler /: test kodu

1
2018-05-11 15:00





Şu an kullandığım yapı bu,

public/           
  assets/         /* js, css, imgs, ... */
  index.php
src/
  config/         /* for config files */
  helpers/        /* for functions */
  libraries/      /* for free classes that are not MVC classes */
  models/         /* for M in MVC */
  views/          /* for V in MVC */                   
  controllers/    /* for C in MVC */
  vendor/         /* for vendors files */
  uploads/        /* for uploaded images, docs, ... */

1
2017-10-02 13:37





Bir bak bakalım Symfony 1.4 veya Symfony 2  dir yapısı. Sizin için en sezgisel olanı seçin.


0
2017-08-26 10:14





Bunun projenin ne kadar büyük olacağına bağlı olduğuna inanıyorum. En çok kullandığım şey buydu:

proje /
  index.php
  img /
  css /
  js /
  görünümler /
  işlevleri /

Tüm proje dosyaları düzenlendiği sürece ...


0
2018-06-06 08:48