首页 > 编程语言 >PHP与C#混合用

PHP与C#混合用

时间:2024-10-16 15:36:33浏览次数:7  
标签:php 函数 C# Phalanger 混合 读者 PHP

故事背景是这样的,有一套项目,服务器端是用C#写的,为了完成某种事情,它需要使用到一个组件,这个组件很小但很重要,很不巧的是,这个这个组件是用PHP语言写的,如果为了使用这个组件而专门搭建一个PHP的环境显得有点高射炮打蚊子(况且还有其他不可预见的阻力)。或许有读者会提出“抗议”:不是PHP写的么,直接看源码翻译出一份C#版的不就行了?然而事实并不如想象的美好,总之就是短期内无法这么做了。

如今的C#已经非常强大了,它除了可以做我们普通的站点开发、桌面开发和原生的Windows Phone、应用商店开发,还可以做其他诸如IOS、安卓开发;也通过用CLR来托起一个JVM(这里指IKVM.NET)来跑Java应用程序,当然也可以通过把PHP编译成IL来跑PHP的网站程序了。

本篇中,我们就如何进行PHP与C#混合编程作如下讨论:

  (1)、PHP与C#的胶水:“Phalanger”

  (2)、牛刀小试跑跑PHP

  (3)、如何添加PHP类库

  (4)、C#与PHP混合互调

  (5)、美丽如玫瑰,采摘须谨慎

本文中的示例代码请点击这里进行下载。


1、什么是Phalanger

 什么事Phalanger,最简单的概括就是,它能够把PHP编译成DLL供我们C#调用。

Phalanger的官网是:http://www.php-compiler.net/

我们要做混合编程,首先得先从官网那里下载一个安装包。

 下载下来之后,打开压缩包,双击Setup开始安装。

把这些都给安装了,前面两个必装,最后一个是模板文件,不想装就不装,已经安装的话它会写着“Already installed”。由图中,我们可以得知一个信息,那就是它只支持Framework 4.0。

把上面的东西安装好之后,我们需要的“胶水”就得到了。

 

2、在.NET里面跑一个php

嗯,phpinfo(),我没有猜出,这个函数应该是各位读者们第一个敲的,也是搭建完PHP环境之后必敲写的一个函数。我们也牛刀小试一番,试试执行这个函数。

我们先创建一个空的WebApplication

然后添加一个PHP文件,由于我们没有直接的PHP文件添加,所以我们随便添加了一个内容少一点的文件,然后改它的后缀为php并删光里面的代码。

写上我们的代码(还带有智能提示,先进!!!):

然后按下“F5”

 然后就奇迹般的出现了我们想要的页面。

 

3、添加PHP的类库

事实上,即使我们是写原生的PHP,我们都需要使用到大量的PHP库,譬如MySQL库、GD库、CURL库等。在这里当然也不例外,我们也需要使用那些库。不过在这里,我们所使用的库并不是PHP/ext中的那些库,而是Phalanger给我们准备好的库,它们随着Phalanger的安装一同安装到我们的电脑当中,有兴趣的读者可以翻开GAC目录,里面会多了很多php打头的文件夹,那些就是与Phalanger相关的库了。

 需要使用哪个库,就自行的在WebConfig的phpNet节点下添加,譬如我需要用MySQL的库,则在WebConfig这样配置

复制代码
<?xml version="1.0" encoding="utf-8"?>

<!--
  有关如何配置 ASP.NET 应用程序的详细消息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>

  <phpNet>
    <classLibrary>
      <add assembly="PhpNetMySql, Version=3.0.0.0, Culture=neutral, PublicKeyToken=2771987119c16a03" section="mysql"/>
    </classLibrary>
  </phpNet>

</configuration>
复制代码

