騰訊面試題 文字版

  1. 請說明在php.ini中safe_mode開啓之後對於pHp系統函數的影響
    簡單版的回答
    開啓之後,主要會對系統操作、文件、權限設置等方法產生影響,平常項目基本上也用不到這些方法。主要我想還是用來應對webshell吧,減少被人植入webshell所帶來的某些安全問題。
    詳細解釋
    safe_mode是提供一個基本安全的共享環境。在一個多用戶共享的php web服務器上,當這臺服務器開啓了safe_mode模式,有以下函數將會受到影響。首先,一下嘗試訪問文件系統的函數將會被限制,運行服務器的用戶id,如果想要嘗試操作某個文件,必須要用戶該文件的讀取或者寫入的訪問權限
    因此,在safe_mode打開的情況下,下列函數將會收到限制:
    ckdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,highlight_file,show_source,include,symlink,link,touch,mkdir,unlink
    以上都是跟操作文件系統有關的函數,除此之外,一些php擴展的函數也會受到限制,不能在程序裏面直接加載擴展,只能到php.ini里加載,而且php如果需要執行操作系統的程序時,必須在safe_mode_exec_dir中指定程序的路徑,否則執行將失敗。此外還有exec,shell_exec,pasathru,system,popen等函數會收到限制

  2. pHp5中魔術方法函數有哪幾個,請舉例說明各自的用法
    魔術方法:
    __construct() :實例化對象時被調用;
    __destuct():當刪除一個對象或者對象操作終止是被執行;
    __call():調用對象不存在方法時被調用;
    __get():調用對象不存在的屬性時被調用;
    __set():設置對象不存在的屬性時被調用;
    __toString():打印一個對象時被調用,比如echo $obj,print($obj);
    __clone():克隆對象時被調用,比如$t = new Test();$tt = clone $t;__sleep():serialize之前被調用,若對象比較大,想做一些刪除在序列化,可以考慮使用該方法;
    __wakeup():unserialize之前被調用,做些對象的初始化;
    __isset():檢測對象是否存在屬性的時候被調用,如 isset($c->name);
    __unset():unset一個對象屬性時被調用,如:unset($c->name);
    __set_state():調用var_export時被調用,用__set_state的返回值作爲 var_export的返回值;
    __autoload() : 實例化一個對象時,如果對應的類不存在,在該方法被調用。
    魔術常量:
    __LINE__:返回當前行號;
    __FILE__:返回文件的完整路徑和文件名,如果用在包含文件裏面,則返回包含文件名,自 php4.0.2開始,__FILE__總是包含一個絕對路徑,而在此前的版本有時候會包含一個相對路徑
    __FUNCTION__:返回函數名稱(自 php4.3.0新加的)。自php5起本常量返回該函數被定義時的名稱,區分大小寫,在php4中該值總是小寫;
    __CLASS__:返回類的名稱,自 php4.3.0新加的,自php5起本常量返回該類被定義時的名稱,區分大小寫,在php4中該值總是小寫的;
    __METHOD__:返回類的方法名。 php5新加的

  3. 如何在命令行下運行php腳本(寫出兩種方式)同時向php腳本傳遞參數
    window下,假設php安裝目錄爲c:\\program files\\php5\\,那麼使用命令窗口進入到該路徑下,敲入php hello.php回車,則會執行當前路徑下的hello.php文件,
    如果要指向其他路徑下php文件,可以在php 路徑/hello.php ,這種形式稱爲CLI模式,我們平時通過瀏覽器看到的那種成爲CGI模式,至於傳遞參數,php文件在cli模式下,直接通過在文件名稱後面接參數,多個參數中間用空格隔開,在php文件裏面是通過兩個變量來獲取參數的,一個是$argv,一個是$argc,前者是傳遞參數的數組,默認第一個爲php文件的名稱;後者爲$argv數組個數
    linux下,一般程序安裝都會安裝在/usr/bin/php下面,可以通過man php查看一下,如果有信息說明可以使用,使用方法類似於window下。如果前面這步成立,那麼你可以直接 php php文件 來運行php文件,如果man php沒有信息,則說明當前php執行文件沒有在環境路徑裏面,可以修改環境路徑包含php路徑,也可以類似於window進入php路徑,在執行 php php文件。其他類似於window下。 如export到環境變量到對應的目錄 export PATH=$PATH:/usr/local/go/bin 或者在vi /etc/profile 下添加上面那句話。將php的運行文件加入環境變量裏面

  4. 簡單說明php的垃圾收集機制是怎樣的?
    簡單版
    變量有個引用計數計數到0時變量被銷燬。
    高級版
    PHP作爲腳本語言是頁面結束即釋放變量所佔內存的。 當一個 PHP線程結束時,當前佔用的所有內存空間都會被銷燬,當前程序中所有對象同時被銷燬。GC進程一般都跟着每起一個SESSION而開始運行的.gc目的是爲了在session文件過期以後自動銷燬刪除這些文件. 在PHP中,沒有任何變量指向這個對象時,這個對象就成爲垃圾。PHP會將其在內存中銷燬;這是PHP 的GC垃圾處理機制,防止內存溢出。 執行這些函數也可以起到回收作用 __destruct /unset/mysql_close /fclose php對session有明確的gc處理時間設定 session.gc_maxlifetime 如果說有垃圾,那就是整體的程序在框架使用中,會多次調用同一文件等等造成的非單件模式等。所以在出來的時候,必要的用_once 引用,在聲明類的時候使用單件模式。還有簡化邏輯等等。而如果妄想讓PHP自己本身管理內存,進行垃圾管理。呵呵。好像PHP還辦不到,對於析構函數,ANDI在他的書裏寫的很明白。可有可無,不可置否。而內存管理的東西一般都是桌面程序更多去考慮的。

發佈了157 篇原創文章 · 獲贊 140 · 訪問量 56萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章