Rumah > Artikel > pembangunan bahagian belakang > Ringkaskan dan susun 39 soalan temuduga PHP (perkongsian ringkasan)
Artikel ini membawakan anda pengetahuan yang berkaitan tentang PHP Ia terutamanya memperkenalkan soalan temuduga PHP dan meringkaskan tiga puluh sembilan soalan biasa soalan temu bual, tetapi semuanya tidak dapat dipisahkan daripada soalan temuduga PHP asas dan biasa saya harap ia akan membantu semua orang.
Pembelajaran yang disyorkan: "Tutorial PHP"
Inti soalan ini ialah penyelesaian nama domain. dan pelayan (nginx) menghuraikan kedua-dua bahagian ini Pada asasnya, kedua-dua bahagian ini boleh dijelaskan secara terperinci.
Langkah 1. Menghuraikan URL
Pelayar akan menghuraikan data URL semasa untuk menentukan sama ada URL itu adalah pautan yang sah. Jika ia adalah pautan yang sah, teruskan ke langkah seterusnya seperti biasa. Jika ia bukan pautan sah, fungsi carian akan dilaksanakan, seperti Baidu, 360, carian Google, dsb.
Langkah 2, selesaikan nama domain
Pelayan wujud dalam bentuk IP. Nama domain perlu diselesaikan kepada IP. Terdapat tiga langkah kecil untuk menyelesaikan IP:
1). cache komputer Selesaikan nama domain dalam fail HOST
3), selesaikan nama domain melalui pelayan DNS
Langkah 3, dapatkan maklumat
Dalam langkah ini kami dapat maklumat URL, terutamanya maklumat IP dan port.
Langkah 4. Paket dan lakukan jabat tangan tiga hala
Pelayar membungkus maklumat permintaan dan menghantar data ke pelayan melalui jabat tangan tiga hala TCP.
Langkah 5: Pelayan menghuraikan, memproses dan mengembalikan data
Pelayan mendapatkan data yang dihantar melalui pelbagai peringkat dan kaedah, menganalisis dan memproses data, dan akhirnya mengembalikan data jenis MIME respons. Kod status biasa ialah 200 dan kod ralat tidak normal termasuk 404, 500, 501, dsb.
Langkah 6. Penyemak imbas memperoleh, memaparkan dan memaparkan data
Pelayar memperoleh data daripada pelayan Paparkan halaman kepada pengguna dengan memuatkan sumber, memaparkan halaman dan operasi lain.
2. Apakah perbezaan antara SESI dan COOKIE Sila terangkan sebab dan fungsi protokol?2), SESSION disimpan di bahagian pelayan, dan COOKIE disimpan di bahagian klien. Sesi agak selamat. Kuki boleh diubah suai dengan cara tertentu dan tidak selamat. Sesi bergantung pada kuki untuk penghantaran.
Selepas melumpuhkan kuki, sesi tidak boleh digunakan seperti biasa. Kelemahan Sesi: Ia disimpan pada bahagian pelayan, dan setiap bacaan dibaca daripada pelayan, yang menggunakan sumber pada pelayan. Sesi disimpan dalam fail atau pangkalan data pada bahagian pelayan Ia disimpan dalam fail secara lalai Laluan fail ditentukan oleh session.save_path dalam fail konfigurasi PHP. Fail sesi adalah awam.
3. Apakah maksud 302, 403 dan 500 kod dalam status HTTP?302: Pemindahan sementara berjaya , kandungan yang diminta telah dialihkan ke lokasi baharu 403: Access Forbidden 500: Ralat Dalaman Pelayan 401 mewakili tanpa kebenaran.
4. Perintah untuk mencipta pakej termampat dan nyahmampat pakej di bawah LinuxPembungkusan: tar czf file.tar. gz file.txt
Ekstrak: tar xzf file.tar.gz
Bz2:
Pakej: bzip2 [-k] Fail
Ekstrak: bunzip2 [ -k] Fail
Gzip (hanya untuk fail, tidak mengekalkan fail asal)
Pakej: gzip file1.txt
Nyahmampat: gunzip file1.txt.gz
Zip: -r Pek direktori
: zip file1.zip file1.txt
Ekstrak: unzip file1.zip
Int Integer char Aksara panjang tetap Varchar Aksara panjang boleh ubah Datetime Datetime type Teks Jenis teks Perbezaan antara Varchar dan char char ialah jenis aksara panjang tetap Berapa banyak ruang yang diperuntukkan banyak ruang. Varchar ialah jenis aksara panjang boleh ubah Ia mengambil ruang sebanyak kandungannya, yang boleh menjimatkan ruang dengan berkesan. Oleh kerana jenis varchar adalah berubah-ubah, pelayan perlu melakukan operasi tambahan apabila panjang data berubah, jadi kecekapan adalah lebih rendah daripada jenis char.
Jenis MyISAM tidak menyokong transaksi, kunci meja dan terdedah kepada pemecahan Ia perlu dioptimumkan dengan kerap dan mempunyai kelajuan membaca dan menulis yang lebih pantas, manakala jenis InnoDB menyokong transaksi, kunci baris, dan mempunyai keupayaan pemulihan ranap. Kelajuan membaca dan menulis lebih perlahan daripada MyISAM.
Buat indeks: nama jadual amaran tambah indeks (`nama medan`)
Pemahaman: Apabila session_start() dihidupkan, SID malar dijana Apabila COOKIE dihidupkan, pemalar ini kosong Apabila COOKIE dimatikan, nilai PHPSESSID disimpan dalam pemalar ini. Dengan menambahkan parameter SID selepas URL untuk menghantar nilai SESSIONID, halaman klien boleh menggunakan nilai dalam SESSION. Apabila pelanggan membuka COOKIE dan pelayan membuka SESI. Apabila penyemak imbas membuat permintaan pertama, pelayan akan menghantar COOKIE ke penyemak imbas untuk menyimpan SESSIONID Apabila penyemak imbas membuat permintaan kedua,
Isset menentukan sama ada pembolehubah itu wujud Anda boleh lulus dalam berbilang pembolehubah jika tidak wujud, ia mengembalikan kosong menentukan sama ada pembolehubah itu kosong boleh lulus Jika Mengembalikan benar jika kosong atau palsu.
Jawapan: Terdapat dua cara utama:
1) Kegigihan syot kilat
telah didayakan secara automatik dalam fail konfigurasi redis,
format ialah: save N M
bermakna jika redis diubah suai sekurang-kurangnya M kali dalam N saat, redis akan mengambil gambar ke cakera.
Sudah tentu kita juga boleh melaksanakan perintah save atau bgsave (asynchronous) secara manual untuk membuat syot kilat
2) tambahkan hanya fail AOF persistence
Terdapat tiga mod kesemuanya , seperti
appendfsync Lalai everysec adalah untuk memaksa menulis pada cakera sekali sesaat
appendfsync sentiasa Paksa menulis pada cakera setiap kali operasi tulis dilakukan
appendfsync tidak bergantung sepenuhnya pada OS dan prestasi Yang terbaik tetapi kegigihan tidak dapat dijamin
Mod ketiga adalah yang terbaik. Redis juga menggunakan mod ketiga secara lalai.
Jawapan: Terdapat dua yang biasa digunakan, satu innodb dan satu lagi myisam Perbezaan utama antara keduanya ialah
1) myisam tidak menyokong pemprosesan transaksi, tetapi innoDB menyokong pemprosesan transaksi
2) myisam tidak menyokong kunci asing, innoDB menyokong kunci asing
3) myisam menyokong penuh- carian teks, dan innoDB hanya menyokong carian teks penuh selepas MySQL versi 5.6
4) Bentuk storan data adalah berbeza Jadual mysiam disimpan dalam tiga fail: storan struktur, indeks dan data struktur sebagai fail dan indeks Dan data disimpan sebagai fail
5) myisam mempunyai prestasi yang lebih baik daripada innoDB dalam membuat pertanyaan dan menambah data, dan innoDB mempunyai prestasi yang lebih tinggi dalam pemadaman kelompok.
6) Myisam menyokong kunci meja, manakala innoDB menyokong kunci baris
Jawapan: Serangan suntikan SQL merujuk kepada pengguna atau penggodam yang membina input khas sebagai parameter dan menghantarnya ke dalam aplikasi web kami operasi yang diingini oleh penyerang Sebab utamanya ialah pengaturcara tidak menapis data yang dimasukkan oleh pengguna dengan berhati-hati, menyebabkan data haram menyerang sistem. Oleh itu, kita mesti menghalang suntikan SQL semasa proses pembangunan, terutamanya dari dua aspek:
1) Kaedah pemegang tempat adalah untuk mempraproses pernyataan SQL dan kemudian melaksanakan pernyataan SQL
2) Gunakan dua fungsi addslashes atau mysql_real_escape_string untuk melepaskan nilai yang dimasukkan oleh pengguna dan melepaskan beberapa aksara khas.
Jawapan: Saya telah menggunakannya sebelum ini Dalam kelas PDO, terdapat kaedah penyediaan yang boleh melaksanakan prapemprosesan dalam kelas PDOStament boleh melakukan prapemprosesan . Satu ialah :Pemegang tempat rentetan, yang lain ialah ? pemegang tempat rentetan pas dalam tatasusunan bersekutu apabila melakukan parameter prapemprosesan dan hantaran, manakala ? Kedua-duanya tidak boleh dicampur, tetapi biasanya disyorkan untuk menggunakan: pemegang tempat rentetan.
Jawapan: Secara umumnya, rangka kerja sumber terbuka yang matang mengambil kira keselamatan data, tetapi kadangkala kami Apabila beberapa penyataan SQL asli boleh digunakan, kita perlu mempertimbangkan untuk memproses kenyataan SQL sendiri. Sudah tentu, kadang-kadang kita tidak mahu menggunakan kaedah penapisan dalam rangka kerja Contohnya, apabila menggunakan editor teks, kita boleh menggunakan kaedah penapisan kita sendiri.
Jawapan: Pengoptimuman MySQL terutamanya dicapai daripada aspek berikut:
1) Perspektif reka bentuk: pemilihan enjin storan, pemilihan jenis medan, paradigma
2 ) Perspektif fungsional: Anda boleh menggunakan ciri MySQL sendiri, seperti pengindeksan, caching pertanyaan, defragmentasi, pembahagian, sub-jadual, dll.
3) Pengoptimuman pernyataan SQL: Cuba permudahkan pernyataan pertanyaan dan gunakan sebagai sedikit medan pertanyaan yang mungkin Kurangkan medan pertanyaan, optimumkan pernyataan paging, pernyataan kumpulan, dsb.
4) Gunakan sistem seni bina beban yang besar: pelayan pangkalan data dipisahkan Apabila bebanan berat, mekanisme pemisahan master-slave dan baca-tulis boleh digunakan untuk reka bentuk
5) Naik taraf pelayan pangkalan data daripada perkakasan.
Pas melalui nilai: Sebarang perubahan kepada nilai dalam skop fungsi akan diabaikan di luar fungsi
Pas melalui rujukan: Sebarang perubahan kepada nilai dalam skop fungsi juga akan diabaikan di luar fungsi Mencerminkan pengubahsuaian ini
Kebaikan dan Keburukan: Apabila melalui nilai, PHP mesti menyalin nilai. Terutama untuk rentetan dan objek yang besar, ini boleh menjadi operasi yang mahal. Melewati rujukan tidak memerlukan penyalinan nilai, yang bagus untuk meningkatkan prestasi.
Tetapkan tahap ralat PHP dan kembalikan tahap semasa.
//快速排序(数组排序) function QuickSort($arr){ $num = count($arr); $l=$r=0; for($i=1;$i<$num;$i++){ if($arr[$i] < $arr[0]){ $left[] = $arr[$i]; $l++; }else{ $right[] = $arr[$i]; $r++; } } if($l > 1){ $left = QuickSort($left); } $new_arr = $left; $new_arr[] = $arr[0]; if($r > 1){ $right = QuickSort($right); } for($i=0;$i<$r;$i++){ $new_arr[] = $right[$i]; } return $new_arr; }
//二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ($low <= $high){ $mid = intval(($low+$high)/2); if ($array[$mid] == $k){ return $mid; }elseif ($k < $array[$mid]){ return bin_sch($array, $low, $mid-1, $k); }else{ return bin_sch($array, $mid+1, $high, $k); } } return -1; } //顺序查找(数组里查找某个元素) function seq_sch($array, $n, $k){ $array[$n] = $k; for($i=0; $i<$n; $i++){ if($array[$i]==$k){ break; } } if ($i<$n){ return $i; }else{ return -1; } }
//二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0是降序 function array_sort($arr, $keys, $order=0) { if (!is_array($arr)) { return false; } $keysvalue = array(); foreach($arr as $key => $val) { $keysvalue[$key] = $val[$keys]; } if($order == 0){ asort($keysvalue); }else { arsort($keysvalue); } reset($keysvalue); foreach($keysvalue as $key => $vals) { $keysort[$key] = $key; } $new_array = array(); foreach($keysort as $key => $val) { $new_array[$key] = $arr[$val]; } return $new_array; }21 mod Singleton, buat objek tunggal yang dipautkan ke pangkalan data mysqli
class regx { public static function check($str) { if(preg_match("/^([1-9,])+$/",$str)) { return true; } return false; } } $str="12345,6"; if(regx::check($str)) { echo "suc"; } else { echo "fail"; }22. Di manakah sambungan sesi PHP menyimpan data sesi secara lalai D
class Db { private static $instance; public $handle; Private function __construct($host,$username,$password,$dbname) { $this->handle=NULL; $this->getcon($host,$username,$password,$dbname); } public static function getBb() { self::$instance=new Db(); return self::$instance; } private function getcon($host,$username,$password,$dbname) { if($this->handle!=NULL){ return true; } $this->handle=mysqli_connect($host,$username,$password,$dbname); } }B) Pangkalan Data MySQL
D) Sistem Fail
E) Pelayan Sesi23 fungsi strtolower() dan strtoupper() PHP boleh menyebabkan aksara Cina ditukar menjadi. aksara bercelaru apabila memasang pelayan dengan sistem bukan Cina, sila tulis Dua fungsi alternatif melaksanakan penukaran huruf rentetan yang serasi dengan teks Unikod
Jawapan: Sebabnya ialah: Bahasa Cina terdiri daripada berbilang bait, manakala hanya satu aksara Inggeris dalam sistem Inggeris mempunyai hanya satu bait , jadi sistem menjalankan pemprosesan strtolower() pada setiap bait bahasa Cina, dan bait Cina yang diubah menjadi bercelaru apabila disambung bersama (aksara yang sepadan dengan peta pengekodan yang baru dihasilkan mungkin bukan bahasa Cina)Penyelesaian manual: Gunakan str_split(rentetan rentetan, rentetan masuk, panjang_intsplit = 1) untuk memotong mengikut setiap bait, seperti bahasa Cina, yang boleh dipotong kepada tiga bait. Jika bait yang diiktiraf adalah huruf Inggeris, ia akan ditukar.
Jawapan: Terdapat dua aspek pepijat,
1) Dalam penghentian, apabila fail hanya mempunyai atribut baca sahaja, fungsi is_writeable() mengembalikan palsu Apabila benar dikembalikan, fail itu tidak semestinya boleh ditulis.<?php function mystrtoupper($a){ $b = str_split($a, 1); $r = ''; foreach($b as $v){ $v = ord($v); if($v >= 97 && $v<= 122){ $v -= 32; } $r .= chr($v); } return $r; } $a = 'a中你继续F@#$%^&*(BMDJFDoalsdkfjasl'; echo 'origin string:'.$a."\n"; echo 'result string:'; $r = mystrtoupper($a); var_dump($r);Jika ia adalah direktori, buat fail baharu dalam direktori dan semak dengan membuka fail
/** * 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; } }
答:用getimagesize来判断上传图片的类型比$_FILES函数的type更可靠
同一个文件,使用不同的浏览器php返回的type类型是不一样的,由浏览器提供type类型的话,
就有可能被黑客利用向服务器提交一个伪装撑图片后缀的可执行文件。
可以通过getimagesize()函数来判断上传的文件类型,如果是头像文件 会返回这样的一个数组
Array ( [0] => 331 [1] => 234 [2] => 3 [3] => width="331" height="234" [bits] => 8 [mime] => image/png );
答:基本原则:不对外界展示服务器或程序设计细节(屏蔽错误),不相信任何用户提交的数据(过滤用户提交)
1)屏蔽错误,将display_errors 设置为off
2)过滤用户提交参数,这里需要注意的是不能仅仅通过浏览器端的验证,还需要经过服务器端的过滤
这里是需要注意最多的地方,因为所有用户提交的数据入口都在这里,这是过滤数据的第一步。 1 考虑是否过滤select,insert,update,delete,drop,create等直接操作数据的命令语句 2 使用addslashes 将所有特殊字符过滤 3 打开magic_quotes_gpc,开启该参数数后自动将sql语句转换,将 ' 转换成 \'
3)可以考虑设置统一入口,只允许用户通过指定的入口访问,不能访问未经许可的文件等内容
4)可以考虑对安全性要求高的文件进行来源验证,比如要想执行b.php必须先执行a.php,可以在b.php中判断来自a.php的referer,避免用户直接执行b.php
答:由于 –enable-cli 和 –enable-cgi 同时默认有效,因此,不必再配置行中加上 –enable-cli 来使得 CLI 在 make install 过程中被拷贝到 {PREFIX}/bin/php
php -f “index.php” php -r “print_r(get_defined_constants());”
说明:
1)如果,你熟悉PHP源码,那么请从源码入手,回答些问题,会获得额外加分
2)如果,你不熟悉PHP源码,那么尽你所能,多写点东西,包括利用自己的编程直觉得到的信息,都可以。
3)对,则有分,错误不扣,不写无分。
答:PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(referencecounting)这种单纯的垃圾回收(garbagecollection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。
1. get是从服务器上获取数据,post是向服务器传送数据。 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。 3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。 4. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
一:在php.ini中设置session.gc_maxlifetime = 1440 //默认时间 二:代码实现 $ lifeTime = 24 * 3600; //保存一天 session_set_cookie_params($ lifeTime); 在session_start();
他问的是已经支付成功后,但是回调失败了。
自己可以创建定时任务在每天的凌晨执行,去微信那边对账,然后更新数据库订单状态。
来自PHP技术交流群 群友分享
看看你的服务的访问日志,在防火墙中加过滤,或者在web服务器中加过滤吧。方法有以下几种。
是消耗服务器资源为主还是纯流量攻击?消耗资源的可以通过配置防火墙过滤规则防御中小规模的攻击。如果是纯流量攻击,考虑你用的是linode真心无解。即便你封了IP封了端口也没用,人家不管你接不接受他的请求,他都会塞满你的带宽。linode必然认为你是被流量攻击或者消耗过多资源然后给你挂起。
Groupadd mysql 添加一个用户组mysql Useradd -g mysql mysql 添加一个mysql用户指定分组为mysql Cd /lamp/mysql 进入mysql目录 ./configure –prefix=/usr/local/mysql/ –with-extra-charsets=all Make Make all
优化程序,优化数据库,如果程序和数据库已经最优化,使用以下解决方法:
1)索引的目的是什么?
2) 索引对数据库系统的负面影响是什么?
负面影响:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。
3) 为数据表建立索引的原则有哪些?
4) 什么情况下不宜建立索引?
单引号不能解释变量,而双引号可以解释变量。
单引号不能转义字符,在双引号中可以转义字符。
方法一: <?php class Dtime{ function get_days($date1, $date2){ $time1 = strtotime($date1); $time2 = strtotime($date2); return ($time2-$time1)/86400; } } $Dtime = new Dtime; echo $Dtime->get_days(’2021-2-5′, ’2021-3-6′); ?> 方法二: <?php $temp = explode(‘-’, ’2021-2-5′); $time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]); $temp = explode(‘-’, ’2021-3-6′); $time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]); echo ($time2-$time1)/86400; 方法三:echo abs(strtotime(“2021-2-5″)-strtotime(“2021-3-1″))/60/60/24 计算时间差
<?php function BubbleSort(&$arr){ $cnt=count($arr); $flag=1; for($i=0;$i<$cnt;$i++){ if($flag==0){ return; } $flag=0; for($j=0;$j<$cnt-$i-1;$j++){ if($arr[$j]>$arr[$j+1]){ $tmp=$arr[$j]; $arr[$j]=$arr[$j+1]; $arr[$j+1]=$tmp; $flag=1; } } } } $test=array(1,3,6,8,2,7); BubbleSort($test); var_dump($test);
推荐学习:《PHP视频教程》
Atas ialah kandungan terperinci Ringkaskan dan susun 39 soalan temuduga PHP (perkongsian ringkasan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!