这里注意一点,MYSQL的扩展库请使用CodePlex上的,而非自带的,自带的版本链接高板MYSQL可能会遇到问题(地址如下:http://phalangermysql.codeplex.com/releases/view/103022

这里还有另外一点需要注意,CodePlex上的扩展下载下来之后是这样的。

MySql的库命名有问题,正确的应该是“MySql.Data.dll”,各位读者请留意。

 然后就是写下我们读取数据库信息的代码:

 mysqlextension.php

然后运行并查看结果:

它成功的读取到我们数据库的东西并输出到页面中。

 

4、C#与PHP互调

既然是混合编程,如果没有两种语言之间的相互调用那又如何能够称得上混合编程呢?本节中,我们主要分两个部分,其一就是PHP调C#函数,其二就是C#掉PHP函数。

PHP调用C#,Phalanger官网中主要的范例均是此,这里就不作讲解了,有需要的读者可移步到Phalanger官网中看里面的Blog。本文中讲解的是使用概率更高同时也是官网中比较缺乏资料的C#调用PHP的函数。

首先我们先创建一个PHP的函数: 

 Fun.php

然后新建一个WebForm页面程序,并在CodeBehind中调用它(这里是简单加法例子):

 View Code

然后再页面中运行看看,Cool:

这里,我要对CodeBehind(C#)部分的代码进行下讲解,它的原理大概如下:

  (1)、先获取PHP的上下文对象PHPContext

  (2)、然后往PHPContext中require_once我们写的“Fun.php”

  (3)、通过Call方法,第一个参数传入方法名,第二个参数传入Object数组类型的参数。调用PHP中的函数

  (4)、在被调用的PHP函数执行完成之后,将它的返回接收回来。并过滤开头的“&”字符。

至于更深入的,譬如如何New一个PHP的Class之类的,我没有进行深入的研究,所以这里就不作描述,有兴趣的读者可以自行深入研究,同时也欢迎有此经验的读者进行分享。

 

5、这美丽又丑陋的Phalanger

在前面的几章中,Phalanger的表现是如此的美丽优秀,它好比一朵玫瑰,看起来是那么的鲜艳,闻起来是那么的幽香,但是当你想采摘它的时候,手中拿着的确是幽艳玫瑰之下的荆棘。也只有你划破伤口流着血的时候,你才感觉到原来采摘这朵玫瑰是那么的痛。

我把开篇时的故事继续说完,到了这一步,读者们大概也可以猜到是个什么情况了,没错,我的尝试失败了,这个PHP的组件无法正常的运行。

下面,我给各位读者分享两个这个组件所遇到致命性伤痕:

  (1)、if中对byte的真假识别不一致。

  同样是读取一个文件,通过if(byte[])来判断这个文件是否为空,原生的PHP中可以根据传入的byte[]是否为null来决定true/false,而Phalanger则无论如何一直返回false。

  (2)、同样的PHP内置函数,执行的效果却不一致。

  这里的所说的函数运行效果不一致并不是说效果完全的不一致,普通的使用还是没有问题的(正如我刚才读取mysql那样),而是有极少数的函数在特殊的条件下运行后得出的结果在原生PHP与Phalanger中是不一样的。


当然了,一百个读者有一百个海姆莱特,萝卜青菜各有所爱,Phalanger到底值不值得使用,应该怎么使用,还是全凭各位读者自己博弈了。

标签:php,函数,C#,Phalanger,混合,读者,PHP
From: https://www.cnblogs.com/Alex80/p/18470075

相关文章

  • WSL2 提示 NAT 模式下的 WSL 不支持 localhost 代理。
    wsl:检测到localhost代理配置,但未镜像到WSL。NAT模式下的WSL不支持localhost代理。意思是说你在宿主机上启用了代理设置,指向localhost(宿主自己),但是WSL虚拟机是处在一个NAT的子网下的,没有设置指向宿主的代理。要想让WSL虚拟机使用宿主机的代理,就需要设置指向宿......
  • 使用LLaMA-Factory训练LLM大模型并用ollama调用
    环境搭建系统环境需要Nvidia显卡,至少8G显存,且专用显存与共享显存之和大于20G建议将非安装版的环境文件都放到非系统盘,方便重装或移植以Windows11为例,非安装环境文件都放在E盘下设置自定义Path文件夹创建E:\mypath文件夹,将其添加进用户环境变量Path中,之后会用CMake下载......
  • 【广西省赛#7】G.Grand XOR Counting Problem Challenge
    Description给一个数组\({a_i},i=1,\cdots,n\),对\(j=0,1,\cdots,m-1\),计算其中有多少个大小为\(k\)的子序列满足其异或和为\(j\)。\(n\leq10^5\)$m\leq65536$Solution首先答案是\[[y^k]\prod_{i=1}^n(1+x^{a_i}y)\]这里对\(y\)做的是多项式乘法,对\(x\)......
  • Monaco Editor 实现一个日志查看器
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:文长前言在WebIDE中,控制台中展示日志是至关重要的功能。MonacoEditor作为一个强大的代码编辑器,提供了丰富的功能和灵活的API,支......
  • 必看!解读Salesforce最新AI趋势报告
    近年来,AI技术正在快速渗透到各行各业,尤其是在客户关系管理(CRM)领域。据Salesforce最新的《AI在CRM中的趋势》报告显示,尽管AI发展潜力巨大,但许多公司在接受这一新技术时仍然犹豫不决。如何解决数据、信任和伦理等关键问题,成为企业能否真正释放AI潜力的关键。员工在AI领域的“自我......
  • ChatGPT的终极指南概要
    ChatGPT的终极指南概要PromptFormat(提示格式)是一种用于指导ChatGPT生成特定类型回答的模板。它通常包括以下几个部分:角色(Role):定义AI模型在Prompt中所扮演的角色,例如专家、顾问、教师等。任务(Task):明确指定AI模型需要完成的具体任务,如回答问题、提供建议或生成特定类型的文本。要......
  • 使用宝塔面板一键部署.NET Core
    都2024年了,搜了一下网上关于在宝塔上部署.netCore项目的,基本还是五六年前那一套: supervisor守护进程启动项目+ 新增静态站点+手动配置反向代理全套下来也挺麻烦的........前几天在一台闲置主机上安装了个宝塔面板版本是:9.0  发现网站选项里多了很多选项,万恶的是居......
  • Oracle 19c OCP 认证考试 083 题库(第2题)- 2024年修正版
    【优技教育】Oracle19cOCP083题库(Q2题)-2024年修正版考试科目:1Z0-083考试题量:85道(线下)通过分数:57%以上考试时间:150min(线下)本文为(CUUG原创)整理并解析,转发请注明出处,禁止抄袭及未经注明出处的转载。原文地址:http://www.cuug.com.cn/ocp/083kaoshitiku/38531279872.ht......
  • 使用CORS解决跨域问题
    如果发起请求所在主机(也称为域)和处理请求所在主机的协议、域名和端口号这三者中有任何一项不同,那么发出的请求就叫跨域请求。出于网络安全性方面的考虑,跨域请求会被限制,SpringBoot后端不能直接处理跨域请求,为了解决这一问题,可以在后端项目中引入CORS解决方案。在CORS(Cros......
  • Educational Codeforces Round 170 (Rated for Div. 2)
    A.TwoScreens难点是读题,找到最长公共前缀即可。#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineinti64usingvi=vector<int>;usingpii=pair<int,int>;consti32inf=INT_MAX/2;constintm......