如何优化 PHP 代码以上传 SQL 转储



我正在使用下面的代码来创建和迁移表,虽然它可以工作,但它非常慢。大约需要 10 分钟才能完成创建大约 250 个表并迁移数据。转储的总文件大小为 ~1 Mb。 请注意,这是在本地主机上,当部署到网络不可靠的服务器时,恐怕需要 5 倍的时间。

是否可以将此代码优化为在 30 秒内运行?

function uploadSQL ( $myDbName ) {
$host = "localhost";
$uname = "username";
$pass = "password";
$database = $myDbName; 
$conn = new mysqli($host, $uname, $pass, $database);
$filename = 'db.sql'; 
$op_data = '';
$lines = file($filename);
foreach ($lines as $line)
{
if (substr($line, 0, 2) == '--' || $line == '')
{
continue;
}
$op_data .= $line;
if (substr(trim($line), -1, 1) == ';')
{
$conn->query($op_data);
$op_data = '';
}
}
echo "Table Created Inside " . $database . " Database.......";
}

您可以使用 cron 作业自动完成此过程,而无需等待。有时,此过程因 PHP 执行超时而失败。

为了增加 php 中的执行超时,您需要更改 php 中的一些设置.ini:

max_execution_time = 60
; also, higher if you must - sets the maximum time in seconds

问题是 - 这个问题不应该用 PHP 问,而是用数据库问。 在导入过程中,会重建索引,检查外键等,这是导入实际上需要花费大量时间的地方,具体取决于数据库结构。 除此之外,硬件可能有故障(即,如果数据库在 HDD 上,导入将比在 SSD 驱动器上花费明显更多的时间(。 我建议先查看 mysqltuner.pl 结果,然后从那里开始优化数据库。也许在SO中发布一个关于如何改进数据库的问题(当然是一个单独的问题(

在导入之前禁用 SET FOREIGN_KEY_CHECKS=0,然后在导入后使用 SET FOREIGN_KEY_CHECKS=1 启用它可能会有所帮助,但它不会执行您可以执行的所有优化。

如果你只是想安排任务,这样你就不必等待数据库导入完成,你需要实现一个任务队列(即在数据库表中(并通过 crontab 处理你的队列,就像 Muyin 建议的那样。

如果转储来自mysqldump,那么根本不要使用 PHP。 只需做

mysql -h host.name -u ... -p... < dump_file.sql

最新更新