Güncellemeye Dayanıklı Çalışma İlkeleri

1.6k görüntülenme Markdown

Bir sonraki çekirdek yükseltmesinden sonra kodunuzun çalışmaya devam edip etmeyeceğine karar veren altı kural. Her biri, yükseltme koşusunun bir dosyaya ne yaptığına bağlıdır.

Genel Bakış

Güncellemeye dayanıklılık bir üslup değil, ölçülebilir bir özelliktir. Yükseltme koşusu sürümün dosyalarını sistemin üzerine kopyalar, sürümün adını verdiği yolları siler, geri kalan her şeye dokunmaz. İşinizin hangi kovaya düştüğü sağ çıkıp çıkmayacağını belirler. Kovayı, kodu nereye koyacağınıza karar verirken siz seçersiniz.

Koşu incelenebilir. Adımları koşucu sınıfında bir sabittir ve her üzerine yazma işleminden önce dosyanın kopyası kenara alınır. Geri alınamayan iki şey adıyla yazılır.

Özelliğin ikinci yönü şudur: kodunuzun, yer değiştirmiş bir çekirdeğe karşı da çalışmaya devam etmesi gerekir. Dinlediğiniz bir kanca yeniden adlandırılabilir. Çağırdığınız bir metodun imzası değişebilir, içine bastığınız bir şablon yeniden yazılabilir. Aşağıdaki son kural, bu varsayımların hâlâ geçerli olduğunu kanıtlamakla ilgilidir.

Ön Koşullar

  • Sisteme kabuk erişimi ya da en azından coremio/VERSION dosyasını ve panelin güncelleme ekranını okuyabilme imkânı.
  • Genişleme noktalarının kabaca haritası: hooks/INDEX.md, coremio/modules, templates/website.
  • Kanca kelimesi henüz somut bir şey ifade etmiyorsa önce Kancalar Nasıl Çalışır makalesini okuyun.

Yapı

Bir Yükseltme Gerçekte Neye Dokunur

Uygulama adımı, paketin kendi dosya ağacından tek bir liste kurar ve her girdiyi sistemin üzerine kopyalar. Başka hiçbir yere uğramaz; silmeler ayrı ve açık bir bildirim dosyasıyla yürür.

Dosya neredeKoşu ona ne yaparSizin için anlamı
Sürümün getirdiği bir çekirdek dosyası (sınıf, helper, controller, admin şablonu)Koşu öncesi kopyası saklandıktan sonra bayt bayt üzerine yazılırDüzenlemeleriniz gider. Saklanan kopya bir önceki sürümü geri getirir, sizin düzenlemenizi değil
Sürümün silme bildiriminde adı geçen bir yolKoşu öncesi kopyası saklandıktan sonra silinirYeniden adlandırma, ekleme artı silme olarak gönderilir; kod bağladığınız bir dosya ortadan kalkabilir
coremio/configuration, dosya zaten varsaAtlanırDüzenlemeleriniz yaşar, bayat varsayılanlar da: yeni sürümün oraya eklediği anahtarlar hiç gelmez
coremio/localeAnahtar anahtar birleştirilir, çakışmada gelen kazanırEklediğiniz bir anahtar yaşar. Yeniden yazdığınız bir çekirdek metni, sürüm o anahtarı gönderdiği an geri gelir
coremio/storageSilme bildirimi bu yolları reddeder, asla kaldırmazÇalışma zamanı verisi sizindir
Paketin ne gönderdiği ne de adını verdiği bir yolDokunulmaz, kenara bile kopyalanmazModülünüz, kanca dosyanız ve temanız burada yaşar

Altı Kural

1. Kaydedin, asla düzenlemeyin coremio/hooks altındaki her dosya ve bir modül dizinindeki her hooks.php açılışta otomatik olarak dahil edilir. Davranış eklemek size değişmiş bir dosyaya değil, yeni bir dosyaya mal olur.
2. Bir dizine sahip olun, birini işgal etmeyin Tümüyle size ait bir dizin (bir modül, bir tema, bir kanca dosyası) uygulama listesine görünmez. Bir çekirdek dosyasına eklenmiş tek satır görünürdür.
3. Konumlara değil adlara bağlanın Kanca adları, POST alan adları, config anahtarları ve rota anahtarları birer sözleşmedir ve gürültüyle değişir. Satır numaraları, dizi konumları, şablon işaretlemesi ve CSS yapısı sözleşme değildir ve sessizce değişir.
4. Durumunuzu kendi deponuzda tutun Kendi tablonuz, modülünüzün config.php dosyası ya da veritabanı destekli ayar çifti. Asla bir çekirdek yapılandırma dosyası değil: koşu onu atlar; sonraki bir sürümün oraya eklediği anahtarlar size hiç ulaşmaz.
5. Uygun bir nokta yoksa isteyin Eksik bir genişleme noktası bir taleptir, çekirdeği yamalama izni değil. Jenerik bir kanca açmak desteklenen cevaptır.
6. Koşamayan bir kontrol yargı üretmez Onu atlandı olarak raporlayın ve devam edin. Yükseltme mekanizması aynı çizgiyi çeker: çalıştırılamayan bir prob arıza kanıtı değildir.

