使用PHP / Joomla,我试图将数据库备份导出到CSV / sql文件中进行下载。有些表有大量的记录。当我开始导出时,它会出现以下错误: 致命错误:超过30秒的最长执行时间
注意:我不想使用'max_execution_time'或'set_time_limit()'或任何php.ini设置。因为我将在不同的客户端服务器上使用此脚本。我不会告诉每个客户更改设置。 我需要PHP / Joomla脚本,而不是任何扩展。
请帮帮我。
答案 0 :(得分:2)
鉴于您对我之前的回答的评论,我建议您考虑创建一个Joomla! CLI(查看Joomla 2.5+安装的/cli
目录)。
我们为您的Easystaging扩展程序的Pro版本做了类似的事情,我们为内部使用而开发,以管理具有特定内容审批流程的客户端网站。内部版本必须处理我们更大的客户要求。
有效地,我们创建了继承自JApplicationCli
的类,可以由CRON或我们的组件用户界面启动。
e.g。
class EasyStaging_PlanRunner extends JApplicationCli
{
/**
* Entry point for the plan funner (yes it's more fun)
*
* @return void
*
* @since 2.5
*/
public function doExecute()
{
}
}
如果用户从Joomla中启动它,我们使用实用程序方法来确保系统正确分叉:
/**
* Runs the script in the background by scheduling it with the `at` daemon and returns the result
*
* @param string $pathToScript A path to the script to run e.g. "/path/to/my/cli/app.php"
*
* @return int
*/
private function _runScriptInBackground($pathToScript)
{
$cmdPath = "/usr/bin/php -q $pathToScript";
// We need '2>&1' so we have something to pass back
$cmd = 'echo "' . $cmdPath . '" | at now 2>&1';
$result = shell_exec($cmd);
return $result;
}
由于它作为命令行脚本有效运行,因此许多限制都比较宽松,但它们仍然无法让你绕过一个非常大的表。 (我们的一些客户有数千篇文章或更糟糕的K2内容项目。)
为了解决这个问题,我们编写了一个从我们的doExecute()
主调度循环调用的导出方法,以合理的批次检索和导出表行。对于我们来说合理的是由远程数据库max_allowed_packet
确定的,我们创建一个SQL文件,其中包含符合此限制的语句,并允许各种开销很小。您可能没有这些问题,但即便如此,您可能应该将SQL分解为合理大小的insert
语句。
计划完成后,我们会压缩所有文件并将其发送到存档。
答案 1 :(得分:1)
由于某些表包含大量数据,因此需要相当长的时间。因此,连接将超时,导出将失败。
更好的方法是使用命令行将数据转储为SQL。您可能想查看mysqldump命令。
您也可以从这样的PHP脚本调用mysqldump命令 -
<?php
# Database Settings
$tmpDir = "/home/<username>/tmp/"; // Temp location the user has access to
$user = "<username>_******"; // MySQL Username for the database
$password = "*******"; // MySQL Password
$dbName = "<username>_******"; // Database name, usually in the pattern: <username>_<dbname>
$dbHost = "localhost"; // Mysql server hostname, usually localhost
$sqlFile = $tmpDir . $dbName . date('Y_m_d') . ".sql"; // The dumped SQL File
$attachment = $tmpDir . $dbName . "_" . date('Y_m_d') . ".tgz"; // TGZed file
$creatBackup = "mysqldump -h '" . $dbHost . "' -u '" . $user . "' --password='" . $password . "' '" . $dbName . "' > '" . $sqlFile . "'"; // Full command
$createZip = "tar cvzf $attachment $sqlFile"; // Full Command
// Execute 'em
system($creatBackup);
system($createZip);
这应该创建一个SQL转储并从中创建一个存档。
以上代码是我构建的工具的一部分,用于通过电子邮件向我发送数据库的每日备份。您可以在Github上查看并修改它以满足您的目的 - https://github.com/masnun/mysql-backup-to-email
答案 2 :(得分:0)
也许你甚至必须将每个表的记录拆分成不同的文件。
答案 3 :(得分:0)
我建议您使用Akeeba Backup而不是重新发明轮子,因为它将允许您创建整个站点的自动备份,或仅创建文件或特定目录,或仅创建数据库或特定表或者你能想到的任何组合。
它也是免费的。
It's won awards year after year, highly对Joomla Extension Directory进行了评分,我们会在所有网站和客户网站上使用它。如果你得到the Pro version,你甚至可以备份到亚马逊的S3或其他有用的系统。
除了我喜欢使用他们的产品之外,我与Akeeba没有任何关系 - 他们让我晚上睡觉。