我正在尝试调试为什么我的 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 利用率有何关系,但回答了 hosts
和 resolv.conf
问题。
关于php - strace 为 php 文件返回大量打开的 ("/etc/hosts"、 O_RDONLY|O_CLOEXEC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21317992/