这是我遇到的情况...我有一家供应商提供的库,该供应商将加密/解密作为我们使用的产品的一部分(不知道它是如何工作的)。我构建了一个 PHP 扩展,一切都通过 CLI 运行得非常出色。这是我为 PHP 扩展编写的 raptor.c 文件:
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
//#if HAVE_LIBRAPTOR
#include "php_raptor.h"
#include "raptor.h"
#include "ext/standard/info.h"
/* If you declare any globals in php_raptor.h uncomment this:
ZEND_DECLARE_MODULE_GLOBALS(raptor)
*/
/* True global resources - no need for thread safety here */
static int le_raptor;
/* {{{ raptor_functions[]
*
* Every user visible function must have an entry in raptor_functions[].
*/
const zend_function_entry raptor_functions[] = {
PHP_FE(raptor_decNK, NULL)
PHP_FE(raptor_encNK, NULL)
{NULL, NULL, NULL} /* Must be the last line in raptor_functions[] */
};
/* }}} */
/* {{{ raptor_module_entry
*/
zend_module_entry raptor_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
"raptor",
raptor_functions,
NULL,
NULL,
NULL,
NULL,
PHP_MINFO(raptor),
#if ZEND_MODULE_API_NO >= 20010901
"0.1", /* Replace with version number for your extension */
#endif
STANDARD_MODULE_PROPERTIES
};
/* }}} */
#ifdef COMPILE_DL_RAPTOR
ZEND_GET_MODULE(raptor)
#endif
/* {{{ PHP_MINFO_FUNCTION
*/
PHP_MINFO_FUNCTION(raptor)
{
php_info_print_table_start();
php_info_print_table_header(2, "raptor API support", "enabled");
php_info_print_table_end();
}
/* }}} */
PHP_FUNCTION(raptor_decNK) {
char * enctext;
unsigned char * dectext;
int enctextsize;
size_t dectextsize;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &enctext, &enctextsize) == FAILURE) {
RETURN_NULL();
}
dectext = decNK((unsigned char *) enctext, (size_t) enctextsize, &dectextsize);
if (dectext == NULL) {
RETURN_FALSE;
} else {
RETURN_STRINGL((char *) dectext, dectextsize, 1);
}
}
PHP_FUNCTION(raptor_encNK) {
char * dectext;
unsigned char * enctext;
int dectextsize;
size_t enctextsize;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &dectext, &dectextsize) == FAILURE) {
RETURN_NULL();
}
enctext = encNK((unsigned char *) dectext, (size_t) dectextsize, &enctextsize);
if (enctext == NULL) {
RETURN_FALSE;
} else {
RETURN_STRINGL((char *) enctext, enctextsize, 1);
}
}
//#endif
以及供应商的 raptor.h 文件的适用部分:
unsigned char *decNK(unsigned char * s, size_t inLen, size_t * outLen);
unsigned char *encNK(unsigned char * s, size_t inLen, size_t * outLen);
我的 test.php 文件有非常简单的代码:
<?php
$x = 1;
echo "$x\n";
$y = raptor_encNK($x);
echo "$y\n";
$x = raptor_decNK($y);
echo "$x\n";
?>
我从 CLI 得到(输出 $y 每次运行都会改变,但最终输出总是正确的)
# /usr/local/bin/php -f /usr/local/var/htdocs/test.php
1
FL//haHZgltG
1
相同的代码通过浏览器获取(再次输出 $y 变化,最终输出总是垃圾)
1
TgPw72NF9Zby
<binary crap>
所以我想当它转到 Apache 时在翻译中丢失了一些东西......或者我搞砸了扩展并且无法弄清楚......或者两者兼而有之。我只是不明白为什么它会通过 CLI 而不是通过 Apache 工作。
最佳答案
所以最后这不是 size_t 的问题,而是他们代码中整数的大小。关于它在 CLI 调用时与使用 Apache 和 Web 浏览器调用时为什么起作用仍然存在大量混淆......我可能永远不会找到。
关于通过 CLI 的 PHP 扩展有效,但不能通过 apache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7896393/
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
从MB升级到新的MBP后,Apple的迁移助手没有移动我的gem。我这次是通过macports安装rubygems,希望在下次升级时避免这种情况。有什么我应该注意的陷阱吗? 最佳答案 如果你想把你的gems安装在你的主目录中(在传输过程中应该复制过来,作为一个附带的好处,会让你以你自己的身份运行geminstall,而不是root),将gemhome:键设置为您在~/.gemrc中的主目录中的路径. 关于通过MacPorts的RubyGems是个好主意吗?,我们在StackOverf
当我执行>rvminstall1.9.2时一切顺利。然后我做>rvmuse1.9.2也很顺利。但是当涉及到ruby-v时..sam@sjones:~$rvminstall1.9.2/home/sam/.rvm/rubies/ruby-1.9.2-p136,thismaytakeawhiledependingonyourcpu(s)...ruby-1.9.2-p136-#fetchingruby-1.9.2-p136-#downloadingruby-1.9.2-p136,thismaytakeawhiledependingonyourconnection...%Total%Rece