請說明在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等函數會收到限制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新加的如何在命令行下運行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的運行文件加入環境變量裏面簡單說明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在他的書裏寫的很明白。可有可無,不可置否。而內存管理的東西一般都是桌面程序更多去考慮的。
騰訊面試題 文字版
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.