我有一台使用 Apache 中的 mod_php 运行 PHP 的服务器。Apache 使用的是 Prefork MPM。由于使用旧版本的 CURL,我遇到了一些 SSL 错误。
我运行了命令“sudo yum update curl”。
它成功更新了 curl,但我注意到我仍然会间歇性地收到 SSL 错误。只需重新启动 Apache 即可解决此问题。
所以我的两个问题是..
为什么需要重新启动 apache?即 php.ini 没有被修改(除非 yum 在后台执行了此操作)?
为什么 SSL 错误只是间歇性地发生?即为什么直到 apache 重新启动它才起作用?
答案1
首先,这个问题与 Linux 中的共享库高度相关(而且不仅仅如此),而且您不知道它是如何工作的。如果您想在商业环境中工作,这是必备知识,正如本网站所建议的那样,因此我强烈建议您继续了解您的工作。
因为您使用 mod_php,这意味着 PHP 代码在 Apache 进程内解释。共享库通常在进程启动时加载,因此除非您重新启动它,否则它当然会继续使用旧库(想象一下,如果不这样做,它会有多乱,因为它从以前的库中知道所有这些函数指针!)。
根据您提供的信息,我假设您正在使用 prefork MPM 运行 Apache。这意味着 Apache 根据其拥有的算法和您在配置文件中提供的某些参数“时不时”生成进程。现在,分叉的进程继承了生成它们的进程的内存(实际上是使用 CoW 复制的)。这包括已加载的所有共享库。我猜想 PHP 正在延迟初始化,当每个分叉的进程第一次需要它时,或者类似这样。当您的请求最终到达在 CURL 更新之前生成的进程时,您会收到错误。当您的请求最终到达在 CURL 更新之后生成的进程时,您不会收到错误,因为该进程中的 PHP 引擎加载了新的 CURL 库。
更新库时,一个好的做法是确保重新启动所有使用它的服务,以避免这种麻烦。