公告版位

新版部落格:blog.changyy.org

今天嘗試使用 PHP - IMAP 系列的函數,發現一件很離奇的事,那就是我已經設定好 php.ini 了,在 command mode 下也都能正常執行起來,偏偏想在 Apache Web Server 執行時,依舊蹦出 Call to undefined function imap_open !

我已經很確定有設定好下面幾個步驟

  • 設定 php.ini 中 extension_dir 值,採絕對位置
  • 啟用 imap extension ,即拿掉註解 extension=php_imap.dll

以上步驟使得我在 command mode 上一切正常,但讓我疑惑的是為什麼 Web Server 一樣不正常?最後恍神一會,我才想到要看看 phpinfo() 的資訊,一看才發現 Apache Web Server 吃的 Loaded Configuration File 並不是我設定的位置,呼。沒想到竟然會是這種問題。

原先是我 PHP 跟 Apache Web Server 分開安裝的,所以一直沒成功也不覺奇怪,後來嘗試 Appserv 的方式,接著自己會在 Appserv\php5 目錄中建 php.ini 出來,發現還是一樣不行,最後仔細去看 phpinfo() 才發現 Web Server 吃的 php.ini 的位置不同,發現是落在 C:Windows\php.ini ,更正確地說法是作業系統安裝的目錄中。

在網路上查資料後,決定設定 PhpIniDir 來解決!最後也才發現,原來 Apache Web Server 一開始在找 php.ini 設定檔時,會有以下的順位,資料來源 Apache 配置参数之 PHPIniDir

  1. PhpIniDir
  2. 註冊資料 HKEY_LOCAL_MACHINE->SOFTWARE->PHP->IniFilePath
  3. 環境變數 PHPRC
  4. PHP5 根目錄 (For CLI) 或 WWW 根目錄 ( For SAPI moudles )
  5. Windows 目錄

其中 PhpIniDir 的設定是在 httpd.conf 中,嘗試的結果是必須在 LoadModule php5_module 前就設定好,可能跟我使用 PHP 的環境與方式有關吧?我一開始找到的 PhpIniDir 的設定資訊: Apache 使用 mod_php 讓 VH 有獨立的 php.ini 檔

我覺得這是很特別的經驗,以前在安裝這類服務時,總記得是在設定與編譯軟體時去指定安裝的目錄資訊,鮮少在 httpd.conf 加以設定,算是有摸索到東西囉。


changyy 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • Ken
  • 您好!

    我作了個服務!

    然後利用win 7的工作排成去執行這隻PHP!

    當我用browser看這隻PHP時都會正常!

    可是用工作排成執行時!

    他就會說!

    call to undefined function mb_strlen();XXXXXXXXXXXXXXXXX

    可是我在php.ini裡也有把;拿掉!

    不然在browser也不會正常執行!

    而且在system32這個資料夾下也有丟php_mbstring.dll!

    都還是會錯!

    為什麼呢?
  • 看起來有可能是環境變數的問題, 因為在 browser 執行時, 它可以拿到環境變數, 因此可以找到 php_mbstring.dll, 但如果用排程時, 有可能拿不到相關資訊囉

    建議排程的部分用絕對路徑處理(可以都先寫在一個 *.bat 或 *.cmd 檔案內), 另外加上 -c 參數來指定 php.ini 位置, 且 php.ini 裡頭有一行 extension_dir 也請指定絕對位置給它(用來找php_mbstring.dll), 例如寫在 test.cmd 中:

    C:\php\php.exe -c C:\path\php.ini test.php

    然後排程再去跑 test.cmd 吧, 你可以先點選 test.cmd 看看有沒有成功囉, 以上是我猜測的, 暫時沒環境測試, 給你當作參考吧

    changyy 於 2010/03/11 01:06 回覆

  • Ken
  • ya!

    我解決了:D!
    是用-c!

    謝謝你:D
  • 恭喜恭喜 :D

    changyy 於 2010/03/11 17:54 回覆