Genişleme Noktası Sınıfları

Her birinin kendi makalesi var. Burada önemli olan şekil: beş tür genişleme noktası, her biri farklı bir maliyet ve farklı bir sınırla.

Kancalar 17 alan boyunca yayımlanmış 979 nokta. En ucuz nokta ve çekirdeğin sahibi olduğu bir akışın içine uzanan tek nokta. Var olanlarla sınırlıdır: yeni bir tetikleyici çekirdek değişikliği ister.
Modüller 16 tip; her biri, çekirdeğin içine çağrı yaptığı bir sözleşmeye sahip, size ait bir dizin. En geniş nokta ve veritabanı tablolarına, ayarlara ve admin sayfalarına birlikte sahip olabilen tek nokta.
Temalar Website şablon kökü altındaki bir dizin, ziyaretçiye dönük sunumun tamamının yerini alır. Admin paneli için eşdeğer bir katman yoktur: o ekrana yalnız yayımlanmış işaretleme kancalarından ulaşılır.
Yapılandırma ve veri Veritabanı destekli ayarlar, operatörün tanımladığı özel alanlar, kendi tablolarınız. Buradaki hiçbir şey sürümün üzerine yazabileceği bir dosya değildir.
Sürüm kapıları Çalışan sürüm, koşucunun en son damgaladığı bir dosyadır. Onu okumak, kodunuzun kendisi için yazılmadığı bir çekirdekte hata fırlatmak yerine geri çekilmesini sağlar.

Referans

Her Güvenli Değişikliğin Geçtiği İlkel Yapılar

imzalar
// coremio/classes/Hook.php - yayımlanmış bir noktaya bağlanma.
public static function add($name, $priority, $properties = []): void;
public static function run($name, ...$args): array;
public static function runRefs($name, &...$args): array;

// coremio/classes/Config.php - dosyada değil veritabanında yaşayan ayarlar.
public static function getd($name = '');
public static function setd($name = '', $content = '');

// coremio/classes/Config.php - DOSYA tarafı. Serbestçe okuyun, yalnız kendi dosyanıza yazın.
public static function get($arg = NULL);
public static function save($name = '', $data = []): bool;

// coremio/classes/Modules.php - bir modül örneğini almanın kanonik yolu.
public static function getInstance(string $type, string $name, array $params = []): ?object;

// coremio/helpers/license.php - coremio/VERSION dosyasından okunan, çalışan çekirdek sürümü.
public static function version($realtime = false): string;
Config::getd() configurations tablosundan tek bir satır okur. Saklanan değeri döner; ad hiç yazılmamışsa boş bir sonuç verir. Araya dosya girmez.
Config::get() coremio/configuration altındaki bir dosyaya eğik çizgiyle adreslenen, ilk dokunuşta yüklenen okuma. Config::get("general/cache") önce general.php dosyasını, sonra cache anahtarını okur. Olmayan anahtar null değil false döner.
License::version() coremio/VERSION dosyasını okur ve istek boyunca hatırlar. true geçmek bu hatırlamayı atlar, ki bu yalnız bir yükseltme koşusunun içinde önemlidir. Karşılaştırmayı version_compare() ile yapın, dize olarak asla.
Modules::getInstance() Modülü yükler ve yapılandırmasını doldurur. Sınıf adını üç adlandırma biçimi arasında çözer, zorunlu kurucu argümanlarını yansımayla doldurur ve örneği önbelleğe alır. Kendi elinizle new yazmak beşini birden atlar.

Bir Kayıt Dosyasının Yaşamasına İzin Verilen Yerler

İstek başına bir kez değerlendirilen iki glob, nelerin dahil edileceğine karar verir. Onların dışındaki her şeye, onların içinden ulaşmak gerekir.

