php - strace 为 php 文件返回大量打开的 ("/etc/hosts"、 O_RDONLY|O_CLOEXEC)

标签 php mysql pdo strace

我正在尝试调试为什么我的 PHP 使用如此多的 CPU。

像这样运行 strace 后:

strace -e open,close php /scripName.php

它向我显示了它使用的所有文件,当我认为它到达了使用 MySql 连接的代码部分时,它会返回以下内容:

open("/etc/host.conf", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 3
close(3)                                = 0
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
open("/lib/i386-linux-gnu/libnss_dns.so.2", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 3
close(3)                                = 0
close(3)                                = 0
open("/usr/share/mysql/charsets/Index.xml", O_RDONLY|O_LARGEFILE) = 4
close(4)                                = 0
close(3)                                = 0
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 3
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 3
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 3
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 3
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0

还有很多更多

open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 3
close(3)                                = 0
close(3)                                = 0
close(3)                                = 0

实际上,每一个都花费了相当多的时间。

我尝试通过注释行来查明问题,直到这种情况不再发生,并且我到达了此类:

<?php
include_once 'config.php';

class db extends PDO {      
    public $dbtipo = DBTIPO;
    public $host = DBHOST;
    public $user = DBUSER;
    public $pass= DBPASS;
    public $db = DBNAME;

    function __construct(){
        $dns = $this->dbtipo.':host='.$this->host.";dbname=".$this->db;
        parent::__construct( $dns, $this->user, $this->pass ,
            array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    }
}
?>

如果我评论这一行:

parent::__construct( $dns, $this->user, $this->pass ,
            array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

这样就不会再发生了。

仅供引用,此类在另一个类中使用,如下所示:

public function getDataFromDb(){
    $connection = new db();
    $query = $connection->prepare("SELECT * FROM table");
    $query->execute();
    return $query;
}

常量在 config.php 文件中定义如下:

define('DBTIPO', 'mysql');
define('DBHOST', 'mysite.com');
define('DBUSER', 'user');
define('DBPASS', 'password');
define('DBNAME', 'database_name');

有什么想法吗?

最佳答案

主机需要将 mysite.com 解析为 IP 地址,因此它会在 /etc/hosts 中查找,可能找不到它,然后检查/etc/resolv.conf 用于用于解析的名称服务器,然后可能向这些名称服务器之一发出 DNS 查询。

取决于所需的操作,但如果 MySQL 服务器位于同一主机上,则使用 localhost。如果没有,则可以将其添加到 hosts 文件中。

不确定这与 CPU 利用率有何关系,但回答了 hostsresolv.conf 问题。

关于php - strace 为 php 文件返回大量打开的 ("/etc/hosts"、 O_RDONLY|O_CLOEXEC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21317992/

相关文章:

php - 查询以获取带或不带组连接的多行

c# - 将 nvarchar 值 ' undefined' 转换为数据类型 int 时转换失败

php - 使用 PDO 在 mysql 表中插入多个值

php - 如何制作可执行的phar?

php - cakePHP中的openID登录

php - 执行linux命令并将输出存储在php数组中

mysql - 无法连接到 targat 机器

mysql - Mysql + Percona 上的查询非常慢

php - 如何获取在 mysql 中使用 "REPLACE INTO"时受到影响的行的 ID

php - PDO fetchAll() 主键作为数组组键