Rumah  >  Artikel  >  pembangunan bahagian belakang  >  [Hematemesis] 28 soalan temu bual tentang teknologi teras PHP untuk membantu anda menukar pekerjaan!

[Hematemesis] 28 soalan temu bual tentang teknologi teras PHP untuk membantu anda menukar pekerjaan!

青灯夜游
青灯夜游ke hadapan
2022-02-15 11:17:5420564semak imbas

Artikel ini menyusun dan berkongsi 28 soalan temu duga tentang teknologi teras PHP dengan anda Ia akan memberi anda pemahaman yang mendalam tentang teknologi teras PHP Anda boleh dengan cepat mengelakkan perangkap semasa temu duga berbaloi untuk dikumpulkan dan dipelajari.

[Hematemesis] 28 soalan temu bual tentang teknologi teras PHP untuk membantu anda menukar pekerjaan!

Cadangan berkaitan: "Ringkasan soalan temuduga PHP 2022 (koleksi) "

1 Apakah oop?

Jawapan: oop ialah pengaturcaraan berorientasikan objek ialah seni bina pengaturcaraan komputer Prinsip asas OOP ialah program komputer terdiri daripada subrutin tunggal yang boleh berfungsi sebagai subrutin Ia terdiri daripada unit atau objek.

OOP mempunyai tiga ciri utama

1. Enkapsulasi: juga dikenali sebagai penyembunyian maklumat, ia bermaksud memisahkan penggunaan dan pelaksanaan kelas, mengekalkan hanya beberapa antara muka dan kaedah Hubungi dunia luar, atau hanya dedahkan beberapa kaedah untuk digunakan oleh pembangun. Oleh itu, pembangun hanya perlu memberi perhatian kepada cara menggunakan kelas ini, dan bukannya mengambil berat tentang proses pelaksanaannya yang khusus Ini boleh mencapai pembahagian kerja dan kerjasama MVC, dan juga boleh mengelakkan pergantungan antara program dengan berkesan dan mencapai gandingan longgar antara modul kod.

2. Pewarisan: subkelas secara automatik mewarisi atribut dan kaedah kelas induknya, dan boleh menambah atribut dan kaedah baharu atau menulis semula beberapa atribut dan kaedah. Warisan meningkatkan kebolehgunaan semula kod. PHP hanya menyokong warisan tunggal, yang bermaksud bahawa subkelas hanya boleh mempunyai satu kelas induk.

3. Polimorfisme: Subkelas mewarisi atribut dan kaedah daripada kelas induk dan mengatasi beberapa kaedah. Oleh itu, walaupun berbilang subkelas mempunyai kaedah yang sama, objek yang digunakan oleh subkelas ini boleh memperoleh hasil yang berbeza selepas memanggil kaedah yang sama Teknologi ini adalah polimorfisme.

Polymorphism meningkatkan fleksibiliti perisian.

1. Mudah diselenggara

Struktur direka dengan pemikiran berorientasikan objek dan mempunyai kebolehbacaan yang tinggi Disebabkan kewujudan warisan, walaupun keperluan berubah, penyelenggaraan akan hanya berada dalam modul tempatan, jadi Ia adalah sangat mudah dan kos rendah untuk mengekalkan.

2. Berkualiti tinggi

Semasa reka bentuk, kelas sedia ada yang telah diuji dalam bidang projek terdahulu boleh digunakan semula untuk menjadikan sistem memenuhi keperluan perniagaan dan mempunyai kualiti yang tinggi.

3. Kecekapan tinggi

Semasa pembangunan perisian, perkara-perkara dalam dunia sebenar diabstraksikan dan kelas dijana mengikut keperluan reka bentuk. Menggunakan kaedah ini untuk menyelesaikan masalah adalah dekat dengan kehidupan seharian dan cara berfikir semula jadi, yang pasti akan meningkatkan kecekapan dan kualiti pembangunan perisian.

4 Mudah dikembangkan

Disebabkan oleh ciri-ciri pewarisan, enkapsulasi dan polimorfisme, struktur sistem dengan kohesi tinggi dan gandingan rendah direka secara semula jadi, menjadikan sistem lebih fleksibel, lebih mudah untuk berkembang, dan kos efektif lebih rendah.

2 Terdapat beberapa cara untuk menggabungkan dua tatasusunan Cuba bandingkan persamaan dan perbezaannya

Kaedah:

1. array_merge ()

2, ' '

3, array_merge_recursive

Persamaan dan perbezaan:

array_merge_simple merge array

array_merge_recursive menggabungkan dua tatasusunan Jika terdapat data yang betul-betul sama dalam tatasusunan, cantumkannya secara rekursif

array_combine dan ' ': menggabungkan dua tatasusunan, dan nilai yang pertama berfungsi sebagai kunci. tatasusunan baharu

3 Terdapat pepijat dalam fungsi is_writeable() PHP, yang tidak dapat menentukan dengan tepat sama ada direktori/fail boleh ditulis Sila tulis fungsi untuk menentukan sama ada direktori/fail itu benar-benar boleh ditulis

Jawapan: Antaranya Pepijat wujud dalam dua aspek,

1 Dalam tingkap, apabila fail hanya mempunyai atribut baca sahaja, fungsi is_writeable() mengembalikan palsu . Apabila benar dikembalikan, fail itu tidak semestinya boleh ditulis.

Jika ia adalah direktori, buat fail baharu dalam direktori dan semak dengan membuka fail itu; (fopen).

2. Dalam Unix, apabila safe_mode dihidupkan dalam fail konfigurasi php (safe_mode=on), is_writeable() juga tidak tersedia.

Baca fail konfigurasi untuk melihat sama ada safe_mode didayakan.

/**
* Tests for file writability
*
* is_writable() returns TRUE on Windows servers when you really can't write to
* the file, based on the read-only attribute. is_writable() is also unreliable
* on Unix servers if safe_mode is on.
*
* @access   private
* @return   void
*/
if ( ! function_exists('is_really_writable'))
{
    function is_really_writable($file){
    // If we're on a Unix server with safe_mode off we call is_writable
    if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE){
        return is_writable($file);
    }
    // For windows servers and safe_mode "on" installations we'll actually
    // write a file then read it. Bah...
    if (is_dir($file)){
        $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100));
        if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE){
            return FALSE;
        }
        fclose($fp);
        @chmod($file, DIR_WRITE_MODE);
        @unlink($file);
        return TRUE;
    } elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) {
        return FALSE;
    }
    fclose($fp);
    return TRUE;
    }
}
4 Apakah mekanisme kutipan sampah PHP?

PHP boleh mengurus memori secara automatik dan mengosongkan objek yang tidak diperlukan lagi. PHP menggunakan pengiraan rujukan, mekanisme pengumpulan sampah yang mudah.

Setiap objek mengandungi pembilang rujukan Setiap rujukan disambungkan kepada objek dan pembilang ditambah dengan 1. Apabila rujukan meninggalkan ruang kediaman atau ditetapkan kepada NULL, kaunter dikurangkan sebanyak 1. Apabila kaunter rujukan objek mencapai sifar, PHP mengetahui bahawa anda tidak perlu lagi menggunakan objek dan melepaskan ruang memori yang didudukinya.

