我正在使用Ubuntu 12.04 LTS,需要PHP 5.4,所以我使用Ondřej Surý的(php5-oldstable)包。
phpinfo 和 CLI 都显示启用了 JSON:
#php -i | grep -i json
json
json support => enabled
json version => 1.2.1
我的应用程序大部分工作。但是定期(大约十分之一的页面刷新)会出现PHP错误。这只会间歇性地发生。
PHP Startup: Unable to load dynamic library '/usr/lib/php5/20100525+lfs/json.so'
- /usr/lib/php5/20100525+lfs/json.so: cannot open shared object file:
No such file or directory "json.so"
我该如何解决这个问题?
可能的罪魁祸首(正如我在电子邮件中回答的那样)是您正在从配置文件的某个地方加载 json 扩展。
JSON 扩展是在 PHP 5.4 的核心中编译的,因此您不应手动加载它。
请检查您是否没有:
json.ini
先前 PHP 5.5 安装遗留下来的/etc/php5/{mods-available}
中的某个地方您没有从提到的脚本加载 JSON 扩展,例如没有 dl(
json.so
)。确保在更改主要版本时已停止并启动 Apache2(同样适用于
php5-fpm
)。 症状可能表明,从包加载的以前的 PHP 中有一些卡住的 Apache2 线程(在这种情况下,这将是带有基于json-c
JSON 扩展的 PHP 5.5)。
既然你说 json 扩展被加载到 phpinfo()
的输出中,你可能正在处理一个错误。您是否检查过模块文件是否确实存在于文件系统中?
您有以下选项:
- 使用 Apache 2.4 从源代码编译 PHP 5.4
- 升级到同一存储库的稳定版本,这将为您提供PHP 5.5 + Apache 2.4。
- 在 Ubuntu 的 PPA 中使用 Ondrej 提交一个错误,并等待它得到解决。
有关更多信息,请查看 debphp 网站。
提交错误是必须的,因为如果它是真实的错误,则必须为所有用户修复。如果您不与迁移指南(如向后兼容性、已弃用的功能等)冲突,则可以首先使用选项 2。所以检查一下并决定。
它也因您必须执行此操作的机器而异。如果它是关键的生产服务器,您可能不希望在其上编译更改版本。去归档这个错误,看看软件包维护者对此有什么看法。
另外,当您的问题得到解决时,请在此处写回复。我很好奇它是什么,希望是什么。:D
一点不能诊断或解决问题(似乎指的是 PHP 5.5),但可能有助于追踪其根本原因:
- 这份 Debian 错误报告和 Phil Sturgeon 的博客解释说,一些 Linux 发行版选择用嵌入式兼容的 pecl-json-c 替换 ext/json 的官方 PHP 实现。理由是 Douglas Crockford 的实现在许可证中包含非自由条款("软件应用于善,而不是恶")。另请参阅此博客文章。