背景
最近我将php升级到5.5版本。在此升级模块中,json 已从 php5 包移出到新包 php5-json 中。所以我安装了它。
现在与 firephp (和 firebug)的连接。
在发送之前,firephp::log 使用 json_encode 对变量进行编码。
json_encode 可能会出现问题。 json_encode 可能无法对输入变量进行编码。这可能发生在具有未编码的 unicode 的字符串或具有某些错误编码字符的字符串中。
以前版本的 php 中的行为
- 在 Firebug 中,出现的不是带有错误编码的值,而是空白。
- 在错误值之后,Firebug 继续显示从 firephp 到达的下一个值。
单独 php5-json 的行为
- 当错误的编码值到达 firebug 时,会出现以下错误消息:
SyntaxError:JSON.parse:意外字符
chrome://firephp/content/lib/renderer.js
第 159 行 - 在此列表之后,来自 firephp 的日志将停止。
问题
我知道有一个“意想不到的人物”。但我想继续看以下消息。不会在第一个意外字符处停止。
我该怎么做才能解决这个问题?或者至少回到之前的状态?
软件版本:
- Debian 测试杰西
- Linux 主机 3.10-2-amd64 #1 SMP Debian 3.10.5-1 (2013-08-07) x86_64 GNU/Linux
- PHP5 5.5.1+dfsg-2
- php5-json 1.3.1+dfsg-1
- 冰鼬22.0
- FirePHPCore-0.3.2
- 萤火虫1.11.4
- Firephp 0.7.2
编辑:
我还可以在 Firebug 标头 X-Wf-1-1-1-2 中看到:
[{“类型”:“LOG”,“标签”:“$someVar”,“文件”:“/home/GIT/www/some/path/someFile.php”,“行”:“156”},]
哪个做错过价值部分,因此是无效的 JSON,这就是渲染失败的原因。
打印出包含正确消息的标头:
[{“类型”:“日志”,“标签”:“POST数据”,“文件”:“/home/GIT/www/some/path/someFile.php”,“行”:“22”},{ “数据”:{“myarray”:[“117”]},“getA”:“true”,“getB”:“true”}]
编辑2:
我将此作为 Debian 中的错误提交719942。不过好像没人愿意看:-(
答案1
背景:
有一个许可冲突Linux 发行版中的一个子句克罗克福德的 执照其中指出:
本软件应用于善良而非邪恶。
这不符合自由软件基金会 (FSF) 的自由 0:
出于任何目的自由运行程序。(来源)
解决方案应该是一个新编写的库pecl-json-c打包为 php5-json。新使用的json库好像不兼容火力PHP。但如果您使用软件是为了行善,而不是为了作恶,您可能需要恢复原始的 Crockford 库。
恢复克罗克福德图书馆的步骤
1)获取原件json 1.2.1库并解压它。
2)安装sudo apt-get install php5-dev
自带phpize
工具的php5-dev(Debian中)。 (来源:如何创建 PHP 扩展)。
3) 作为雅采克建议您需要将出现的一次function_entry
in替换json.c
为zend_function_entry
。
4) 作为星星建议您需要在 file 中的三个位置替换ZVAL_DELREF
为。 5)然后将目录更改为 json-1.2.1 并运行Z_DELREF_P
JSON_parser.c
phpize
./configure
make
6) 不幸的是,你无法删除 php5-json 包,因为它会带走整个 php.ini 文件。相反,您需要找到库 json.so (dpkg -L php5-json | grep json.so
就可以了)。
7) 作为 root,将 Remi 的 json.so 替换为刚刚编译的 Crockford 的 json.so。
缺点
随着 php5-json 的下一次升级,您将恢复 Remi 的库。
您现在使用的是非自由软件。
你正在搞乱你的系统。
有人声称 Remi 的库有更多功能,这可能是真的,因为 Crockford 的库是 2005 年的。