我最近开始考虑编写PHP扩展,并阅读了本文,其中介绍了使用C++构建扩展的起点.当我开始定制时,我遇到了一些试图将一些功能拆分成单独文件的故障.一切都编译和链接没有问题,但当我尝试实际使用扩展时发生错误.确切的信息是:
$ php -dextension=test.so -r "var_dump( new Test );"
php: symbol lookup error: /etc/php/ext/test.so: undefined symbol: _ZN9ContainerI4TestEC1EP17_zend_class_entry
Run Code Online (Sandbox Code Playgroud)
我在两台计算机上试过这个并且都遇到了同样的问题.我知道它找不到Container构造函数的实际实现,但我不知道如何让它在正确的位置查找.
在发布这里之前,我已经尝试尽可能多地减少了绒毛,但是在php界面代码中还有很多瑕疵.代码如下:
config.m4中:
PHP_ARG_ENABLE(test,
[Whether to enable the "test" extension],
[ --enable-test Enable "test" extension support])
if test $PHP_TEST != "no"; then
PHP_REQUIRE_CXX()
PHP_SUBST(TEST_SHARED_LIBADD)
PHP_ADD_LIBRARY(stdc++, 1, TEST_SHARED_LIBADD)
PHP_NEW_EXTENSION(test, interface.cpp internals.cpp, $ext_shared)
fi
Run Code Online (Sandbox Code Playgroud)
interface.h:
#ifndef INTERFACE_H_
#define INTERFACE_H_
#define PHP_TEST_EXTNAME "test"
#define PHP_TEST_EXTVER "0.1"
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
interface.cpp:
#include "interface.h"
#include "internals.h"
#include "php.h"
class Test {};
extern zend_module_entry …Run Code Online (Sandbox Code Playgroud) 我想webpay在我当地设置
webpay扩展名php.ini然后我尝试执行test.php它显示以下错误:
--------error while opening file [libwebpayclient.so]--------
<html>
<p> Starting webpay Transaction </p>
wrap_newBundle not available
Run Code Online (Sandbox Code Playgroud)
任何的想法?
首先,我不是程序员.我是一名网络管理员,他被要求为启用了SSH2的网页设计师编译PHP.
我一直在按照这个步骤编译PHP for Windows:https: //wiki.php.net/internals/windows/stepbystepbuild
要编译,我正在使用:Microsoft Visual C++ Studio 2008 Express Microsoft Windows SDK 6.1
我已经下载了SSH2所需的所有必需的库和库.我已经提取并将它们放在'deps'文件夹中.我还下载了SSH2扩展代码并将其放在我在'x86'目录中创建的'pecl'文件夹中.
看起来编译器没有找到我添加的库.任何帮助将不胜感激!谢谢!
以下是尝试使用以下命令进行编译时出现的一些错误:
C:\php-sdk\php53dev\vc9\x86\php5.3-201107071830>configure --enable-cli --with-ss
h2
Run Code Online (Sandbox Code Playgroud)
Checking for library libjpeg_a.lib;libjpeg.lib ... <not found>
WARNING: gd not enabled; libraries and headers not found
Checking for zlib.h ... <not found>
Checking for zlib.h ... <not found>
WARNING: zip not enabled; libraries and headers not found
Checking for library libiconv_a.lib ... <not found>
Checking for library libiconv.lib ... <not found>
Checking for library …Run Code Online (Sandbox Code Playgroud) 我在apache2中有一个带有php5的debian服务器,我想使用soap扩展.
我安装了soap扩展# sudo apt-get install php-soap,
我修改了php.ini extension=php_soap.so
并重置了apache.
但我检查phpinfo和肥皂扩展不在phpinfo.此外,我在服务器上搜索soap.so文件,它没有出现.
谢谢你,对不起我的英语
我正在开发一个PHP扩展,使用C.到目前为止,我正在研究正确的参数验证,从PHP用户空间传递给扩展的函数.
该宏ZEND_BEGIN_ARG_INFO_EX可用于向Zend Engine提供有关函数参数的信息.宏的第四个参数,命名为required_num_args,让引擎自动控制参数的数量,从而消除了这个麻烦.但是,我找不到让它工作的方法:引擎总是运行扩展的函数而没有任何警告,即使PHP脚本没有传递足够的参数.
这是我对函数参数的定义:
ZEND_BEGIN_ARG_INFO_EX(test_func_swt_arginfo, 0, 0, 3)
ZEND_ARG_INFO(1, firstArg)
ZEND_ARG_ARRAY_INFO(0, secondArg, true)
ZEND_ARG_OBJ_INFO(1, thirdArg, SomeClass, false)
ZEND_END_ARG_INFO()
Run Code Online (Sandbox Code Playgroud)
这是我对函数的定义,由PHP扩展导出:
static const zend_function_entry test_func_functions[] = {
PHP_FE(sample_with_types, test_func_swt_arginfo)
PHP_FE_END
};
Run Code Online (Sandbox Code Playgroud)
这是我的功能:
PHP_FUNCTION(sample_with_types)
{
RETURN_TRUE;
}
Run Code Online (Sandbox Code Playgroud)
这是我运行的PHP脚本:
<?php
sample_with_types();
Run Code Online (Sandbox Code Playgroud)
预期结果:PHP显示错误/警告/异常,例如"没有足够的参数传递给函数" ; 该功能不执行.
实际结果:函数执行并返回true.
如何正确配置函数参数结构,以便Zend Engine自动检查参数个数?或者我required_num_args在ZEND_BEGIN_ARG_INFO_EX宏观中误解了论证的目的?
所以我升级到OS X 10.9 Mavericks,我正在尝试再次设置我的本地开发环境.我xcode-select --install在这个线程中提到的运行,它让我成功编译扩展.我已经确认扩展名存在于/usr/lib/php/extensions/no-debug-non-zts-20100525我已添加extension=redis.so到我的php.ini文件中.
我没有看到任何与无法加载扩展相关的错误,并phpinfo()报告了预期的extension_dir并extension=redis.so在其输出中显示了a ,确认我确实将其放入正确的文件中.不幸的是,这是输出中唯一的"redis"痕迹phpinfo().
当我转到我的应用程序时,我收到错误:
Fatal error: Class 'Redis' not found in /Volumes/Storage/ty/Sites/audiomack/application/Bootstrap.php on line 95
我安装sudo pecl install redis了一次,手动下载phpredis zip并自己编译一次,结果相同.
PHP没有加载扩展的任何想法?
我得到一个似乎无关的奇怪警告,但我会提到它的完整性:在我设置的php.ini中date.timezone = America/New_York,但我的设置似乎被忽略了.PHP信息的"日期"部分仍将date.timezone显示为"无值",并向我发出了我们已经看过一百次的警告:
It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are …
很抱歉与另一个问题重复此问题.我无法解决我的问题.
我正在研究一个基于的项目Ratchet.我试图运行这个Push Integration例子.所以,为了运行,我应该使用composer来获得一些依赖.我创建一个composer.json文件,如下所示:
{
"autoload": {
"psr-0": {
"MyApp": "src"
}
},
"require": {
"cboden/ratchet": "0.3.*",
"react/zmq": "0.2.*|0.3.*"
}
}
Run Code Online (Sandbox Code Playgroud)
当我在其上执行composer时,出现以下错误:
Loading composer repositories with package information
Installing dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- react/zmq v0.3.0 requires ext-zmq * -> the requested PHP extension zmq is missing from your system.
- react/zmq v0.2.0 requires ext-zmq * -> the requested PHP extension zmq is missing …Run Code Online (Sandbox Code Playgroud) 我在PHP中加载了自定义C扩展,在扩展内部有一个函数做这样的事情
void a() {
printf("abc");
}
Run Code Online (Sandbox Code Playgroud)
我可以a()在CLI模式(命令行)中调用没有问题,abc并按预期获得输出.但是当我在PHP-FPM模式的Yii项目中再次尝试时,我无法获得该输出.
我确信的是:
ob_end_clean()在调用之前调用a()了两次,第一次调用return true,第二次调用返回false.所以我的问题是:
我应该从PHP-FPM模式的扩展中获得输出吗?
如果是这样,我如何捕获输出,或者请给我一些调试建议.
有没有一种方法可以捕获方法/函数调用并使用xdebug跟踪之类的php返回事件?
我尝试使用register_tick_function,但是我不太确定这是个好方法。
我也尝试做自己的php扩展(使用Zephir),但仍然是同样的问题。
顺便说一句,我不想使用xdebug扩展。最好的方法是什么?
php ×10
php-extension ×10
apache2 ×1
c ×1
c++ ×1
compilation ×1
composer-php ×1
interpreter ×1
php-ini ×1
soap ×1
ssh ×1
swig ×1
windows ×1
zephir ×1
zeromq ×1