Feeds:
文章
留言

Archive for 四月 5th, 2006

今天上網找資料發現一個有趣的東西,就是 Phalanger .Net ,這個東西有神奇之處,首先它提供了一個 PHP 的 .Net Frameowrk 編譯器(phpc.exe) 可以將 php 程式碼編譯成 .Net Framework  Managed 可執行檔,假如你有一個 php 程式如下:
<?php
  // hello.php
  echo "Hello PHP";
?>
 
你只需要執行 phpc hello.php ,就會產生 hello.exe
 
編譯執行結果如下:
 
官方提供的 ConsoleApplication 範例皆可以上述方式順利通過。

編譯 php code 成為 DLL
 
<?php
   // phpLib.php
 
  // 簡單的加法運算
    function phpLib($a, $b){
      return $a+$b;
   }
 
   // base64 編碼
    function phpBase64Encode($str) {
        return base64_encode($str);
    }
 
  // base64 解碼
    function phpBase64Decode($str) {
        return base64_decode($str);
    }
?>
 
建立 dll,一樣使用 phpc 如下
phpc /target:dll phpLib.php
產生 bin/phpLib.php
 
如果你利用 .net 提供的 ildasm 工具來觀察,可以得到下面的結果
 
 如果你在 VS.2005 中建立一個如下的 C# Console application
using System;
using PHP.Library;
using PHP.User.Default.phpLib.php;   
namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            PHP.Core.ScriptContext phpContext = new PHP.Core.ScriptContext();
            // 使用 php 產生 DLL
            int a = 100;
            int b = 99;
            int result =  PHP.Core.Convert.ObjectToInteger( Default.phpLib(phpContext, a, b) );
            Console.WriteLine("{0}+{1}={2}", 100, 999, result);
            string org = "你好啊12300#@!#@!#!";
            Console.WriteLine(org);
            string enc = (string)Default.phpBase64Encode(phpContext, org);
            Console.WriteLine(enc);
           
            string dec2 = PHP.Core.Convert.ObjectToString( Default.phpBase64Decode(phpContext, enc ) );
            Console.WriteLine(dec2);
        }
    }
}
 
你將會得到下面的執行結果…
 

另外這個套件有提供 Visual Studio 2003 的整合,可在 VS2006 上編輯、測試 PHP 程式,可是因為我目前手上是使用 VS2005 ,所以以上的範例我只使用了下面這個安裝包
如果你有 VS2003 可以嘗試安裝其他的套件。
 

如果要使用 PHP Extension 部分,首先必注意一下,如果你是使用 .Net Framework 1.x 的編譯器應該可以順利通過(我沒有試過),由於我的環境是 .Net 2.0,可是 Phalanger 套件是針對 .Net 1.x 版本製作的,所以,如果要在 .Net 2.0 下編譯 Extensions 範例,必須先自行在
C:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIGmachine.config
加上下面兩段設定
1. 放在第一個 <configSections> 節點下
<section name="phpNet" type="PHP.Core.ConfigurationSectionHandler, PhpNetCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0a8e8c4c76728c71" />
 
2. 放在 <configuration> 節點下
  <phpNet>
    <paths>
      <set name="DynamicWrappers" value="D:Program FilesPhalangerDynamic" />
      <set name="Libraries" value="D:Program FilesPhalangerBin" />
      <set name="ExtManager" value="D:Program FilesPhalangerBin" />
      <set name="ExtWrappers" value="D:Program FilesPhalangerWrappers" />
      <set name="ExtTypeDefs" value="D:Program FilesPhalangerTypeDefs" />
      <set name="ExtNatives" value="D:Program FilesPhalangerExtensions" />
    </paths>
    <classLibrary>
      <add assembly="PhpNetClassLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=4af37afe3cde05fb" section="bcl" />
      <add assembly="php_calendar.mng, Version=1.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3" section="calendar" />
      <add assembly="php_image.mng, Version=1.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3" section="image" />
      <add assembly="php_ftp.mng, Version=1.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3" section="ftp" />
      <add assembly="php_zlib.mng, Version=1.0.0.0, Culture=neutral, PublicKeyToken=4ef6ed87c53048a3" section="zlib" />
    </classLibrary>
  </phpNet>
 
接著編譯 Extensions 範例應該可以順利通過。
 
官方範例(以 .Net 2.0 + VS2005 重建): 
2. Extensions: 測試結果我只成功將 ming 編譯成功,其餘都是類似的錯誤訊息 Call to undefined external function ‘exif_read_data’, extension ‘php_exif’ – check configuration 

 

 

Read Full Post »

Read Full Post »

4/3 微軟發佈 Visual Server 2005 R2 企業版可以免費下載,載點如下
 
且支援大部分的 Linux 版本安裝,下載前需要有一個 passport 帳號…填寫大量的個人資料後,就會看到下面的下載點
 
檔案大小約莫 29MB
 
安裝介面
 
程式執行介面
 
Visual Server 2005 使用網頁作為使用者介面是相當的不錯,可是操作過程我還是比較習慣 VMWare…

Read Full Post »