使用 Delphi 2010 和 php4Delphi 编写 PHP 扩展
首先,这是关于php4Delphi而不是RadPHP(以前称为 Delphi For PHP)。
使用
- Delphi 2010
- PHP 5.3.6(VC9、NTS)
- php4Delphi 7.2(使用 VC9 指令编译)
- Windows Server 2008 R2
- IIS 7
当尝试在 IIS/PHP 服务器上运行 php4Delphi delphi_math.dll 示例扩展时,我在C:\Windows\Temp\php-errors.log 文件。
[2011 年 6 月 15 日 17:58:42] PHP 警告: PHP 启动:无法加载动态 库 'C:\Program Files (x86)\PHP\ext\delphi_math.dll' - 动态链接库 (DLL) 初始化例程失败。在 第 0 行未知
我已经解决了 PHP 找不到我的扩展的初始问题,因此这不是路径样式问题。
我认为 php4Delphi 7.2 可能不支持最新的 PHP 5.3.6。有人让这个配置为他们工作吗?
Firstly this is about php4Delphi not RadPHP (formerly Delphi For PHP).
Using
- Delphi 2010
- PHP 5.3.6 (VC9, NTS)
- php4Delphi 7.2 (compiled with VC9 directive)
- Windows Server 2008 R2
- IIS 7
When trying to run the php4Delphi delphi_math.dll example extension on the IIS/PHP server I see the following error in the C:\Windows\Temp\php-errors.log file.
[15-Jun-2011 17:58:42] PHP Warning:
PHP Startup: Unable to load dynamic
library 'C:\Program Files
(x86)\PHP\ext\delphi_math.dll' -
A dynamic link library (DLL)
initialization routine failed. in
Unknown on line 0
I've already resolved the initial issue of PHP not finding my extension so it's not a path style problem.
I'm thinking that php4Delphi 7.2 may not support the latest PHP 5.3.6. Has anyone got this configuration working for them?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
PHP 尝试在内部加载模块并失败,你是对的。
问题不在于搜索路径,而在于使用 php4delphi 的非线程安全版本的 php。当 php 加载扩展时,它会从扩展 dll 接收一些回调函数列表,并使用它与 dll 进行通信。线程安全版本和非线程安全版本的 php 回调函数的参数列表是不同的。
php4delphi 是为 php 的线程安全模型而设计的。您可以在此处了解 TS 和 NTS 版本之间的区别:IIS Aid 。在这种特殊情况下,如果可能的话,我建议将非线程安全 PHP 更改为线程安全 PHP。
如果需要使用 NTS PHP,那么必须修改 php4delphi 的源代码,我认为在这种情况下需要进行大量更改。
PHP tries to load the module internally and fails, you are right.
The problem is not in the search path, but in the usage of the not thread safe version of php with php4delphi. When php loads an extension it receives the list of some call-back functions from the extension dll and use it for communicating with dll. The list of the parameters of the callback function for thread safe and not thread safe versions of php is different.
php4delphi was made for thread safe model of php. You can read what is the difference between TS and NTS versions here: IIS Aid. In this particular case I would recommend to change the not thread safe PHP to thread safe PHP, if possible.
If the usage of NTS PHP is a requirement, then the source code of php4delphi must be adapted and I think in this case a lot of changes are needed.
我刚刚用 PHP 5.3.6 做了 php4delphi 7.2 的测试,但是线程安全版本和扩展已按预期加载。我认为只有当您从命令行使用 php.exe 运行脚本时才可以使用 NTS 版本,而不是当您使用 IIS 时。
无论如何,我也会用NTS版本进行测试,然后让你知道结果。
I just did the test of php4delphi 7.2 with PHP 5.3.6, but the thread-safe version and the extension was loaded as expected. I think you can use NTS version only if you run your script using php.exe from the command line, not when you use IIS.
Anyway, I will do the test with NTS version as well and let you know about the result.
对我来说,PHP 本身(而不是 delphiphp)试图在内部加载模块,但失败了。
可能是它在 loadlibrary() 的 PATH 中搜索 DLL,但找到的是 64 位 DLL,而不是 32 位 DLL。最好首先在 32 位 Windows 系统上尝试此设置。
PS 显然我从“program files (x86)”得到的64位系统指示
To me it looks like PHP itself (and not delphiphp) tries to load a module internally and that fails.
It could be that it searches for DLLs in the PATH to loadlibrary() but finds 64-bit DLLs instead of 32-bit DLLs. Best first try this setup on a 32-bit Windows system.
P.s. the 64-bit system indication I get from "program files (x86)" obviously