php中解構函式中的工作目錄的問題

來源:互聯網
上載者:User
  1. class Test {
  2. public function __construct(){
  3. $this->_log('start');
  4. }
  5. public function __destruct () {
  6. $this->_log('finish');
  7. }
  8. public function _log ($str) {
  9. error_log($str . "\n", 3, './log.log');
  10. }
  11. }
  12. $test = new Test;
  13. ?>
複製代碼

發現log.log中只有start,沒有finish。

清空log中的內容之後,再修改一下程式:unset($test); 果然,有了start,又有了finish。

好像真的是要unset才會執行__destruct。

可是事情還沒有結束,我又修改了一下程式,改動了__destruct函數,同時刪除了unset這句代碼:

  1. public function __destruct () {
  2. echo 'finish';
  3. $this->_log('finish');
  4. }
  5. ?>
複製代碼

這時候螢幕上居然列印出了‘finish’,這樣就證明解構函式確實是被執行到了。

百思不得其解之後,開始上網找資料,看到一位朋友些的解構函式中用到了error_log並被執行了,和我用法不同的是他並沒有指定error_log的檔案,而是到預設的log檔案,於是我類比了一下,又修改了我的程式:

  1. public function _log ($str) {
  2. error_log($str . "\n");
  3. error_log($str . "\n", 3, './log.log');
  4. }
  5. ?>
複製代碼

我發現log.log中仍然之後start,沒有finish。而E:\AppServ\Apache2.2\logs\error.log(我的apache配置的預設的log記錄檔)真的有start和finish。奇怪的問題,想不通,於是去群裡面問了下,群裡的朋友要麼讓我檢查語法錯誤,要麼檢查檔案許可權,我確定這兩個沒有任何問題。我說“windows系統,不存在許可權問題,肯定不是這個引起的”一個群友說:“windos系統,不解釋!”我說:“這肯定和系統沒關係,我懷疑是apache的問題。”於是我把_log還原了一下,到linux+nginx的虛擬機器上跑了一下。

  1. public function _log ($str) {
  2. error_log($str . "\n", 3, './log.log');
  3. }
  4. ?>
複製代碼

log.log中成功寫入了start和finish。

這讓我更加懷疑我的判斷:apache導致的

於是折騰了一個小時,在伺服器上裝了apache並運行了一下檔案,還是同樣的結果,finish並沒有成功寫入。

這時候一個同事跟我說,你寫絕對路徑試試看,於是我又修改了一個_log

  1. public function _log ($str) {
  2. error_log($str . "\n", 3, '/var/www/apache/log.log');
  3. }
  4. ?>
複製代碼

再觀察一下,成功寫入“finish”,激動啊,終於找到問題了,我又修改了一下程式

  1. public function __construct(){
  2. echo getcwd() . '
    ';
  3. }
  4. public function __destruct () {
  5. echo getcwd() . '
    ';
  6. }
  7. ?>
複製代碼

查看運行結果:/var/www/apache /

再到nginx伺服器下運行,得到結果:/var/www/apache /var/www/apache

原來apache的解構函式會改變當前程式的目錄,所以用相對目錄的話,就找不到對應的檔案,寫入當然也是失敗了。學習語言不容易啊,多實踐有好處的。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.