2009年4月6日 星期一

[PHP] Call to undefined function

今天嘗試使用 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 加以設定,算是有摸索到東西囉。


2 則留言:

  1. 您好!

    我作了個服務!

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

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

    可是用工作排成執行時!

    他就會說!

    call to undefined function mb_strlen();XXXXXXXXXXXXXXXXX

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

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

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

    都還是會錯!

    為什麼呢?

    版主回覆:(04/15/2009 03:59:30 AM)


    看起來有可能是環境變數的問題, 因為在 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 看看有沒有成功囉, 以上是我猜測的, 暫時沒環境測試, 給你當作參考吧

    回覆刪除
  2. ya!

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

    謝謝你:D

    版主回覆:(03/10/2010 05:06:07 PM)


    恭喜恭喜 :D

    回覆刪除