背景:
最近两篇专栏博文讲解的都是有关WEB PACS环境的搭建,如果搭建的平台后端不进行DICOM的相关操作,其实跟PACS压根就一点关系也没有,所以最近几篇看似有些跑题,不过大家不要着急,开发环境的搭建本身就是一项巨大而且艰难的工程,等调试好环境后续的PACS相关开发就会如单机版一样得心应手,再忍耐一会,近期马上会开始介绍在平台上进行WEB PACS的研发。
C/C++编写PHP扩展的环境搭建:上两篇博文只是对该环境的一个取巧的尝试,第一篇博文直接利用APACHE服务自带的CGI,直接调用C编译后的exe文件,由于CGI技术已经逐渐被FastCGI取代,所以第一篇博文仅作为示范来用,不是运用到后期实际开发中;第二篇博文延续第一篇,试图进行图像的传输,最终也未能找到C语言实现图像数据传输的正确方法,只能偷懒的用PHP和Perl等解释型语言来实现,但是PHP和Perl不能很好与我们前面介绍的DCMTK融合,所以第二篇博文也没有太大的作用。鉴于上述原因,遂决定在已经搭建的FastCGI平台的基础上,添加C/C++语言编写PHP扩展的框架,来实现最终WEB PACS的完整开发环境。
前期准备:
1)PHP源码:下载PHP源码的目的是为了生成最新的、最符合本机的php运行程序,即php.exe(当然也可以直接百度/谷歌最新的PHP安装包,双击安装即可);
2)PHP源码编译:PHP源码是开源的,要求在linux下编译,所以需要在windows下安装一个mini的Linux编译环境,即下载Cygwin或者msys+MingGWen(两者详细的区别可参照此博文http://zengrong.net/post/1723.htm中的介绍);??记得安装完成Cygwin(即Linux编译器)后,修改ext_skel_win32.php中的$cygwin_path = 'c:\cygwin64\bin';语句,改为自己的路径,目的是为了指明sh.exe的位置。
3)PHP SDK:SDK,全称为Software Development Kit,顾名思义就是软件开发过程中常用的小工具(可理解为API)的集合。此处我们只需要使用php-binary-sdk包中的bison.exe和flex.exe,将其拷贝到当前windows目录下??目的是为了我们能够找到(也可将两者的路径添加到环境变量Path中)。
编译生成:
PHP源码编译:
本机电脑安装的是VS2012和VS2010,此处选择VS2012来编译PHP源码。首先进入VS的命令行状态,如下图:
输入:cd c:\PHPDev\php-5.6.2
转换到php源码目录,该目录下有buildconf.bat文件。(此处PHPDev是我自己建立的上一级目录,在实际编译过程中请更换为自己本地的目录)
输入:buildconfig.bat,该批处理命令中启动脚本程序buildconfig.js,搜索目录下所有的.w32文件为windows环境下的编译做准备。如果运行成功会提示“Now run 'configure --help'”,否则提示“Error generating configure script, configure script was not copied”。成功编译后,按照提示可先输入configure --help查看编译选项,随后参照博文中http://demon.tw/software/compile-php-on-windows.html的说明输入:
configure ?without-xml ?without-wddx --without-simplexml --without-dom --without-libxml --disable-zlib --without-pdo-sqlite ?-disable-odbc ?-disable-cgi --enable-debug --without-iconv --disable-ipv6
注意此处略不同于博文中的介绍,without前是两个“-”,具体参照configure --help的提示,如下图:
配置完成后就是编译过程了,输入nmake,开始实际编译。
【注】:编译过程中可能会出现错误,例如下图所示,这种情况下利用EditPlus或者NotePad++等编辑工具将文件转存为utf-8编码,重新启动nmake即可。
编译完成后会出现Debug_TS文件夹,该文件夹下就是我们编译源码后生成的php可执行文件,其中会看到php.exe文件,下图是nmake编译成功的结果图。
进入到Debug_TS目录下,输入php.exe “echo ‘Hello World’;"测试可以看到正确的输出,说明在windows平台下编译php源码的工作顺利完成了。
PHP骨架生成:
php.exe ext_skel_win32.php --extname=zsgetdcmimage
获得了PHP可执行程序后,就是骨架生成了。进入到php源码中的ext文件夹,可以看到用于骨架生成的两个文件,ext_skel和ext_skel_win32.php。打开ext_skel_win32.php,大致上可以看出如何来构建骨架程序的,其实就是通过Cgywin中提供的sh.exe工具,启动sh.exe ext_skel,随后将原本已经写好的一个基于C/C++动态库的工程通过php脚本的方式自动修改为我们自己命名的工程。可以打开源码ext\skeleton目录,发现其中存在着一个名称为skeleton.dsp的工程,与最终我们获得的骨架工程仅仅是名称不同而已。
C编写PHP扩展测试:
基本环境搭建完成了,让我们来进行一次实际测试。
骨架工程中给我们提供了一个与我们工程名称相同的测试函数,例如我的zsgetdcmimage工程中的函数为:
/* Remove the following function when you have successfully modified config.m4 so that your module can be compiled into PHP, it exists only for testing purposes. *//* Every user-visible function in PHP should document itself in the source *//* {{{ proto string confirm_zsgetdcmimage_compiled(string arg) Return a string to confirm that the module is compiled in */PHP_FUNCTION(confirm_zsgetdcmimage_compiled){ char *arg = NULL; int arg_len, len; char *strg; len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "zsgetdcmimage", arg); RETURN_STRINGL(strg, len, 0);}
因为上面我们编译的php源码开启的是调试状态,即参数为--enable-debug,所以在编写骨架程序时刻要对应的用Debug_TS模式编译,同时在添加链接库为php5ts_debug.lib,该文件在php编译后的源码文件夹Debug_TS中。
编译成功后,将生成的zsgetdcmimage.dll拷贝到我们编译出来的php可执行程序的目录Debug_TS中的ext子目录下,然后修改Debug_TS中的php.ini,添加extension=ext/zsgetdcmimage.dll语句。
最后创建一个测试php文档test.php,代码如下:
<?phpecho confirm_zsgetdcmimage_compiled("zssure");?>
在命令行状态下,转到Debug_TS目录下,输入php.exe test.php,如果配置成功,会得到如下输出:
至此骨架扩展及实例测试已经完成了。
后记:更换WampServer中的PHP前两篇博文中已经利用wamp打架了一个机遇Apache+PHP+MySQL的Web服务框架,将上述编译完成的zsgetdcmimage.dll扩展放入到c:\wamp\bin\php5.5.12\ext中,启动wampServer后,竟然无法调用出现如下错误提示:
该错误说明利用php5.6.2扩展骨架生成的扩展放在php5.5.12下不匹配。既然如此,要想将PHP扩展骨架添加到前面搭建的WEB PACS平台中只有两种选择:1)重新下载对应版本的php5.5.12的源码,按照上述记录重新生成骨架程序;2)更换wamp安装包中的php。
原本对WampServer的配置就不是很了解,所以想借助此次机会来顺便学习一下。遂决定尝试更换WampServer安装包中的PHP,有原来的php5.5.12替换成php5.6.2。网上搜索了一下,相关的资料不少。基本的操作思路主要参考了这两篇博文的介绍http://www.cnblogs.com/heiing/archive/2011/11/15/2249948.html和http://pcwanli.blog.163.com/blog/static/45315611201441811572810/,上两篇博文的介绍略显简单,且逻辑性不是很好。现在给出我在Win7 32bit+WampServer-64-bits-php-5-5环境下的具体实施步骤。首先将进入到c:\wamp\bin\php目录,将php官网下载的最新的windows下的二进制安装包解压到该目录下,例如php5.6.2的完整路径为c:\wamp\bin\php\php5.6.2,随后修改方法及顺序如下:
WampServer修改1 | wampmanager.conf | [php]标签下替换为新版的版本号5.6.2 [phpCli]标签中的版本号替换为5.6.2 |
WampServer修改2 | wampmanager.ini | 利用NotePad++或者EditPlus等文本编辑器搜索文件中的phpX.X.X统一替换为php5.6.2; 【注意】:X.X.X部分也需要替换为5.6.2,例如[switchPhp5.6.2]、[phpVersion]下的Caption等等。 |
PHP修改1 | php.ini | 1)将extension_dir设置为新版的php.exe的路径,extension_dir = "c:\wamp\bin\php\php5.6.2\ext\" 2)然后有选择性的取消extension=XXX.dll的注释,添加php的扩展 |
PHP修改2 | phpForApache.ini | 复制php.ini文件,更名为phpForApache.ini |
APACEH修改 | httpd.conf | FastCGI配置模块中php的版本号相应修改,如下: LoadModule php5_module "c:/wamp/bin/php/php5.6.2/php5apache2_4.dll" PHPIniDir c:/wamp/bin/php/php5.6.2 LoadModule fcgid_module modules/mod_fcgid.so AddHandler fcgid-script .fcgi .php #php.ini的存放目录 FcgidInitialEnv PHPRC "c:/wamp/bin/php/php5.6.2" # 设置PHP_FCGI_MAX_REQUESTS大于或等于FcgidMaxRequestsPerProcess,防止php-cgi进程在处理完所有请求前退出 FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000 #php-cgi每个进程的最大请求数 FcgidMaxRequestsPerProcess 1000 #php-cgi最大的进程数 FcgidMaxProcesses 5 #最大执行时间 FcgidIOTimeout 120 FcgidIdleTimeout 120 #php-cgi的路径 FcgidWrapper "c:/wamp/bin/php/php5.6.2/php-cgi.exe" .php AddType application/x-httpd-php .php |
实际测试 | 1)将利用PHP骨架编译的zsgetdcmimage.dll扩展放到php5.6.2\ext目录下 2)在wamp\www目录下建立测试php文件,test.php | 浏览器中输入localhost\test.php 得到如下输出: |
至此更换WampServer安装包中的PHP版本的工作顺利完成,经过多次努力,用三篇博文的篇幅我们已经顺利的搭建了WEB PACS开发的基础环境。后续会开始介绍利用PHP的扩展骨架结合DCMTK来实现WEB PACS的各项功能。
后续专栏博文介绍:利用PHP Skel结合DCMTK开发WEB PACS应用
利用DCMTK搭建WML服务器
利用oracle直接操作DICOM数据
C#的异步编程模式在fo-dicom中的应用
VMWare三种网络连接模式的实际测试
作者:zssure@163.com
时间:2014-10-31

