Yeni php 7 standardı için MySQL işlevleri. Daha güvenli ve destekleniyor

  • 03.11.2019

Yani, eski ama çok değerli bir web siteniz var ve ona acıdığınız için (veya belki de Habr'ı yeniden okuduktan sonra) PHP7'ye aktarmaya karar veriyorsunuz. Heyecanla performansta dramatik bir artış bekleyerek, zayıf web sitenizin tozunu alırsınız ve barındırma kontrol panelinizdeki PHP sürümünü kararlı bir şekilde değiştirirsiniz.

Site artık genç değilse, büyük olasılıkla bir mucize gerçekleşmeyecektir. En iyi ihtimalle, her türlü hata ortaya çıkmaya başlayacak ve en kötü ihtimalle, web geliştirmenin zen'i olan beyaz bir ekran göreceksiniz. Şu anda her şeyi hızla eski haline döndürmek ve ani zayıflığınızı unutmak istiyorsunuz.

Ancak, gücünüzün kararlılık olduğunu ve denemeler için de biraz zamanınızın olduğunu varsayalım. Her şeyi düzeltmeye çalışalım.

Yedeklemeler

Sitenin (ve aynı zamanda veritabanlarının) yedek kopyalarını oluşturuyoruz. Sonuçta yedekleme yapmayan herkes kendi kendisinin düşmanıdır, değil mi? Çeşitli denemeler için, barındırma sistemine başka bir site eklemek ve şimdi düzenleyeceğimiz dosyaları buraya kopyalamak mantıklıdır.

Hata günlükleri

.htaccess dosyasında PHP hatasının günlüğe kaydedilmesini yapılandıralım (eğer daha önce yapılandırılmamışsa):

php_value display_errors 0
php_value log_errors 1
php_value error_log /home/vasya/domains/mysite.ru/logs/error.log

MySQL'le çalışmak

Diyelim ki site veritabanları kullanıyor ve şuna benzer hatalar görüyorsunuz:

Önemli hata: Yakalanmayan Hata: Tanımsız işlev mysql_connect()'e çağrı

Bunun nedeni PHP'nin modern sürümlerinde (PHP 5.5.0'dan başlayarak) orijinal MySQL uzantısının desteklenmemesidir. Geliştiriciler MySQLi veya PDO kullanılmasını öneriyor. MySQLi'ye geçmeyi deneyelim, çok kolay:

Sitenin, klasik boktan kod olan ve artık birçok kişi tarafından kısa ve etkili bir çözüm olarak kabul edilen prosedürel bir yaklaşım kullanılarak yazıldığını varsayalım. Bu durumda veritabanına bağlanmak için aşağıdaki eski yapı kullanılır:

$bağlantı = mysql_connect('localhost', $kullanıcı, $şifre)
mysql_select_db($db adı, $bağlantı)
mysql_query('cp1251 adlarını ayarla')

şununla değiştirilebilir:

$bağlantı = mysqli_connect('localhost', $kullanıcı, $şifre, $veritabanıadı)
mysqli_query($link, 'cp1251 adlarını ayarla')

sorgular için:

$result=mysql_query($query,$cid)

şununla değiştirin:

$result=mysqli_query($cid, $query)

Diğer popüler işlevler kolaylıkla 'i' karşılıklarıyla değiştirilebilir:

mysqli_fetch_array()
mysqli_fetch_row()
mysqli_fetch_assoc()
mysqli_fetch_array()
mysqli_num_rows()
mysqli_insert_id()
mysqli_close()

Bu basit adımlar sonucunda veri tabanından verilerin başarıyla toplanıp gönderilmesi gerekmektedir.

Kodlama

Gerçek eski tarz CP1251'deki sitedir (en azından). Her şey elmaslara mı yoksa başka keçilere mi dönüştü?

Büyük ihtimalle .htaccess'te kodlamayı şu şekilde belirtmeniz yeterli olacaktır:

php_value default_charset "cp1251"

Normal İfadeler

Ayrıca aşağıdaki türde hatalar da görebilirsiniz:

Uyarı: preg_replace(): /e değiştiricisi artık desteklenmiyor, bunun yerine preg_replace_callback kullanın

Bu, normal bir ifadenin sonucunu isteğe bağlı bir işleve aktarmanıza izin veren /e değiştiricisinin artık desteklenmediği anlamına gelir. Bu gibi durumlarda preg_replace_callback fonksiyonunun kullanılması tavsiye edilir.

