为PHP创建可加载的DLL模块扩展的第一步是什么,以便在Windows上为我自己的库创建本机支持?
是否需要在Windows上重新编译PHP?需要什么工具?我不想使用exec和命令行.
我正在尝试从我的Windows X64开发机器上的php(5.2.x)脚本向RabbitMQ发布消息.
问题是我没有找到任何PHP的DLL扩展.我的同事实际上正在尝试构建它(参见.如何使用cygwin/mingw在Windows上编译PHP扩展?),但没有成功:(.
有谁知道我在哪里可以找到php(5.2.x)的有效/工作RabbitMQ dll扩展?或者,如果某人有经验正确而迅速地做到这一点肯定会非常有帮助.
一些php wamp/lamp包附带php扩展,如php_amf,php_db,php_gd2,我只需要激活扩展,或者如果默认情况下没有安装扩展.
我的问题一般是,这些扩展如何与图书馆不同?具体而言我想知道,扩展是否可以变成一个加载到项目本身的库?目标是调用库而无需像php扩展需要的特殊安装.有时,当您使用共享主机时,您没有足够的权限来安装新的扩展.
我试图创建一些PHP扩展.
对于第一个我编php 5.3.6带--enable-debug --enable-maintainer-zts.然后我停止了我的扩展并使用标准程序
phpize
./configure --with-EXTNAME
make
Run Code Online (Sandbox Code Playgroud)
然后复制extname.so到我的php扩展目录,并进行更改php.ini
当我尝试从cli使用php时出现错误
Unable to initialize module
Module compiled with build ID=API20090626,NTS
PHP compiled with build ID=API20090626,TS,debug
Run Code Online (Sandbox Code Playgroud)
当我尝试
./configure --enable-debug --enable-maintainer-zts
Run Code Online (Sandbox Code Playgroud)
对于扩展,我收到警告,配置脚本无法识别这些选项.
那么,我如何编译我的扩展以使用PHP编译我上面描述的选项编译而无需重新编译php本身?
我想在PHP扩展中创建并返回一个数组数组.根据我的理解,我应该使用数组元素分配空间emalloc(),但我不明白的是什么时候适合释放它.我有一个类似于这个的PHP函数:
PHP_FUNCTION(test)
{
int i;
zval **pt = emalloc(sizeof(zval*) * 10);
array_init(return_value);
for (i = 0; i < 10; ++i) {
MAKE_STD_ZVAL(pt[i]);
array_init(pt[i]);
add_index_double(pt[i], 0, 1);
add_index_zval(return_value, i, pt[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
我应该在哪里释放分配的内存pt?
我为djondb创建了一个扩展,它是一个C++库的包装器,我编译了它,可以从djondb网站下载,我不是PHP专家,我一直遇到一些问题.发布,主要是我意识到我需要为每个平台做每个编译并为每个平台创建一个安装程序,这很费时,我想要的是分享源代码并允许用户以最简单的方式安装它,
我已经尝试过的:
所以我现在停留在1和2种分发方式,分发使用C++以用户友好的方式创建并易于安装的PHP扩展的最佳方式是什么?
提前感谢,如果您对项目的结构方式或phpize/configure/make过程的完整说明有更多疑问,可以在https://github.com/djondb/djondb_phpext查看项目代码.
我有Windows 7 64位,PHP 5.4.3通过WAMP 2.2和imagick(ImageMagick-6.8.3-9-Q16-x64-dll.exe)安装.我试图从很多来源使用php的dread of imagick但是所有这些都在apache_error.log中给出了这个错误:
PHP Warning: PHP Startup: Unable to load dynamic library 'c:/wamp/bin/php/php5.4.3/ext/php_imagick.dll' - %1 is not a valid Win32 application.\r\n in Unknown on line 0
Run Code Online (Sandbox Code Playgroud)
有关如何解决这个问题的任何想法?
我已经按照以下步骤操作,http://bytehash.appspot.com/2012/02/Installing-imagick-for-php-in-windows-under-xampp我已经下载了想象力的dll文件,并将其添加到xampp/php/ext文件夹中并包含如下:extension=php_imagick_ts.dll.我还安装了imagemagick并且可以确认它已安装,因为我运行了以下命令:
C:\>convert -version
Version: ImageMagick 6.8.6-8 20
Copyright: Copyright (C) 1999-2
Features: DPC OpenMP
Delegates: bzlib djvu fftw font
ngo png ps tiff webp x xml zlib
Run Code Online (Sandbox Code Playgroud)
当我通过xampp控制面板重启apache时出现以下错误:
the procedure entry point php_checkuid_ex could not be located in the dynamic link library php5ts.dll
Run Code Online (Sandbox Code Playgroud)
并在以下错误消息后继续:
PHP Startup: Unable to load dynamic library "C:\xampp\php\ext\php_imagick_ts.dll" - The specified procedure could not be found
Run Code Online (Sandbox Code Playgroud)
如果在此消息之后我尝试复制并粘贴动态链接库位置 - C:\xampp\php\ext\php_imagick_ts.dll并将其粘贴到文档地址栏中,它会尝试打开文件
有没有人遇到这个错误?因为我在尝试安装msql3库或只是简单地取消注释php.ini文件中的一些其他扩展时遇到了同样的问题
任何建议都会很棒.谢谢
我安装了nginx,php,php-fpm,php-pecl-redis.所有这些都有效,但最后一个有效.
当我跑步时/usr/sbin/php-fpm,我得到了这个:
PHP警告:PHP启动:无法加载动态库'/usr/lib/php/modules/redis.so' - /usr/lib/php/modules/redis.so:未定义符号:第0行未知的igbinary_unserialize
我不知道"igbnary_unserialize"是什么意思以及如何解决它.
我检查了正确路径下的redis.so文件.我添加extension=redis.so到"php.ini"
php版本:5.3.3 phpredis版本:2.2.7
我正在学习PHP扩展编写,以便使一些旧的扩展与PHP 7一起工作.
我试图从http://devzone.zend.com/1435/wrapping-c-classes-in-a-php-extension/修改示例扩展,但在破坏自定义对象时它会导致段错误.所有其他功能正常工作.(在我的代码中,汽车被BDict取代.)
这是我的代码:
#define Z_BDICT_OBJ_P(zv) php_bdict_object_fetch_object(Z_OBJ_P(zv))
zend_object_handlers bdict_object_handlers;
typedef struct _bdict_object {
BDict *bdict_data;
zend_object std;
} bdict_object;
zend_class_entry *bdict_ce;
static void bdict_free_storage(zend_object *object TSRMLS_DC)
{
bdict_object *intern = (bdict_object *)object;
// ***Both the following two lines will cause segfault***
delete intern->bdict_data;
zend_object_std_dtor(&intern->std TSRMLS_CC);
}
zend_object * bdict_object_new(zend_class_entry *ce TSRMLS_DC)
{
bdict_object *intern = (bdict_object *)ecalloc(1,
sizeof(bdict_object) +
zend_object_properties_size(ce));
zend_object_std_init(&intern->std, ce TSRMLS_CC);
object_properties_init(&intern->std, ce);
intern->std.handlers = &bdict_object_handlers;
return &intern->std;
}
static inline bdict_object * php_bdict_object_fetch_object(zend_object *obj)
{ …Run Code Online (Sandbox Code Playgroud)