5 Tulis fungsi untuk mengekstrak sambungan fail daripada URL standard secekap mungkin,

Contohnya: http://www.startphp.cn /abc /de/fg.php?id=1 perlu mengeluarkan php atau .php

<?php
    // 方案一
    function getExt1($url){
        $arr = parse_url($url);
        //Array ( [scheme] => http [host] => www.startphp.cn [path] => /abc/de/fg.php [query] => id=1 )
        $file = basename($arr[&#39;path&#39;]);
        $ext = explode(&#39;.&#39;, $file);
        return $ext[count($ext)-1];
    }
    // 方案二
    function getExt2($url){
        $url = basename($url);
        $pos1 = strpos($url,&#39;.&#39;);
        $pos2 = strpos($url,&#39;?&#39;);
        if (strstr($url,&#39;?&#39;)) {
            return substr($url,$pos1+1,$pos2-$pos1-1);
        } else {
            return substr($url,$pos1);
        }
    }
    $path = "http://www.startphp.cn/abc/de/fg.php?id=1";
    echo getExt1($path);
    echo "<br />";
    echo getExt2($path);
?>
6 Gunakan ungkapan biasa untuk mengekstrak sekeping bahasa markup (html atau xml)

Nilai atribut yang ditentukan bagi teg yang ditentukan dalam coretan kod (anda perlu mempertimbangkan ketidakteraturan nilai atribut, seperti ketakpekaan huruf besar-besaran, ruang antara nama atribut dan tanda sama, dll.). Diandaikan di sini bahawa nilai atribut attr teg ujian perlu diekstrak. Sila bina rentetan yang mengandungi teg itu sendiri (Tencent)

seperti berikut:

<?php
    header("content-type:text/html;charset=utf-8");
    function getAttrValue($str,$tagName,$attrName){
        $pattern1="/<".$tagName."(s+w+s*=s*([&#39;"]?)([^&#39;"]*)())*s+".$attrName."s*=s*([&#39;"]?)([^&#39;"]*)()(s+w+s*=s*([&#39;"]?)([^&#39;"]*)(9))*s*>/i";
        $arr=array();
        $re=preg_match($pattern1,$str,$arr);
        if($re){
            echo"<br/>$arr[6]={$arr[6]}";
        }else{
            echo"<br/>没找到。";
        }
    }
    // 示例
    $str1="<test attr=&#39;ddd&#39;>";
    getAttrValue($str1,"test","attr");//找test标签中attr属性的值,结果为ddd
    $str2="<test2 attr=&#39;ddd&#39;attr2=&#39;ddd2&#39;t1="t1 value"t2=&#39;t2 value&#39;>";
    getAttrValue($str2,"test2","t1");//找test2标签中t1属性的值,结果为t1 value
?>

7 php中WEB上传文件的原理是什么,如何限制上传文件的大小?

上传文件的表单使用post方式,并且要在form中添加enctype='multipart/form-data'。

一般可以加上隐藏域:a477cd11f888a00d3a5c1a04e2bd042a,位置在file域前面。

value的值是上传文件的客户端字节限制。可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。

使用file文件域来选择要上传的文件,当点击提交按钮之后,文件会被上传到服务器中的临时目录,在脚本运行结束时会被销毁,所以应该在脚本结束之前,将其移动到服务器上的某个目录下,可以通过函数move_uploaded_file()来移动临时文件,要获取临时文件的信息,使用$_FILES。

限制上传文件大小的因素有:

客户端的隐藏域MAX_FILE_SIZE的数值(可以被绕开)。

服务器端的upload_max_filesizepost_max_sizememory_limit。这几项不能够用脚本来设置。

自定义文件大小限制逻辑。即使服务器的限制是能自己决定,也会有需要个别考虑的情况。所以这个限制方式经常是必要的。

8 请说明 PHP 中传值与传引用的区别,什么时候传值什么时候传引用?

按值传递:函数范围内对值的任何改变在函数外部都会被忽略

按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

9 MySQL数据库中的字段类型varchar和char的主要区别是什么?

Varchar是变长,节省存储空间,char是固定长度。查找效率要char型快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些。

10 静态化如何实现的?伪静态如何实现?

1、 静态化指的是页面静态化,也即生成实实在在的静态文件,也即不需要查询数据库就可以直接从文件中获取数据,指的是真静态。

实现方式主要有两种:一种是我们在添加信息入库的时候就生成的静态文件,也称为模板替换技术。一种是用户在访问我们的页面时先判断是否有对应的缓存文件存在,如果存在就读缓存,不存在就读数据库,同时生成缓存文件。

2、伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。

实习原理是基于Apache或Nginx的rewrite

主要有两种方式:

一种是直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器。

另一种采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰。

11 如何处理负载,高并发?

1、HTML静态化

效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。

2、图片服务器分离

把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等

3、数据库集群和库表散列及缓存

数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。

4、镜像:

尽量减少下载,可以把不同的请求分发到多个镜像端。

5、负载均衡:

Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。

12 PHP7的新特性?

标量类型声明:PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。 

Pengisytiharan jenis nilai pulangan: Menambah sokongan untuk pengisytiharan jenis pulangan. Sama seperti pengisytiharan jenis parameter, pengisytiharan jenis pulangan menentukan jenis nilai pulangan fungsi. Jenis yang tersedia adalah sama seperti yang tersedia dalam pengisytiharan parameter.

Pengendali penggabungan NULL: Oleh kerana terdapat banyak situasi di mana ungkapan ternary dan isset() digunakan secara serentak dalam penggunaan harian, pengendali penggabungan NULL akan mengembalikan nilainya sendiri jika pembolehubah wujud dan nilainya bukan NULL . , sebaliknya mengembalikan operan kedua.

pertingkatan penggunaan: kelas, fungsi dan pemalar yang diimport dari ruang nama yang sama kini boleh diimport sekaligus melalui satu penyataan penggunaan tunggal: kini menyokong penggunaan kelas tanpa nama melalui kelas baharu

<.>13 serangan keselamatan PHP biasa suntikan SQL:

Pengguna menggunakan kaedah memasukkan pernyataan SQL dalam medan borang untuk menjejaskan pelaksanaan SQL biasa.

Cegah: Gunakan mysql_real_escape_string() untuk menapis data secara manual sama ada setiap data adalah jenis data yang betul . Di mana nilai atau data perlu diisi, gunakan parameter (Parameter) untuk memberikan nilai, menggunakan @ atau? untuk mewakili parameter.

Serangan XSS: Serangan skrip merentas tapak, di mana pengguna memasukkan beberapa data ke dalam tapak web anda, yang termasuk skrip sisi klien (biasanya JavaScript). Jika anda mengeluarkan data ke halaman web lain tanpa penapisan, skrip ini akan dilaksanakan.

Pencegahan: Untuk mengelakkan serangan XSS, gunakan fungsi htmlentities() PHP untuk menapis dan kemudian mengeluarkan ke penyemak imbas.

CSRF: Pemalsuan permintaan merentas tapak, iaitu permintaan yang dibuat oleh halaman yang kelihatan seperti pengguna laman web yang dipercayai, tetapi palsu

Cegah: Secara umumnya, pastikan pengguna datang daripada borang anda, dan padankan setiap borang yang anda hantar. Dua perkara yang perlu diingat: Gunakan langkah keselamatan yang sesuai untuk sesi pengguna, seperti mengemas kini ID untuk setiap sesi dan menggunakan SSL untuk pengguna. Hasilkan token sekali lagi dan benamkannya dalam borang, simpan dalam sesi (pembolehubah sesi), semaknya semasa diserahkan. Contohnya, suntikan kod _token

dalam laravel: Suntikan kod disebabkan oleh mengeksploitasi kelemahan komputer dengan memproses data tidak sah. Masalahnya datang apabila anda secara tidak sengaja melaksanakan kod sewenang-wenangnya, biasanya melalui kemasukan fail. Kod yang ditulis dengan buruk boleh membenarkan fail jauh disertakan dan dilaksanakan. Seperti kebanyakan fungsi PHP, memerlukan boleh mengandungi URL atau nama fail.

Halang suntikan kod dan tapis input pengguna. Lumpuhkan allow_url_fopen dan allow_url_include dalam php.ini. Ini akan melumpuhkan memerlukan/menyertakan/membuka fail jauh

14 Apakah ciri berorientasikan objek

Terutamanya termasuk pengkapsulan, pewarisan dan polimorfisme. Jika ia adalah 4 aspek, tambahkan: abstraksi.

Encapsulation:

Encapsulation ialah asas untuk memastikan komponen perisian mempunyai modulariti yang sangat baik perubahan yang disebabkan oleh saling kebergantungan program

Warisan:

Apabila mentakrifkan dan melaksanakan kelas, anda boleh membina kelas sedia ada Datang dan gunakan kandungan yang ditakrifkan oleh ini. kelas sedia ada sebagai kandungan anda sendiri, dan anda boleh menambah beberapa kandungan baharu, atau mengubah suai kaedah asal untuk menjadikannya lebih sesuai untuk keperluan khas. Ini adalah warisan. Warisan ialah mekanisme untuk subkelas berkongsi data dan kaedah kelas induk secara automatik. Ini adalah hubungan antara kelas yang meningkatkan kebolehgunaan semula dan kebolehskalaan perisian.

Polymorphism:

Polymorphism merujuk kepada jenis khusus yang ditunjuk oleh pembolehubah rujukan yang ditakrifkan dalam atur cara dan panggilan kaedah yang dikeluarkan melalui pembolehubah rujukan tidak diubah semasa pengaturcaraan . Ditentukan, tetapi hanya ditentukan semasa menjalankan program, iaitu, objek contoh kelas mana yang akan ditunjukkan oleh pembolehubah rujukan, dan panggilan kaedah yang dikeluarkan oleh pembolehubah rujukan ialah kaedah yang dilaksanakan di kelas mana, yang mesti ditentukan semasa menjalankan program.

Abstraksi:

Abstraksi ialah untuk mengetahui persamaan dan persamaan beberapa perkara, dan kemudian mengklasifikasikan perkara ini ke dalam kelas ini hanya mempertimbangkan persamaan ini perkara dan persamaan, dan akan mengabaikan aspek-aspek yang tidak relevan dengan topik dan matlamat semasa, dan menumpukan pada aspek yang relevan dengan matlamat semasa. Sebagai contoh, jika anda melihat semut dan gajah dan anda boleh bayangkan bagaimana mereka serupa, itu adalah abstraksi.

15 Apakah kaedah untuk mengoptimumkan pernyataan SQL? (Pilih beberapa)

(1) Dalam klausa Where: Sambungan antara jadual di mana mesti ditulis sebelum syarat Di mana yang lain, dan syarat yang boleh menapis bilangan rekod maksimum mesti ditulis dalam sub Where Pada akhir ayat.HAVING last.

(2) Gantikan IN dengan EXISTS dan NOT IN dengan NOT EXISTS.

(3) Elakkan menggunakan pengiraan pada lajur indeks

(4) Elakkan menggunakan IS NULL dan IS NOT NULL pada lajur indeks

(5) Optimumkan pertanyaan, anda harus mencuba untuk mengelakkan imbasan jadual penuh, dan mula-mula pertimbangkan untuk mencipta indeks pada lajur yang terlibat dalam tempat dan susunan mengikut.

(6) Cuba elakkan membuat pertimbangan nilai nol pada medan dalam klausa where, jika tidak enjin akan berhenti menggunakan indeks dan melakukan imbasan jadual penuh

(7) Cuba elak menggunakan klausa where Laksanakan operasi ungkapan pada medan dalam klausa, yang akan menyebabkan enjin ditinggalkan menggunakan indeks dan melakukan imbasan jadual penuh

16 Pangkalan data MySQL digunakan sebagai storan sistem penerbitan Kenaikan adalah lebih daripada 50,000 setiap hari Operasi dan penyelenggaraan dijangka tiga tahun.

(1) Reka struktur pangkalan data yang direka bentuk dengan baik, benarkan lebihan data separa dan cuba elakkan pertanyaan menyertai untuk meningkatkan kecekapan.

(2) Pilih jenis data medan jadual dan enjin storan yang sesuai, dan tambah indeks dengan sewajarnya.

(3) Lakukan pemisahan baca-tulis replikasi master-slave mysql.

(4) Bahagikan jadual data kepada jadual untuk mengurangkan jumlah data dalam satu jadual dan meningkatkan kelajuan pertanyaan.

(5) Tambah mekanisme caching, seperti redis, memcached, dsb.

(6) Untuk halaman yang tidak kerap berubah, hasilkan halaman statik (seperti cache ob).

(7) Tulis SQL yang cekap. Contohnya, SELECT * FROM TABEL ditukar kepada SELECT field_1, field_2, field_3 FROM TABLE.

17 Untuk tapak web yang mempunyai trafik tinggi, apakah kaedah yang anda gunakan untuk menyelesaikan masalah statistik lawatan halaman?

(1) Sahkan sama ada pelayan boleh menyokong trafik semasa.

(2) Optimumkan akses pangkalan data.

(3) Larang akses luaran kepada pautan (hotlinking), seperti hotlinking gambar.

(4) Kawal muat turun fail.

(5) Lakukan pengimbangan beban dan gunakan hos yang berbeza untuk memunggah trafik.

(6) Gunakan perisian statistik penyemakan imbas untuk memahami bilangan lawatan dan melakukan pengoptimuman yang disasarkan.

18 Bercakap tentang pemahaman anda tentang perbezaan antara MyISAM dan InnoDB dalam enjin mysql?

InnoDB dan MyISAM ialah dua jenis jadual yang paling biasa digunakan oleh ramai orang apabila menggunakan MySQL Kedua-dua jenis jadual mempunyai kelebihan dan kekurangannya sendiri, bergantung pada aplikasi tertentu. Perbezaan asas ialah: jenis MyISAM tidak menyokong pemprosesan lanjutan seperti pemprosesan transaksi, manakala jenis InnoDB menyokongnya. Jadual jenis MyISAM menekankan prestasi, dan masa pelaksanaannya lebih cepat daripada jenis InnoDB, tetapi ia tidak menyediakan sokongan transaksi, manakala InnoDB menyediakan sokongan transaksi dan fungsi pangkalan data lanjutan seperti kunci asing.

Berikut ialah beberapa butiran dan perbezaan pelaksanaan khusus:

Apakah perbezaan antara MyISAM dan InnoDB?

1. Struktur storan

MyISAM: Setiap MyISAM disimpan sebagai tiga fail pada cakera. Nama fail pertama bermula dengan nama jadual dan sambungan menunjukkan jenis fail. Fail .frm menyimpan takrif jadual. Sambungan fail data ialah .MYD (MYData). Sambungan fail indeks ialah .MYI (MYIndex).

InnoDB: Semua jadual disimpan dalam fail data yang sama (atau berbilang fail, atau fail ruang jadual bebas Saiz jadual InnoDB hanya dihadkan oleh saiz fail sistem pengendalian umumnya 2GB).

2. Ruang storan

MyISAM: Ia boleh dimampatkan dan mempunyai ruang storan yang lebih kecil. Menyokong tiga format storan berbeza: jadual statik (lalai, tetapi sila ambil perhatian bahawa mesti tiada ruang di hujung data, ia akan dialih keluar), jadual dinamik dan jadual dimampatkan.

InnoDB: memerlukan lebih banyak memori dan storan, ia akan mewujudkan kumpulan penimbal khususnya sendiri dalam memori utama untuk menyimpan data dan indeks.

3. Mudah alih, sandaran dan pemulihan

MyISAM: Data disimpan dalam bentuk fail, jadi ia sangat mudah untuk pemindahan data merentas platform. Anda boleh melakukan operasi di atas meja secara individu semasa sandaran dan pemulihan.

InnoDB: Penyelesaian percuma termasuk menyalin fail data, menyandarkan binlog atau menggunakan mysqldump, yang agak menyakitkan apabila volum data mencapai berpuluh-puluh gigabait.

4. Sokongan transaksi

MyISAM: Penekanan adalah pada prestasi setiap pertanyaan adalah atom dan masa pelaksanaannya lebih cepat daripada jenis InnoDB, tetapi ia tidak menyediakan sokongan transaksi.

InnoDB: Menyediakan sokongan transaksi, kunci asing dan fungsi pangkalan data lanjutan yang lain. Jadual selamat urus niaga (patuh ACID) dengan keupayaan transaksi (komit), gulung balik (balik semula) dan ranap sistem.

5. AUTO_INCREMENT

MyISAM: Anda boleh mencipta indeks bersama dengan medan lain. Lajur pertumbuhan automatik enjin mestilah indeks Jika ia adalah indeks gabungan, lajur pertumbuhan automatik tidak perlu menjadi lajur pertama Ia boleh diisih mengikut lajur sebelumnya dan kemudian ditambah.

InnoDB: InnoDB mesti mengandungi indeks dengan medan ini sahaja. Lajur pertumbuhan automatik enjin mestilah indeks, dan jika indeks komposit, lajur itu juga mesti menjadi lajur pertama indeks komposit.

6. Perbezaan kunci jadual

MyISAM: hanya menyokong kunci peringkat jadual Apabila pengguna mengendalikan jadual myisam, pilih, kemas kini, padam dan masukkan penyata akan mengunci jadual secara automatik jadual pada masa hadapan memenuhi konkurensi sisipan, data baharu boleh disisipkan di hujung jadual.

InnoDB: Menyokong transaksi dan kunci peringkat baris ialah ciri terbesar innodb. Kunci baris meningkatkan prestasi operasi serentak berbilang pengguna. Walau bagaimanapun, kunci baris InnoDB hanya sah pada kunci utama WHERE Sebarang kunci bukan utama WHERE akan mengunci seluruh jadual.

7. Indeks teks penuh

MyISAM: menyokong indeks teks penuh jenis FULLTEXT

InnoDB: tidak menyokong indeks teks penuh jenis FULLTEXT, tetapi innodb boleh gunakan pemalam sphinx untuk menyokong indeks teks penuh Dan ia berfungsi dengan lebih baik.

8. Kunci utama jadual

MyISAM: Membenarkan jadual tanpa sebarang indeks dan kunci utama wujud.

InnoDB: Jika tiada kunci utama atau set indeks unik yang tidak kosong, kunci utama 6 bait akan dijana secara automatik (tidak kelihatan kepada pengguna, data tersebut adalah sebahagian daripada indeks utama). indeks tambahan menyimpan nilai indeks utama.

9. Bilangan baris tertentu dalam jadual

MyISAM: Menyimpan jumlah baris dalam jadual jika count(*) daripada jadual; keluar secara langsung.

InnoDB: Jumlah bilangan baris dalam jadual tidak disimpan Jika anda menggunakan pilih count(*) dari jadual, ia akan melintasi keseluruhan jadual, yang menggunakan banyak wang, selepas menambah keadaan. myisam dan innodb mengendalikannya dengan cara yang sama.

10. Operasi CURD

MyISAM: Jika anda melakukan sejumlah besar PILIHAN, MyISAM ialah pilihan yang lebih baik.

InnoDB: Jika data anda melakukan banyak INSERT atau UPDATE, anda harus menggunakan jadual InnoDB atas sebab prestasi. PADAM adalah lebih baik dalam prestasi daripada InnoDB, tetapi apabila PADAM DARI jadual, InnoDB tidak akan mencipta semula jadual, tetapi akan memadamkannya baris demi baris Jika anda ingin mengosongkan jadual dengan jumlah data yang banyak pada InnoDB, sebaiknya untuk menggunakan perintah truncate table.

11. Kunci asing

MyISAM: Tidak disokong

InnoDB: Disokong

Melalui analisis di atas, anda pada asasnya boleh mempertimbangkan untuk menggunakan InnoDB untuk menggantikan MyISAM enjin Sebabnya ialah InnoDB mempunyai banyak ciri yang baik, seperti sokongan urus niaga, prosedur tersimpan, pandangan, penguncian peringkat baris, dan lain-lain. Dalam kes banyak konkurensi, saya percaya bahawa prestasi InnoDB pasti akan jauh lebih baik daripada MyISAM. Selain itu, tiada jadual yang maha kuasa Hanya dengan memilih jenis jadual yang sesuai untuk jenis perniagaan boleh kelebihan prestasi MySQL dimaksimumkan. Jika ia bukan aplikasi web yang sangat kompleks atau aplikasi tidak kritikal, anda masih boleh mempertimbangkan MyISAM Anda boleh mempertimbangkan sendiri situasi khusus ini.

19 Perbezaan antara redis dan memache cache

Ringkasan 1:

1 .Jenis data

Redis mempunyai jenis data yang kaya, senarai set sokongan dan jenis lain

memcache menyokong jenis data ringkas dan pelanggan perlu mengendalikan objek kompleks dengan sendirinya

2. Kegigihan

redis menyokong storan berterusan pendaratan data

memcache tidak menyokong storan berterusan data

3

redis menyokong mod replikasi tuan-hamba

memcache boleh menggunakan pencincangan yang konsisten untuk pengedaran

saiz nilai adalah berbeza

memcache ialah cache memori , kunci Panjangnya kurang daripada 250 aksara, dan storan satu item adalah kurang daripada 1M, yang tidak sesuai untuk kegunaan mesin maya

4 Ketekalan data adalah berbeza

Redis menggunakan model satu benang untuk memastikan Data diserahkan mengikut tertib.

Memcache perlu menggunakan cas untuk memastikan ketekalan data. CAS (Semak dan Tetapkan) adalah mekanisme untuk memastikan konsistensi konkurensi dan tergolong dalam kategori "pengunci optimistik" prinsipnya sangat mudah: ambil nombor versi, beroperasi, bandingkan nombor versi, jika ia konsisten, beroperasi, jika tidak, tinggalkan sebarang operasi

penggunaan 5.cpu

Model berbenang tunggal redis hanya boleh menggunakan satu CPU dan boleh membuka berbilang proses redis

Ringkasan 2:

1 Dalam Redis, tidak semua data sentiasa disimpan dalam ingatan Ini adalah perbezaan terbesar berbanding dengan Memcached.

2.Redis bukan sahaja menyokong data jenis k/v yang ringkas, tetapi juga menyediakan storan struktur data seperti senarai, set dan cincang.

3.Redis menyokong sandaran data, iaitu sandaran data dalam mod tuan-hamba.

4.Redis menyokong kegigihan data, yang boleh menyimpan data dalam memori pada cakera dan boleh dimuatkan semula untuk digunakan semasa memulakan semula.

Saya secara peribadi berpendapat bahawa perbezaan yang paling penting ialah Redis mempunyai ciri-ciri pangkalan data dalam banyak aspek, atau merupakan sistem pangkalan data, manakala Memcached hanyalah cache K/V yang ringkas

Ringkasan 3:

Perbezaan antara redis dan memecache ialah:

1 >memecache menyimpan semua data Ia disimpan dalam memori dan akan ditutup selepas bekalan elektrik terputus Data tidak boleh melebihi saiz memori

Sebahagian daripada redis disimpan pada cakera keras, yang memastikan kegigihannya. data.

2. Jenis sokongan data:

Redis mempunyai lebih banyak sokongan data daripada memecache.

3. Model asas adalah berbeza:

Versi baharu redis secara langsung membina mekanisme VM dengan sendirinya, kerana sistem umum memanggil fungsi sistem, yang akan membazir jangka masa tertentu. Pergi bergerak dan minta.

4. Persekitaran operasi yang berbeza:

redis pada masa ini hanya menyokong Linux secara rasmi, dengan itu menghapuskan keperluan untuk sokongan untuk sistem lain, supaya ia boleh diuruskan dengan lebih baik. telah digunakan untuk mengoptimumkan persekitaran sistem, walaupun pasukan dari Microsoft kemudiannya menulis tampalan untuknya. Tetapi ia tidak diletakkan pada trunk

memcache hanya boleh digunakan sebagai cache, cache

Kandungan redis boleh dilaksanakan, yang agak serupa dengan MongoDB, dan redis juga boleh digunakan sebagai cache dan boleh ditetapkan tuan-hamba

20 Apakah yang perlu kita perhatikan dalam baris gilir mesej redis pertama masuk dahulu?

Jawapan : Biasanya senarai digunakan untuk melaksanakan operasi baris gilir, yang mempunyai had kecil, jadi Semua tugas adalah seragam masuk dahulu, keluar dahulu Jika anda ingin mengutamakan tugas tertentu, ini tidak mudah untuk dikendalikan untuk mempunyai konsep keutamaan. Kami boleh mengutamakan tugas peringkat tinggi

1)单一列表实现:队列正常的操作是 左进右出(lpush,rpop)为了先处理高优先级任务,在遇到高级别任务时,可以直接插队,直接放入队列头部(rpush),这样,从队列头部(右侧)获取任务时,取到的就是高优先级的任务(rpop)

2)使用两个队列,一个普通队列,一个高级队列,针对任务的级别放入不同的队列,获取任务时也很简单,redis的BRPOP命令可以按顺序从多个队列中取值,BRPOP会按照给出的 key 顺序查看,并在找到的第一个非空 list 的尾部弹出一个元素,redis> BRPOP list1 list2 0

list1 做为高优先级任务队列
list2 做为普通任务队列

这样就实现了先处理高优先级任务,当没有高优先级任务时,就去获取普通任务
方式1  最简单,但实际应用比较局限,方式3可以实现复杂优先级,但实现比较复杂,不利于维护
方式2  是推荐用法,实际应用最为合适

21 Redis如何防止高并发?

答:其实redis是不会存在并发问题的,因为他是单进程的,再多的命令都是一个接一个地执行的。我们使用的时候,可能会出现并发问题,比如获得和设定这一对。Redis的为什么 有高并发问题?Redis的出身决定等

Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对redis进行并发访问时会出现问题。发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。

同时,单线程的天性决定,高并发对同一个键的操作会排队处理,如果并发量很大,可能造成后来的请求超时。

在远程访问redis的时候,因为网络等原因造成高并发访问延迟返回的问题。

解决办法

在客户端将连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。

服务器角度,利用setnx变向实现锁机制。

22 做秒杀用什么数据库,怎么实现的?

答:因为秒杀的一瞬间,并发非常大,如果同时请求数据库,会导致数据库的压力非常大,导致数据库的性能急剧下降,更严重的可能会导致数据库服务器宕机。

这时候一般采用内存高速缓存数据库redis来实现的,redis是非关系型数据库,redis是单线程的,通过redis的队列可以完成秒杀过程。

23 什么情况下使用缓存?

答:当用户第一次访问应用系统的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--ticket;

用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把 ticket送到认证系统进行校验,检查ticket的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。

实现主要技术点:

1、两个站点共用一个数据验证系统

2、主要通过跨域请求的方式来实现验证及session处理。

24 如何解决异常处理?

答: 抛出异常:使用try…catch,异常的代码放在try代码块内,如果没有触发异常,则代码继续执行,如果异常被触发,就会 抛出一个异常。Catch代码块捕获异常,并创建一个包含异常信息的对象。$e->getMessage(),输出异常的错误信息。

解决异常:使用set_error_handler函数获取异常(也可以使用try()和catch()函数),然后使用set_exception_handler()函数设置默认的异常处理程序,register_shutdown_function()函数来执行,执行机制是,php要把调入的函数调入到内存,当页面所有的php语句都执行完成时,再调用此函数

25 权限管理(RBAC)的实现?

1.首先创建一张用户表:id name auto(保存格式为:控制器-方法)

2.然后在后台中创建一个基类控制器,控制器里封装一个构造方法,当用户登陆成功后,使用TP框架中封装好的session函数获取保存在服务器中的session id,然后实例化模型,通过用户id获取保存在数据表中的auth数据,使用explode函数分割获取到的数据,并使用一个数组保存起来,然后使用TP框架中封装好的常量获取当前控制器和方法,然后把他们组装成字符串,使用in_array函数进行判断该数组中是否含有当前获取到的控制器和方法,如果没有,就提示该用户没有权限,如果有就进行下一步操作

26 Bagaimana untuk memastikan bahawa produk promosi tidak akan terjual terlebih dahulu?

Jawapan: Masalah ini adalah kesukaran yang kami hadapi semasa pembangunan bilangannya tidak konsisten dengan bilangan produk yang ingin kami promosikan Setiap kali, bilangan pesanan sentiasa lebih daripada bilangan produk yang kami promosikan untuk masa yang lama dan membuat beberapa rancangan untuk mencapainya:

Pilihan pertama: Sebelum membuat pesanan, kami menentukan sama ada kuantiti produk promosi mencukupi Jika tidak mencukupi, kami tidak dibenarkan membuat pesanan Apabila menukar inventori, tambah syarat dan sahaja tukar inventori produk yang inventorinya lebih besar daripada 0. Pada masa itu, Kami menggunakan ab untuk ujian tekanan Apabila konkurensi melebihi 500 dan bilangan lawatan melebihi 2,000, penjualan berlebihan masih akan berlaku. Jadi kami menafikannya.

Penyelesaian kedua: gunakan transaksi MySQL dan kunci eksklusif untuk menyelesaikan masalah Pertama, kami memilih enjin storan pangkalan data sebagai innoDB, yang dilaksanakan menggunakan kunci eksklusif Pada mulanya, kami menguji kunci yang dikongsi . Didapati bahawa keadaan terlebih jual masih berlaku. Satu masalah ialah apabila kami menjalankan ujian konkurensi tinggi, ia mempunyai kesan yang besar terhadap prestasi pangkalan data, menyebabkan tekanan besar pada pangkalan data, dan akhirnya ditolak oleh kami.

Pilihan ketiga: Gunakan pelaksanaan kunci fail. Apabila pengguna mengambil item promosi, kunci fail mula-mula dicetuskan untuk menghalang pengguna lain daripada memasuki Selepas pengguna mengambil item promosi, kunci fail dibuka dan pengguna lain dibenarkan untuk beroperasi. Ini boleh menyelesaikan masalah terlebih jual, tetapi ia akan menyebabkan banyak overhed I/O untuk fail.

Akhir sekali kami menggunakan baris gilir redis untuk dilaksanakan. Bilangan produk yang akan dipromosikan disimpan dalam redis dalam baris gilir Setiap kali pengguna merebut produk promosi, sekeping data dipadamkan daripada baris gilir untuk memastikan produk tersebut tidak terjual terlebih dahulu. Ini sangat mudah untuk dikendalikan dan sangat cekap Pada akhirnya, kami menggunakan kaedah ini untuk mencapai

27 Bagaimana untuk merealisasikan jualan kilat di pusat membeli-belah?

Jawapan: Belian tergesa-gesa dan jualan kilat adalah trend masa kini Senario aplikasi yang sangat biasa, terdapat dua masalah utama yang perlu diselesaikan:

  • Tekanan yang disebabkan oleh keselarasan tinggi pada pangkalan data

  • Di bawah keadaan persaingan Bagaimana untuk menyelesaikan pengurangan inventori yang betul (masalah "oversold")

Untuk masalah pertama, ia sudah mudah untuk difikirkan menggunakan cache untuk mengendalikan pembelian tergesa-gesa dan mengelak daripada mengendalikan pangkalan data secara langsung, seperti menggunakan Redis.

Soalan kedua, kita boleh menggunakan redis queue untuk menyelesaikan, meletakkan produk untuk dijual serta-merta ke dalam baris gilir, kerana operasi pop adalah atom, walaupun ramai pengguna tiba pada masa yang sama, mereka akan dilaksanakan secara berurutan, kunci fail Prestasi urus niaga dan urus niaga merosot dengan cepat di bawah konkurensi yang tinggi Sudah tentu, aspek lain mesti dipertimbangkan, seperti membuat halaman snap-up statik dan memanggil antara muka melalui Ajax juga mungkin berlaku di mana pengguna terkunci beberapa kali Pada masa ini, perlu ditambah baris gilir, baris gilir keputusan dan baris gilir inventori.

Di bawah keadaan serentak yang tinggi, masukkan pengguna ke dalam baris gilir, gunakan gelung benang untuk mengalih keluar pengguna daripada baris gilir dan tentukan sama ada pengguna sudah berada dalam baris gilir hasil pembelian tergesa-gesa. ia telah diambil, jika tidak ia tidak diambil, dan inventori Kurangkan ia sebanyak 1, tulis ke pangkalan data, dan letakkan pengguna ke dalam baris gilir hasil.

28 Bagaimana untuk mengendalikan beban dan konkurensi tinggi?

Jawapan: Dari perspektif kos rendah, prestasi tinggi dan berskala tinggi, terdapat penyelesaian berikut:

1 statik HTML

Malah, semua orang tahu bahawa yang paling cekap dan paling kurang digunakan adalah halaman html statik semata-mata, jadi kami cuba sedaya upaya untuk menggunakan halaman statik untuk halaman di laman web kami ini sebenarnya kaedah yang paling berkesan.

2. Asingkan pelayan imej

Simpan imej secara berasingan untuk meminimumkan kos trafik yang besar seperti imej Anda boleh meletakkannya pada beberapa platform yang berkaitan, seperti menunggang lembu , dsb.

3. Pencincangan dan caching kluster pangkalan data dan jadual pangkalan data

Sambungan serentak pangkalan data adalah 100. Satu pangkalan data tidak mencukupi dipisahkan daripada membaca dan menulis Mari kita mulakan dengan replikasi dan pengelompokan pangkalan data. Selain itu, untuk meminimumkan capaian pangkalan data, anda boleh menggunakan pangkalan data cache seperti memcache dan redis.

4. Mencerminkan:

Kurangkan muat turun sebanyak mungkin dan edarkan permintaan yang berbeza kepada berbilang cermin.

5 Pengimbangan beban:

Sambungan serentak maksimum Apache ialah 1500. Anda hanya boleh menambah pelayan, seperti pelayan F5. Sudah tentu, kos perkakasan agak tinggi, jadi kami sering bermula dari sisi perisian.

Pengimbangan Beban dibina pada struktur rangkaian sedia ada Ia menyediakan kaedah yang murah, berkesan dan telus untuk mengembangkan lebar jalur peranti dan pelayan rangkaian, meningkatkan daya pemprosesan, dan meningkatkan keupayaan pemprosesan data rangkaian ketersediaan. Pada masa ini, perisian pengimbangan beban yang paling banyak digunakan ialah Nginx, LVS, dan HAProxy.

Mari kita bincangkan tentang kelebihan dan kekurangan ketiga-tiga jenis masing-masing:

Kelebihan Nginx ialah:

Mengusahakan lapisan ke-7 rangkaian, anda boleh membuat beberapa strategi pengalihan untuk aplikasi http, seperti nama domain dan struktur direktori Peraturan tetapnya lebih berkuasa dan fleksibel daripada HAProxy, yang merupakan salah satu sebab utama mengapa ia popular secara meluas pada masa ini, Nginx boleh digunakan dalam lebih banyak situasi daripada LVS berdasarkan ini sahaja.

Nginx bergantung sangat sedikit pada kestabilan rangkaian Secara teorinya, ia boleh melakukan fungsi beban selagi ia boleh diping. Ini juga merupakan salah satu kelebihannya, sebaliknya, LVS sangat bergantung pada kestabilan rangkaian menyedari;

Nginx agak mudah untuk dipasang dan dikonfigurasikan, dan ia pada asasnya boleh mencetak ralat dalam log. Konfigurasi dan ujian LVS mengambil masa yang agak lama, dan LVS sangat bergantung pada rangkaian.

Ia boleh menahan tekanan beban yang tinggi dan stabil Jika perkakasan tidak buruk, ia secara amnya boleh menyokong berpuluh-puluh ribu konkurensi, dan tahap beban secara relatifnya lebih kecil daripada LVS.

Nginx boleh mengesan kegagalan pelayan dalaman melalui port, seperti kod status, tamat masa, dsb. yang dikembalikan oleh halaman web pemprosesan pelayan, dan akan menyerahkan semula permintaan yang mengembalikan ralat ke nod lain ia tidak Menyokong url untuk mengesan. Contohnya, jika pengguna memuat naik fail, dan nod memproses muat naik gagal semasa proses muat naik, Nginx akan menukar muat naik ke pelayan lain untuk diproses semula, dan LVS akan diputuskan terus jika fail besar dimuat naik, Atau sangat fail penting, pengguna mungkin tidak berpuas hati.

Nginx bukan sahaja pengimbang beban/perisian proksi terbalik yang sangat baik, ia juga merupakan pelayan aplikasi web yang berkuasa. LNMP juga merupakan seni bina web yang sangat popular sejak beberapa tahun kebelakangan ini, dan kestabilannya juga sangat baik dalam persekitaran trafik tinggi.

Nginx kini menjadi semakin matang sebagai cache pecutan terbalik Web dan lebih pantas daripada pelayan Squid tradisional Anda boleh mempertimbangkan untuk menggunakannya sebagai pemecut proksi terbalik.

Nginx boleh digunakan sebagai proksi terbalik peringkat pertengahan Pada tahap ini, Nginx pada asasnya tidak mempunyai saingan Nginx, dan konfigurasinya tidak begitu baik Ia jelas dan mudah dibaca, dan maklumat komuniti jauh kurang aktif daripada Nginx.

Nginx juga boleh digunakan sebagai halaman web statik dan pelayan imej, dan prestasinya di kawasan ini tidak dapat ditandingi. Komuniti Nginx juga sangat aktif dan terdapat banyak modul pihak ketiga.

Kelemahan Nginx ialah:

Nginx hanya boleh menyokong protokol http, https dan E-mel, jadi skop aplikasinya lebih kecil. Ini adalah kelemahannya.

Pemeriksaan kesihatan pelayan bahagian belakang hanya menyokong pengesanan melalui port dan tidak menyokong pengesanan melalui URL. Pengekalan langsung Sesi tidak disokong, tetapi ia boleh diselesaikan melalui ip_hash.

LVS: Gunakan kluster kernel Linux untuk melaksanakan pelayan pengimbangan beban berprestasi tinggi, ketersediaan tinggi, yang mempunyai kebolehskalaan (Skalabiliti), kebolehpercayaan (Kebolehpercayaan) dan kebolehurusan (Kebolehurusan) yang baik.

Kelebihan LVS ialah:

Rintangan beban yang kuat, ia berfungsi di atas lapisan ke-4 rangkaian sahaja untuk pengedaran, dan tiada trafik dijana juga Ini menentukan prestasi terkuatnya di kalangan perisian pengimbangan beban dan penggunaan memori dan sumber CPU yang agak rendah.

Kebolehkonfigurasiannya agak rendah, yang merupakan kelemahan dan kelebihan Kerana tiada apa-apa yang boleh dikonfigurasikan terlalu banyak, ia tidak memerlukan terlalu banyak sentuhan, yang sangat mengurangkan kemungkinan kesilapan manusia.

Ia berfungsi dengan stabil kerana ia mempunyai rintangan beban yang kuat dan mempunyai penyelesaian sandaran panas dwi-mesin yang lengkap, seperti LVS Keepalived Namun, yang paling kami gunakan dalam pelaksanaan projek ialah LVS/DR Keepalived.

Tiada trafik, LVS hanya mengedarkan permintaan dan trafik tidak terputus dengan sendirinya. Ini memastikan prestasi IO pengimbang tidak akan terjejas oleh trafik yang besar.

Julat aplikasi agak luas Kerana LVS berfungsi pada lapisan 4, ia boleh memuatkan baki hampir semua aplikasi, termasuk http, pangkalan data, bilik sembang dalam talian, dll.

Kelemahan LVS ialah:

Perisian itu sendiri tidak menyokong pemprosesan ungkapan biasa dan tidak boleh memisahkan dinamik dan statik dan banyak tapak web kini mempunyai keperluan yang kuat dalam hal ini , inilah kelebihan Nginx/HAProxy Keepalived.

Jika aplikasi laman web agak besar, LVS/DR Keepalived akan menjadi lebih rumit untuk dilaksanakan Lebih-lebih lagi jika terdapat mesin Windows Server di belakangnya, proses pelaksanaan, konfigurasi dan penyelenggaraan akan menjadi lebih rumit , Nginx/HAProxy Keepalived adalah lebih mudah.

Ciri-ciri HAProxy ialah:

HAProxy juga menyokong hos maya.

Kelebihan HAProxy boleh menambah beberapa kelemahan Nginx, seperti menyokong pengekalan Sesi dan panduan Kuki; ia juga menyokong pengesanan status pelayan bahagian belakang dengan mendapatkan URL yang ditentukan.

HAProxy adalah serupa dengan LVS, ia hanyalah perisian pengimbangan beban semata-mata dari segi kecekapan, HAProxy akan mempunyai kelajuan pengimbangan beban yang lebih baik daripada Nginx, dan ia juga lebih baik daripada Nginx dalam pemprosesan serentak.

HAProxy menyokong pemajuan pengimbangan beban protokol TCP Ia boleh memuatkan baki bacaan MySQL dan mengesan serta memuatkan baki nod MySQL bahagian belakang Anda boleh menggunakan LVS Keepalived untuk memuatkan baki induk dan hamba MySQL.

Terdapat banyak strategi pengimbangan beban HAProxy kini termasuk 8 jenis berikut:

① roundrobin, yang bermaksud undian mudah pengimbangan beban. Semua tersedia; , adalah disyorkan untuk memberi perhatian;

④ sumber, Menunjukkan berdasarkan permintaan sumber IP Ini adalah serupa dengan mekanisme IP_hash Nginx Kami menggunakannya sebagai kaedah untuk menyelesaikan masalah sesi ;

⑤ ri, mewakili URI yang diminta;

⑥ rl_param, mewakili parameter URL yang diminta 'url_param' memerlukan nama parameter URL

⑦ hdr(nama), mewakili Kunci setiap satu Permintaan HTTP berdasarkan pengepala permintaan HTTP;

⑧ rdp-cookie(name) bermaksud mengunci dan mencincang setiap permintaan TCP berdasarkan kuki(nama).

Ringkasan perbandingan antara Nginx dan LVS:

Nginx berfungsi pada lapisan 7 rangkaian, jadi ia boleh melaksanakan strategi lencongan untuk aplikasi http sendiri, seperti domain nama dan direktori, dsb. Sebagai perbandingan, LVS tidak mempunyai fungsi sedemikian, jadi Nginx boleh digunakan dalam lebih banyak situasi daripada LVS berdasarkan ini sahaja tetapi fungsi berguna Nginx ini menjadikannya lebih boleh dilaraskan daripada LVS, jadi ia selalunya Anda perlu menyentuh, menyentuh, menyentuh Jika terlalu banyak menyentuh, kemungkinan masalah manusia akan meningkat.

Nginx kurang bergantung pada kestabilan rangkaian Secara teori, selagi ping berjaya dan akses halaman web adalah normal, Nginx boleh menyambung. Nginx juga boleh membezakan antara rangkaian dalaman dan luaran Jika ia adalah nod dengan kedua-dua rangkaian dalaman dan luaran, ia adalah bersamaan dengan satu mesin yang mempunyai talian sandaran lebih bergantung pada persekitaran rangkaian segmen rangkaian yang sama dan LVS menggunakan mod langsung untuk memunggah Kesannya lebih terjamin.

Juga ambil perhatian bahawa LVS perlu memohon sekurang-kurangnya satu lagi IP daripada penyedia pengehosan untuk digunakan sebagai IP Visual Nampaknya ia tidak boleh menggunakan IPnya sendiri sebagai VIP. Untuk menjadi pentadbir LVS yang baik, anda benar-benar perlu membuat susulan dan mempelajari banyak pengetahuan tentang komunikasi rangkaian, yang tidak lagi semudah HTTP.

Nginx agak mudah untuk dipasang dan dikonfigurasikan, dan ia juga sangat mudah untuk diuji, kerana ia pada asasnya boleh mencetak ralat dalam log. Pemasangan, konfigurasi dan ujian LVS mengambil masa yang agak lama; LVS sangat bergantung pada rangkaian lebih menyusahkan untuk diselesaikan.

Nginx juga boleh menahan beban yang tinggi dan stabil, tetapi beban dan kestabilan lebih teruk daripada LVS Terdapat beberapa tahap: Nginx mengendalikan semua lalu lintas, jadi ia dihadkan oleh IO mesin dan konfigurasinya sendiri masih sukar untuk diselesaikan Dielakkan.

Nginx boleh mengesan kegagalan pelayan dalaman, seperti kod status, tamat masa, dsb. yang dikembalikan oleh halaman web pemprosesan pelayan dan akan menyerahkan semula permintaan yang mengembalikan ralat ke nod lain. Pada masa ini, ldirectd dalam LVS juga boleh menyokong pemantauan keadaan dalaman pelayan, tetapi prinsip LVS menghalangnya daripada menghantar semula permintaan. Contohnya, jika pengguna memuat naik fail, dan nod memproses muat naik gagal semasa proses muat naik, Nginx akan menukar muat naik ke pelayan lain untuk diproses semula, dan LVS akan diputuskan terus jika fail besar dimuat naik, Atau sangat fail penting, pengguna mungkin terganggu dengan ini.

Pemprosesan permintaan tak segerak Nginx boleh membantu pelayan nod mengurangkan beban Jika apache digunakan untuk melayan pihak luar secara langsung, maka apabila terdapat banyak pautan jalur sempit, pelayan apache akan menduduki sejumlah besar memori dan tidak boleh. akan dikeluarkan. Gunakan satu lagi Nginx sebagai apache Jika anda menggunakan proksi, pautan jalur sempit ini akan disekat oleh Nginx, dan terlalu banyak permintaan tidak akan terkumpul pada Apache, sekali gus mengurangkan jumlah penggunaan sumber yang banyak. Menggunakan Squid mempunyai kesan yang sama dalam hal ini Walaupun Squid sendiri dikonfigurasikan untuk tidak cache, ia masih sangat membantu Apache.

Nginx boleh menyokong http, https dan e-mel (fungsi e-mel kurang biasa digunakan), dan LVS menyokong lebih banyak aplikasi daripada Nginx dalam hal ini. Dari segi penggunaan, secara amnya strategi yang diguna pakai oleh bahagian hadapan hendaklah LVS, iaitu arah DNS haruslah penyama LVS Kelebihan LVS menjadikannya sangat sesuai untuk tugas ini.

Alamat IP penting diuruskan dengan terbaik oleh LVS, seperti IP pangkalan data, IP pelayan perkhidmatan web, dsb. Semakin lama, alamat IP ini akan semakin digunakan secara meluas Jika anda menukar alamat IP, ia akan berlaku kerosakan. Oleh itu, adalah paling selamat untuk menyerahkan IP penting ini kepada LVS untuk pengehosan Satu-satunya kelemahan berbuat demikian ialah bilangan VIP yang diperlukan akan lebih besar.

Nginx boleh digunakan sebagai mesin nod LVS Pertama, ia boleh memanfaatkan fungsi Nginx Kedua, ia boleh memanfaatkan prestasi Nginx. Sudah tentu, anda juga boleh menggunakan Squid secara langsung pada tahap ini. Fungsi Squid jauh lebih lemah daripada Nginx, dan prestasinya juga lebih rendah daripada Nginx.

Nginx juga boleh digunakan sebagai proksi peringkat pertengahan Pada tahap ini, pada asasnya Nginx tidak mempunyai saingan daripada Nginx, dan konfigurasinya tidak begitu jelas dan mudah dibaca. Di samping itu, IP ejen peringkat pertengahan juga penting, jadi ia adalah penyelesaian yang paling sempurna untuk ejen peringkat pertengahan juga mempunyai VIP dan LVS.

Aplikasi khusus perlu dianalisis secara terperinci Jika ia adalah laman web yang agak kecil (PV harian kurang daripada 10 juta), anda boleh menggunakan Nginx jika terdapat banyak mesin Tinjauan DNS. LVS menggunakan Masih terdapat banyak mesin untuk laman web yang besar atau perkhidmatan penting, apabila mesin tidak bimbang, anda harus mempertimbangkan untuk menggunakan LVS.

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci [Hematemesis] 28 soalan temu bual tentang teknologi teras PHP untuk membantu anda menukar pekerjaan!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:公众号-PHP面试题. Jika ada pelanggaran, sila hubungi admin@php.cn Padam