PHP 间歇性地无法加载 json.so(Ubuntu 12.04 LTS 上的 PHP 5.4.19)


PHP intermittently unable to load json.so (PHP 5.4.19 on Ubuntu 12.04 LTS)

我正在使用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 的核心中编译的,因此您不应手动加载它。

请检查您是否没有:

  1. json.ini先前 PHP 5.5 安装遗留下来的/etc/php5/{mods-available}中的某个地方

  2. 您没有从提到的脚本加载 JSON 扩展,例如没有 dl( json.so )。

  3. 确保在更改主要版本时已停止并启动 Apache2(同样适用于 php5-fpm)。 症状可能表明,从包加载的以前的 PHP 中有一些卡住的 Apache2 线程(在这种情况下,这将是带有基于 json-c JSON 扩展的 PHP 5.5)。

既然你说 json 扩展被加载到 phpinfo() 的输出中,你可能正在处理一个错误。您是否检查过模块文件是否确实存在于文件系统中?

您有以下选项:

  1. 使用 Apache 2.4 从源代码编译 PHP 5.4
  2. 升级到同一存储库的稳定版本,这将为您提供PHP 5.5 + Apache 2.4。
  3. 在 Ubuntu 的 PPA 中使用 Ondrej 提交一个错误,并等待它得到解决。

有关更多信息,请查看 debphp 网站。

提交错误是必须的,因为如果它是真实的错误,则必须为所有用户修复。如果您不与迁移指南(如向后兼容性、已弃用的功能等)冲突,则可以首先使用选项 2。所以检查一下并决定。

它也因您必须执行此操作的机器而异。如果它是关键的生产服务器,您可能不希望在其上编译更改版本。去归档这个错误,看看软件包维护者对此有什么看法。

另外,当您的问题得到解决时,请在此处写回复。我很好奇它是什么,希望是什么。:D

一点不能诊断或解决问题(似乎指的是 PHP 5.5),但可能有助于追踪其根本原因:

  • 这份 Debian 错误报告和 Phil Sturgeon 的博客解释说,一些 Linux 发行版选择用嵌入式兼容的 pecl-json-c 替换 ext/json 的官方 PHP 实现。理由是 Douglas Crockford 的实现在许可证中包含非自由条款("软件应用于善,而不是恶")。另请参阅此博客文章。