【问题标题】:How to track down PHP script running a given process?如何跟踪运行给定进程的 PHP 脚本?
【发布时间】:2012-06-30 10:37:22
【问题描述】:

我有一个网站,其中包含在 VPS 托管服务上运行的自定义脚本。 所有脚本都通过 index.php 使用 mod_rewrite 和 .htaccess 来获取友好的 URL

我的脚本中的某些内容正在产生高 CPU 使用率,如下所示:

当我去strace 一个给定的进程时,我得到了这个我不明白的:

    setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={90, 0}}, NULL) = 0
    rt_sigaction(SIGPROF, {0x7a6b8f, [PROF], SA_RESTORER|SA_RESTART, 0x2af8ae8742f0}, {0x7a6b8f, [PROF],    SA_RESTORER|SA_RESTART, 0x2af8ae8742f0}, 8) = 0
    rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0

这在无限循环中不断重复。

我需要知道的是如何追踪导致此问题的确切 PHP 脚本。有什么建议吗?

【问题讨论】:

  • 启用错误记录。设置最大执行时间。查看脚本行为异常的错误日志。可能会创建您自己的错误处理程序,以便在触发超时错误时转储请求详细信息,因此您可以开始使用远程调试器重现此问题。
  • 您使用的是哪个 API? CGI?

标签: php process strace pid


【解决方案1】:

在您的脚本中使用 getmypid() 函数。只需将其输出到日志文件或其他内容即可查看哪个脚本是哪个。

编辑: 使用 auto_prepend_file 配置设置自动将此 sn-p 包含在所有文件中:

php_value auto_prepend_file append.php

【讨论】:

  • 他当然没有。我假设他正试图通过调试他的脚本来解决这个问题。他没有说他不能编辑他的剧本。我建议 OP 编辑​​他的脚本,以记录每个脚本使用什么 PID 来帮助他的追踪工作。
  • 所以你建议他将它添加到每个 PHP 文件中?好的。我想我明白你的意思了。如果他将每个脚本都记录在__FILE__ getmypid() 那么这是一个有效的答案。
  • 正确。他可以使用 auto_prepend_file 设置将其包含在他的所有文件中。
  • 我现在和你在一起。很抱歉一开始有误会!
  • @davidethell 起初我认为那是无稽之谈,但通过您的编辑,它变得非常有意义。虽然我仍然只在我的日志中获取 index.php,因为所有 php 文件都被 require_once 调用或包含通过 index.php 我使用 getmypid() 来登录 pid 和 $_SERVER['SCRIPT_FILENAME'] 来登录 php 文件。您是否建议任何其他函数来获取确切的脚本名称,因为 $_SERVER['SCRIPT_FILENAME'] = index.php 一直
【解决方案2】:

如果您可以将the PECL proctitle package 安装到您的PHP 安装中,您可以使用它来使index.php 将其进程标题设置为它传递给的脚本的名称。 (更改后的流程标题可能会或可能不会出现在特定的流程表可视化工具中;如果所有其他方法都失败,请使用 ps。)

【讨论】:

  • @chaos 我怎么知道我的主机是否可用?如果没有,我如何安装它,如果安装了..我如何使用它?
  • <?php phpinfo(); ?> 应该显示所有已安装的 PHP 模块。 pecl install proctitle 应该安装提到的包乱码。 See the PECL docs for more info
猜你喜欢
  • 2015-12-30
  • 2021-11-22
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多