- class Test {
- public function __construct(){
- $this->_log('start');
- }
-
-
- public function __destruct () {
- $this->_log('finish');
- }
-
- public function _log ($str) {
- error_log($str . "\n", 3, './log.log');
- }
- }
- $test = new Test;
- ?>
複製代碼發現log.log中只有start,沒有finish。 清空log中的內容之後,再修改一下程式:unset($test); 果然,有了start,又有了finish。 好像真的是要unset才會執行__destruct。 可是事情還沒有結束,我又修改了一下程式,改動了__destruct函數,同時刪除了unset這句代碼:
- public function __destruct () {
- echo 'finish';
- $this->_log('finish');
- }
- ?>
複製代碼這時候螢幕上居然列印出了‘finish’,這樣就證明解構函式確實是被執行到了。 百思不得其解之後,開始上網找資料,看到一位朋友些的解構函式中用到了error_log並被執行了,和我用法不同的是他並沒有指定error_log的檔案,而是到預設的log檔案,於是我類比了一下,又修改了我的程式:
- public function _log ($str) {
- error_log($str . "\n");
- error_log($str . "\n", 3, './log.log');
- }
- ?>
-
複製代碼我發現log.log中仍然之後start,沒有finish。而E:\AppServ\Apache2.2\logs\error.log(我的apache配置的預設的log記錄檔)真的有start和finish。奇怪的問題,想不通,於是去群裡面問了下,群裡的朋友要麼讓我檢查語法錯誤,要麼檢查檔案許可權,我確定這兩個沒有任何問題。我說“windows系統,不存在許可權問題,肯定不是這個引起的”一個群友說:“windos系統,不解釋!”我說:“這肯定和系統沒關係,我懷疑是apache的問題。”於是我把_log還原了一下,到linux+nginx的虛擬機器上跑了一下。
- public function _log ($str) {
- error_log($str . "\n", 3, './log.log');
- }
- ?>
-
複製代碼log.log中成功寫入了start和finish。 這讓我更加懷疑我的判斷:apache導致的 於是折騰了一個小時,在伺服器上裝了apache並運行了一下檔案,還是同樣的結果,finish並沒有成功寫入。 這時候一個同事跟我說,你寫絕對路徑試試看,於是我又修改了一個_log
- public function _log ($str) {
- error_log($str . "\n", 3, '/var/www/apache/log.log');
- }
- ?>
複製代碼再觀察一下,成功寫入“finish”,激動啊,終於找到問題了,我又修改了一下程式
- public function __construct(){
- echo getcwd() . '
';
- }
-
- public function __destruct () {
- echo getcwd() . '
';
- }
- ?>
複製代碼查看運行結果:/var/www/apache / 再到nginx伺服器下運行,得到結果:/var/www/apache /var/www/apache 原來apache的解構函式會改變當前程式的目錄,所以用相對目錄的話,就找不到對應的檔案,寫入當然也是失敗了。學習語言不容易啊,多實踐有好處的。 |