Diyelim ki şöyle bir düzenli ifademiz var:

$string=preg_replace(“/:((1,10)):/e”, “print_smile('\\1')”, $string)

preg_replace_callback'in değiştirilmesiyle şu şekilde görünmelidir:

$string=preg_replace_callback(“/:((1,10)):/”, create_function('$eşleşmeler', 'return print_smile($eşleşmeler)'), $string)

Burada her şey basit, düzenli ifade artık ilk argüman olarak belirtiliyor (tabii ki /e değiştiricisi olmadan) ve ikinci argüman olarak iki argümanla anonim bir işlev belirtiliyor (normal ifade uygulandıktan sonra yürütülecek) : Verilerin depolanacağı $matches dizisi, normal ifadeyle eşleşiyor ve argümanlarla harici bir işlev çağırıyor. Bu örnekte, harici işleve print_smile adı verilir ve argüman olarak bulunan ilk oluşuma iletilir. Preg_replace'de \\1 olan (bulunan ilk oluşum) $matches haline gelecektir (eğer daha fazla argüman varsa o zaman $matches, $matches vb. olacaktır).

İşte daha karmaşık başka bir örnek:

Şunun gibiydi:

$out=preg_replace(“/<(=[\’\»]{0,1}|)(.*?)([\’\»]{0,1})>(.*?)<\/>/es", "feed_out_sub_rm('\\2′,'$base_prefix','$nick','$id_entry')", $out)

Şöyle oldu:

$out=preg_replace_callback('/<(=[\’\»]{0,1}|)(.*?)([\’\»]{0,1})>(.*?)<\/>/s', create_function('$eşleşmeler', 'return feed_out_sub_rm($eşleşmeler, "'.$base_prefix.", "'.$nick.", "'.$id_entry.") '), $out )

Burada alıntılarda kafa karıştırmak kolaydır, dikkatli olun.

Düzenli ifadeleri incelersek, PHP 5.3.0'dan bu yana eski sayılan (ve desteklenmeyen) iki işlevi daha hatırlayabiliriz. Belirtiler aşağıdaki gibidir:

Önemli hata: Yakalanmayan Hata: Tanımsız işleve çağrı ereg_replace()

Ereg_replace'deki normal ifade basitse, sınır karakterlerini şu şekilde ayarlayarak elde edebilirsiniz:

$str=ereg_replace("[\r\t\n]", "",$str)
$str=preg_replace(“/[\r\t\n]/”,””,$str)

Benzer semptom:

Önemli hata: Yakalanmayan Hata: Tanımsız fonksiyon split() çağrısı

$var_pair=split("=",$tmp)

$var_pair=explode("=",$tmp)

Düzenli ifade daha karmaşıksa onu preg_split'e dönüştürmeye çalışırız.

Bir şeyler yolunda gitmezse veya durumunuz örneklerimize hiç benzemiyorsa, bir yorum yazın, birlikte çözmeye çalışalım.

Gönderiye yorum bırakmak için VKontakte/FaceBook sosyal ağlarındaki hesabınızı veya Google/Yandex hesabınızı kullanarak giriş yapın.

PHP 7.0'ın yeni sürümüne yükseltmeye değer mi? – Kesinlikle buna değer, bunu aklınızdan bile geçirmeyin – devam edin!

Yedinci versiyonda oldukça fazla yenilik var. Başlıcaları:

  • PHP 7 çekirdeği PHPNG kullanıyor. Yeni çekirdek, sitelere %40 performans artışı sağlıyor;
  • İpuçları yazın ve değerleri döndürün. Artık bir fonksiyon bildirirken, her değişken için kendi tipini ve fonksiyonun döndüreceği veri tipini belirtebilirsiniz. Mevcut türler: int, float, string ve bool;
  • kombinasyon karşılaştırma operatörü ve çok daha fazlası.

PHP 7'de bazı uzantılar kaldırıldı:

  • MySQL

Zaten PHP 5.6.x'te bu uzantıların kullanılması istenmeyen bir durumdu. "Mysql" yerine "PDO" kullanmalısınız ve ereg → preg yerine kullanmalısınız.

Yeni PHP 7 ürünleri hakkında daha fazla bilgiyi resmi sayfada bulabilirsiniz.

PHP 7'ye yükseltmeye değer mi?

Şimdilik site performansını artırmak için yapabileceğiniz en kolay şey PHP 7.0.x'e yükseltmektir. Hız kazanımları aynı zamanda projenizin nasıl yazıldığına da bağlıdır. Hala şüpheniz varsa, bazı karşılaştırmalar gösterelim:

Karşılaştırmalar PHP 5.6 ve PHP 7 bazı çerçeveler için (Zend çerçevesi, Magento, Drupal, Mediawiki, WordPress, Laravel, SugarCRM, vb.):

Tüm çerçeveler için performans kazancı önemlidir. Çekirdek işlevleri ve yapılarıyla ilgili durumların nasıl olduğunu görelim:

Karşılaştırmalar PHP 5.6 ve PHP 7çekirdek işlevleri ve yapıları için:

Grafikler sizi ikna ederse sitenizi yeni bir PHP sürümüne geçirmeyi deneyebilir ve gerçek bir projedeki kazanımları hissedebilirsiniz.

Elasticweb'den meslektaşları, PHP 7 ile yeni bir sunucu başlatmadan önce, Laravel 5 üzerinde çalışan büyük bir hükümet projesi başlattıklarını söyledi. Bu, PHP'nin yeni sürümünün ve bir bütün olarak sunucunun bir tür performans testiydi. Daha önce bu proje PHP 5.6'ya sahip bir sunucudaydı. Siteyi taşıdıktan sonra sayfalar önemli ölçüde daha hızlı açılmaya başladı ve kaynak kullanımı yarı yarıya azaldı.

PHP 7'ye geçişe hazırlanmak için PHP 7 Geçiş Asistanı Raporu'nu (MAR) kullandılar. Çoğu popüler CMS/Frameworks zaten PHP 7 ile uyumludur, dolayısıyla asıl görev özel eklentileri test etmekti.

WordPress 4, Drupal 8/7 ve Joomla'nın en son sürümü PHP 7 için hazır!

İyi günler, sevgili okuyucular ve aboneler, çoğunuz muhtemelen Google arama motorunun, web siteleri için şifreleme sertifikaları yükleyerek, web yöneticilerine ikramiyeler sunarak, İnternet'teki tüm siteleri güvenli bir https bağlantısına aktarmak için büyük çaba gösterdiği bilgisini duymuşsunuzdur. arama sonuçlarında diğer her şey eşittir. Bu yüzden bu görevi ciddi olarak düşündüm, yaz aylarında siteyi taşımayı planlıyorum, ancak bu görevden önce her şeyi hazırlamam gerekiyor ve kendim için belirlediğim hazırlık aşamalarından biri de php 5'ten php 7'ye geçiş. mchost.ru barındırma

Neden php 5'ten php 7'ye geçmem gerekiyor?

İki şey beni bunu yapmaya itti:

  • PHP 7'den daha fazla işlevsellik elde ediyorum
  • Kaynaklarım üzerindeki yükü azaltıp istek sayısını azaltıyorum, böylece yüzdesi zaten yüzde 50'yi aşmış olan mobil arama sonuçları için artık çok önemli olan site yükleme hızını artırıyorum.

Makalede sitemin ayrıştırma yükü altında nasıl büküldüğünü ve sorunları çözdükten sonra teknik desteğin de PHP 7'yi destekleyen siteyle ona geçmenizi önerdiğini size zaten anlatmıştım. Php 5 ve php 7'nin performansını karşılaştıran testler için bağlantıya bakın.

Php sürümünü değiştirme

Mchost'ta VPS hostingim olduğundan, bu çok basit bir şekilde yapılıyor. Https://cp.mchost.ru/login.php adresindeki kişisel hesabınıza gidiyoruz. Daha sonra, herhangi bir normal insan gibi sitenin yedek bir kopyasını oluşturmalısınız. Yedeklemeler öğesine gidiyoruz, siteyi seçip oluşturuyoruz.

Bir sonraki adım siteleri seçmektir. Aralarında ihtiyacınız olanı bulun ve PHP Ayarları'na tıklayın.

Etki alanı için php öğesinde olası sürümlerin bir listesini göreceksiniz, şu anda en son sürüm FastCGI PHP 7.1'dir.

Php 5'ten php 7'ye geçiş süreci başlayacak, sağ tarafta bir ilerleme çubuğunuz olacak.

gördüğünüz gibi sürüm değişikliğinden önce 5.4.45'im var

Şimdi 7.1'e bakalım

Sürümler arasındaki çevirinin 15 dakikaya kadar sürebileceğini belirtmek isterim, bu nedenle bu işlemi akşama ertelemek daha iyidir

Bu arada, bu hostingden 3 aylık bedava almak istiyorsanız aşağıdaki banner'a tıklayın ve giriş yapın promosyon kodu 48C4-D018-AC60-50C6

Siteyi en son sürüme aktardıktan sonra, kaynağınızın tüm işlevlerini kontrol edin, her şeyin çalışıp çalışmadığını ve doğru şekilde görüntülenip görüntülenmediğini kontrol edin, değilse iki seçeneğiniz vardır, 1 geri almak, ikincisi siteyi değiştirmek.

Olası sorunlar

Bir hata aldığınız zamanlar vardır: Veritabanına bağlantı kurulurken hata oluştu

Çözüm basit; kişisel hesabınızdaki veritabanının şifresini güncellemeniz gerekiyor. Veritabanlarını seçin ve ihtiyacınız olana tıklayın (düzenleyin)

Şifreyi sıfırlayın.

Örneğin, şifreyi hatırlamıyorsanız ve benim gibi WordPress site motorunuz varsa, ftp sunucusuna bağlanıp sitenin kökünde wp-config.php dosyasını bulabilirsiniz.

Açın ve alanı bulun (MySQL Veritabanı Şifresi)

Başka sorunlarınız varsa yorumlara yazın, birlikte çözmeye çalışalım. Bu nedenle, bu görevi gerçekleştirmek için çok tembel olmayın, en son yazılımın tüm yeteneklerini kullanmak önemlidir, özellikle de barındırmada daha az yük ve kaynağınızın daha yüksek hızı gibi bir bonus elde ettiğiniz için.

PHP 7.0'ın yeni sürümüne yükseltmeye değer mi? - Kesinlikle buna değer, bunu aklınızdan bile geçirmeyin - devam edin!

Yedinci versiyonda oldukça fazla yenilik var. Başlıcaları:

  1. PHP 7 çekirdeği PHPNG'yi kullanır. Yeni çekirdek, sitelere %40 performans artışı sağlıyor;
  2. İpuçları yazın ve değerleri döndürün. Artık bir fonksiyon bildirirken, her değişken için kendi tipini ve fonksiyonun döndüreceği veri tipini belirtebilirsiniz. Mevcut türler: int, float, string ve bool;
  3. birleşik karşılaştırma operatörü ve çok daha fazlası.

PHP 7'de uzantılar kaldırıldı:

  • MySQL

Kaldırılan uzantılar uzun süredir "kullanımdan kaldırılmış" durumdadır; bunların kullanılması ekranda bir uyarının görüntülenmesine neden olmuştur. "Mysql" yerine "mysqli" veya "pdo_mysql", "ereg" => "preg_*" yerine kullanmanız gerekir.

Yeni PHP 7 ürünleri hakkında daha fazla bilgiyi resmi sayfada bulabilirsiniz.

PHP 7'ye yükseltmeye değer mi?

Şimdilik site performansını artırmak için yapabileceğiniz en kolay şey PHP 7.0.x'e yükseltmektir. Hız kazanımları aynı zamanda projenizin nasıl yazıldığına da bağlıdır. Hala şüpheniz varsa, bazı karşılaştırmalar gösterelim:

Karşılaştırmalar PHP 5.6 ve PHP 7 bazı çerçeveler ve CMS için (Zend çerçevesi, Magento, Drupal, Mediawiki, WordPress, Laravel, SugarCRM, vb.):

Tüm çerçeveler için performans kazancı önemlidir. Çekirdek işlevleri ve yapılarıyla ilgili durumların nasıl olduğunu görelim:

Grafikler sizi ikna ederse sitenizi yeni bir PHP sürümüne geçirmeyi deneyebilir ve gerçek bir projedeki kazanımları hissedebilirsiniz.

Bir düğüm oluştururken, düğümün PHP 7'ye sahip bir sunucuda oluşturulması için sunucular listesinde "Mavi" seçeneğini seçin.

1c bitrix, SSD sürücüsüne ve PHP 7.0'a dayalı olarak kendini bu şekilde gösteriyor