DesenNe zaman yüklenirNe için kullanılır
coremio/hooks/*.phpBir kanca ilk kez ateşlendiğinde, istek başına bir kez. Kanca kaydetmek bu geçişi tetiklemezYalnız bu sisteme ait davranışlar
coremio/modules/{Tip}/{Ad}/hooks.phpAynı geçiş, aynı dahil etme döngüsüModülle birlikte taşınan davranışlar
coremio/modules/{Tip}/{Ad}/router.phpModül bir admin alanı kaydettiğinde, admin yönlendirmesi sırasındaAdmin paneli içindeki modül sayfaları
coremio/cronjobs/*.phpAçılışta, sınıf taramasıyla: TYPE sabiti taşıyan sınıf kaydedilirÇekirdeğin zamanlanmış görevleri. Modül kendi görevini hooks.php içinden kaydeder
Serbest bir kanca dosyası dağıtım kararı değil, tek bir sisteme ait bir karardır

Kanca dizinine bırakılan bir dosya paket sistemine görünmez. Kimse onu güncellemez, sürümlemez ve işiniz emekliye ayrıldığında kaldırmaz. Birden çok sisteme gidecek davranış bir modül dizininde yaşamalıdır.

Örnek

Aynı gereksinim iki kez: bir ödeme yöntemine ek ücret, bir kez çekirdek düzenlenerek, bir kez genişleme noktasından.

bir sonraki yükseltmede ölen sürüm
// Bir çekirdek helper'ının içinde, sürümün sahibi olduğu bir metoda elle eklenmiş üç satır.
// Uygulama adımı bu dosyayı gönderir; kopyalama döngüsü üzerine yazar ve koşu öncesi kopya
// defteri düzenlemeyi değil ÖNCEKİ SÜRÜMÜ geri yükler. Neyin neden değiştirildiğine dair
// geriye hiçbir iz kalmaz.
if ($pmethod === 'wire-transfer')
    $summary['total'] = (float) $summary['total'] + 2.50;
coremio/modules/Addons/Acme/hooks.php
// Hiçbir sürümün adını anmadığı bir dizinde yeni bir dosya. Ne üzerine yazılır ne silinir.

// Kural 3: dinleyici bir kanca ADINA ve belgelenmiş parametre adlarına bağlanır.
// Kural 4: tutar, çekirdek dosyasındaki bir sabit değil, veritabanına dayalı bir ayardır.
Hook::add('filter:order.cart_totals', 20, function (&$summary, $items, $subtotal, $coupons, $ctx) {
    $fee = (float) Config::getd('acme_wire_fee');
    if ($fee <= 0) return;

    $summary['total']        = (float) ($summary['total'] ?? 0) + $fee;
    $summary['tax']['total'] = $summary['total'];
});

// Kural 6: iş denenmeden önce cevaplanan ve başarısızlık değil "ölçülmedi" diye
// bildirilen bir yetenek sorusu.
Hook::add('action:cron.day.run', 50, function () {
    if (!function_exists('exec')) {
        // Logger::log() önce bir seviye ister; seviye kısayolları yalnız mesajı alır.
        Logger::info('acme: archive check skipped, exec() unavailable');
        return;
    }

    // ... alt süreç gerektiren prob
});

Ve aynı dosyayı, kendisi için yazılmadığı bir çekirdekte sessiz tutan kapı.

nazikçe geri çekilme
// version_compare, asla dize karşılaştırması değil: metin olarak "2.10.0", "2.4.0"'ın ALTINDA kalır.
if (version_compare(License::version(), '5.0.0', '<')) return;

// Aynı kapının diğer yarısı: çağırmak üzere olduğunuz metot orada olmayabilir.
// method_exists hiçbir maliyet çıkarmaz ve ölümcül bir hatayı kapalı bir özelliğe çevirir.
if (!method_exists('Checkout', 'payment_methods')) return;

Tuzaklar

Bir çekirdek yapılandırma dosyasını düzenlemek üzerine yazılma riski değil, bayatlama riskidir

Uygulama döngüsü zaten var olan bir yapılandırma dosyasını atlar, yani düzenlemeniz yaşar. İlk kurduğunuz sürümün varsayılanları da yaşar. Sürümün oraya eklediği anahtarlar hiç teslim edilmez ve onları okuyan özellik, operatör kapatmış gibi davranır.

Bir çekirdek çeviri metnini yeniden yazmak tartışmayı her seferinde kaybeder

Dil dosyaları değiştirilmez, birleştirilir ve gönderdiği her anahtarda gelen sürüm kazanır. Eklediğiniz bir anahtar yaşar; yeniden yazdığınız bir çekirdek metni, çekirdek tarafında o anahtara ilk dokunulduğunda geri gelir. Kendi anahtarınızı ekleyin ve kendi kodunuzu ona bağlayın.

Bir dosya yalnız değiştirilmez, silinebilir de

Sürüm, kaldırılacak yolların açık bir listesini taşır; yeniden adlandırma böyle ifade edilir. Kodunuz bir çekirdek dosyasının içinde yaşıyorsa, o dosyayı yeniden adlandıran bir yükseltme hiçbir şeyin üzerine yazmadan işinizi kaldırır. Genişlettiğiniz sınıf aynı anda var olmayı bırakır.

Güvenlik ağı kısadır ve bir yedek değildir

Koşu öncesi kopya defteri üç koşu saklar ve içinde yalnız sürümün dokunduğu dosyalar bulunur. Bu, kötü bir yükseltmeden dönüş yoludur, özelleştirmelerinizin arşivi değil. Koşudan önce alınmış bir yedeğin yerini tutmaz.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.