PHP在现代编程中仍然是一个强大且广泛使用的工具,尤其在web开发领域。1)PHP易用且与数据库集成无缝,是许多开发者的首选。2)它支持动态内容生成和面向对象编程,适合快速创建和维护网站。3)PHP的性能可以通过缓存和优化数据库查询来提升,其广泛的社区和丰富生态系统使其在当今技术栈中仍具重要地位。

在PHP中,弱引用是通过WeakReference类实现的,不会阻止垃圾回收器回收对象。弱引用适用于缓存系统和事件监听器等场景,需注意其不能保证对象存活,且垃圾回收可能延迟。

\_\_invoke方法允许对象像函数一样被调用。1.定义\_\_invoke方法使对象可被调用。2.使用$obj(...)语法时,PHP会执行\_\_invoke方法。3.适用于日志记录和计算器等场景,提高代码灵活性和可读性。

Fibers在PHP8.1中引入,提升了并发处理能力。1)Fibers是一种轻量级的并发模型,类似于协程。2)它们允许开发者手动控制任务的执行流,适合处理I/O密集型任务。3)使用Fibers可以编写更高效、响应性更强的代码。

PHP社区提供了丰富的资源和支持,帮助开发者成长。1)资源包括官方文档、教程、博客和开源项目如Laravel和Symfony。2)支持可以通过StackOverflow、Reddit和Slack频道获得。3)开发动态可以通过关注RFC了解。4)融入社区可以通过积极参与、贡献代码和学习分享来实现。

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP不是在消亡,而是在不断适应和进化。1)PHP从1994年起经历多次版本迭代,适应新技术趋势。2)目前广泛应用于电子商务、内容管理系统等领域。3)PHP8引入JIT编译器等功能,提升性能和现代化。4)使用OPcache和遵循PSR-12标准可优化性能和代码质量。

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Dreamweaver CS6
视觉化网页开发工具

WebStorm Mac版
好用的JavaScript开发工具