【问题标题】:PHP Fatal error: require(): unable to unlock pthread lockPHP 致命错误:require():无法解锁 pthread 锁
【发布时间】:2012-11-09 21:00:49
【问题描述】:

我在 Debian Linux 上使用 LAMP。 Apache 2.2.22-12,PHP 5.4.4。

有时我收到此错误,然后我无法重新加载页面或打开页面,其中包括带有此错误的文件。出现此类错误后,我无法重新启动 apache

重新启动网络服务器:apache2(98)地址已在使用中:make_sock:无法绑定到地址 [::]:80

(98)地址已在使用中:make_sock:无法绑定到地址 0.0.0.0:80 没有可用的监听套接字,正在关闭

无法打开日志

动作“开始”失败。

Apache 错误日志可能包含更多信息。 失败!

在 apache 日志文件中:

[Wed Nov 21 15:07:55 2012] [warn] 子进程 4020 仍然没有退出,发送一个 SIGTERM

[Wed Nov 21 15:07:55 2012] [warn] 子进程 4021 仍然没有退出,发送一个 SIGTERM

[Wed Nov 21 15:07:55 2012] [warn] 子进程 4022 仍然没有退出,发送一个 SIGTERM

[Wed Nov 21 15:07:57 2012] [error] 子进程 1309 仍然没有退出,发送 SIGKILL

[Wed Nov 21 15:07:57 2012] [error] 子进程 1310 仍然没有退出,发送 SIGKILL

[Wed Nov 21 15:07:57 2012] [error] 子进程 1311 仍然没有退出,发送一个 SIGKILL

和主机日志:

[2012 年 11 月 21 日星期三 12:21:24] [错误] [客户端 127.0.0.1] PHP 致命错误:require():无法解锁 ~/www/yii/yii-1.1.11.58da45/ 中的 pthread 锁framework/base/CApplication.php 第 127 行

$config=require($config);

或者:

[2012 年 11 月 14 日星期三 21:04:26] [错误] [客户端 127.0.0.1] PHP 致命错误:require_once():无法在 ~/projects/politiya/index.php 第 14 行解锁 pthread 锁

有:

require_once($game_loader);

我已经删除了 php-apc,现在 lamp 工作正常。

【问题讨论】:

  • 某事锁定了 apache 子节点,阻止它退出,并阻止 apache 重新启动/重新绑定到端口 80,因为来自前一个实例的子节点仍被绑定。没有任何代码,我们无法为您提供帮助。
  • 这个错误可以链接到任何带有 php-require 的行
  • define("GAME_PATH", dirname(__FILE__) . DIRECTORY_SEPARATOR . 'game'); define("ENGINE_PATH", dirname(__FILE__) . DIRECTORY_SEPARATOR . 'engine'); $config = ENGINE_PATH . '/config/game.php'; $game_loader = ENGINE_PATH . '/loader.php';
  • 看起来像是与 apc 相关的东西。您的确切错误消息显示在此处:uni-jena.de/bin/tool/APC/APC/apc_pthreadmutex.c
  • 所以,出现这个错误后启动 apache 的唯一方法就是重启所有系统,这不是很好

标签: php apache apache2


【解决方案1】:

修复

正如here所提到的,我不得不快速卸载并重新安装apc(字面意思是5s):

1 sudo pecl uninstall apc

2 sudo pecl install apc

BUT 将已为 pthread 互斥锁填充的 no 更改为 yes

AND将已经为pthread读/写锁填写的yes更改为no

【讨论】:

  • 谢谢,它适用于 APC 3.1.13。我以前有很多死锁,现在没有了。
【解决方案2】:

由于 APC 中的“死锁错误”而发生此错误。 php bug report page 说,此错误已在 APC 3.1.8 中修复

我们还可以看到 APC 更改日志here

【讨论】:

    【解决方案3】:

    仅供参考(针对 OMG 关于 APC 版本错误的评论),我正在运行 APC 3.1.13 和 PHP 5.4.17,但我仍然遇到了错误:

    unable to obtain pthread lock (EDEADLK)
    

    【讨论】:

    • 我遇到了同样的问题,这对于 APC 3.1.13 是可修复的,请参阅答案 here
    【解决方案4】:

    这意味着一些正在运行的进程正在使用此端口,因此请尝试终止该进程

    喜欢获取过程

    例如:ps -ef | grep httpd

    然后杀死进程

    例如 kill -9 进程 ID

    -----------或----------

    80 端口被另一个服务使用,因此找到并更改 system-config-httpd.conf:system-config-httpd.conf system-config-httpd.conf。所有这一切,重新启动httpd: /etc/init.d/httpd 启动

    【讨论】:

      猜你喜欢
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 2016-07-24
      • 2015-02-16
      • 2011-07-24
      相关资源
      最近更新 更多