在 Wamp 環境開發 Cconsolecommand 無法使用 Soapclient

開發使用 yii 框架的專案

在 Win7x64 + WAMP(wampserver2.2e-php5.3.13-httpd2.2.22-mysql5.5.24-32b) 環境

設定了系統變數 PHP_COMMAND=D:\wamp\bin\php\php5.3.13\php.exe

需要連接到遠端 Web Service 進行作業

[b]首先聲明,在相同的環境下已經有寫了一般 PHP 程式使用 SoapClient 並連接成功(呼叫帶參數的方法並且讀取回傳資料)

[/b]

因為要排程執行所以試著寫成 Yii Command 來執行

我在 protected/commands/ 新增一個 MySoapCommand.php 程式

程式碼內容如下(WSDL 網址經過修飾):




<?php

/**

 * 透過 Soap 取得資料

 */

class MySoapCommand extends CConsoleCommand

{

    public function run($args)

    {

        try

        {

            $client = new SoapClient('http://dotnetws.bestlong.idv.tw/websvc.asmx?wsdl');

        } catch(SoapFault $e) {

            die($e->getMessage());

        }

    }

}



然後進命令列執行 protected\yiic.bat 會出現




D:\wamp\www\yii-project\protected>yiic.bat

Yii command runner (based on Yii v1.1.13)

Usage: D:\wamp\www\yii-project\protected\yiic.php <command-name> [parameters...]


The following commands are available:

 - message

 - migrate

 - mysoap

 - shell

 - webapp


To see individual command help, use the following:

   D:\wamp\www\yii-project\protected\yiic.php help <command-name>



可以看到此時有出現一個 mysoap 命令

接著來執行看看




D:\wamp\www\yii-project\protected>yiic.bat mysoap

PHP Error[2]: include(SoapClient.php): failed to open stream: No such file or directory

    in file D:\wamp\www\yii\framework\YiiBase.php at line 421

#0 D:\wamp\www\yii\framework\YiiBase.php(421): autoload()

#1 unknown(0): autoload()

#2 D:\wamp\www\yii-project\protected\commands\MySoapCommand.php(11): spl_autoload_call()

#3 D:\wamp\www\yii\framework\console\CConsoleCommandRunner.php(67): MySoapCommand->run()

#4 D:\wamp\www\yii\framework\console\CConsoleApplication.php(91): CConsoleCommandRunner->run()

#5 D:\wamp\www\yii\framework\base\CApplication.php(169): CConsoleApplication->processRequest()

#6 D:\wamp\www\yii\framework\yiic.php(33): CConsoleApplication->run()

#7 D:\wamp\www\yii-project\protected\yiic.php(7): require_once()


D:\wamp\www\yii-project\protected>



就出現找不到 SoapClient.php 的錯誤

這或許是 WAMP 環境的問題

http://www.php.net/manual/en/soap.requirements.php

查一下,貌似在编译 php 的时候需要一些配置才能使用SoapClient。

phpinfo(); 看 soap 有没有打开

同樣的程式送到 Linux 環境執行不會出現錯誤

不過我找到真正的原因了,自己太久沒有用到 CLI 環境了,理所當然的認為在 Web 看到 phpinfo() 內有 SOAP 擴充模組就可以了

使用 WAMP 的環境

在 apache 啟動所使用的 php.ini (在網頁中檢視 phpinfo();)

與 CLI (命令列模式)(php.exe -i)所使用的不同

所以解決方式有兩種

  1. 同時修改兩邊的 php.ini 檔案設定

  2. 或是在 CLI 執行 php.exe 時使用 -c 指定同一個 php.ini 檔案