gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:17:08 27 4
gpt4 key购买 nike

我正在尝试调试为什么我的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com