从php内部访问php状态信息

时间:2018-02-22 19:02:34

标签: php fpm

php-fpm为感兴趣的人提供状态页面。它看起来像这样:

curl http://localhost/server-status
pool: default
process manager: dynamic
start time: 11/Dec/2014:17:51:33 -0500
start since: 61383
accepted conn: 4682
listen queue: 0
max listen queue: 0
listen queue len: 0
idle processes: 11
active processes: 1
total processes: 12
max active processes: 2
max children reached: 0
slow requests: 3

如何从php访问此信息?请不要告诉我使用curl从localhost请求状态页面。

2 个答案:

答案 0 :(得分:1)

不幸的是,来自FPM的server-status不是PHP机制。你无法通过内部PHP机制获得它。

达到此目的的唯一方法是使用某种连接机制来fpm服务器本身。

  1. 您可以通过使用CURLfile_get_contents()或从网址获取数据的任何其他机制从网址获取信息来获取该信息。

  2. 您可以使用以下参数连接本地套接字和shell exec:

  3. (shell代码)

    SCRIPT_NAME=/status \
    SCRIPT_FILENAME=/status \
    REQUEST_METHOD=GET \
    cgi-fcgi -bind -connect /var/run/php-fpm/www.sock
    
    1. 您可以使用某种类型的套接字与参数连接。我还没试过,但是一个好的起点就在这里:https://github.com/wizaplace/php-fpm-status-cli
    2. 可能如果你变得非常顽固,你可以找到另一种创造性的方式,但是他们中的任何一个都是将它作为PHP-FPM的内部机制。

答案 1 :(得分:0)

在ubuntu中,我能够通过此

访问PHP-FPM状态页面
Primary script unknown
Status: 404 Not Found
Content-type: text/html; charset=UTF-8

File not found.

注意:运行上述命令时可能会发现错误,例如

pm.status_path = /status

如果您收到此错误,请确保在pool.d/www.conf中取消注释/etc/php/7.0/fpm/pool.d/www.conf

使用PHP 7的ubuntu 17.04中该配置文件的绝对路径为service php7.0-fpm restart,行号为232

编辑conf文件后,使用exec( 'SCRIPT_NAME=/status SCRIPT_FILENAME=/status REQUEST_METHOD=GET cgi-fcgi -bind -connect /var/run/php/php7.0-fpm.sock', $php_fpm_status ); // Above statement will assign an array to $php_fpm_status filled with every line of output from the command, make it as whole string $php_fpm_status = implode(PHP_EOL, $php_fpm_status); // You can try printing php-fpm status echo $php_fpm_status;

重新启动fpm

通过PHP SCRIPT获取

您可以通过使用exec()

的php运行上述命令来获取php-fpm状态的输出
[Route("api/[controller]")]
   public class PasswordController : Controller
   {
       private readonly AppSettings _options;

       public PasswordController(IOptions<AppSettings> optionsAccessor)
       {
           _options = optionsAccessor.Value;

       }

       [HttpGet]
       //this isnt returning anything...
       public IActionResult Get([FromQuery]string emp)
       {
           var x = HttpContext.Request.Query["emp"].ToString();
               Response.Headers.Add("x-emp-name", x);

           return Json(_options.ClientSettings);
       }