使用PHP/Joomla程序化地将MySql数据库导出为CSV


Programatically export MySql Database into CSV using PHP/Joomla

使用PHP/Joomla,我试图将数据库备份导出到CSV/sql文件中下载。有些表有大量的记录。当我开始导出时,会出现以下错误:致命错误:超过了30秒的最长执行时间

注意:我不想使用"max_execution_time"或"set_time_limit()"或任何php.ini设置。因为我会在不同的客户端服务器上使用这个脚本&我不会告诉每个客户更改设置。我需要PHP/Joomla脚本,而不是任何扩展。

请帮帮我。

鉴于您对我之前的回答的评论,我建议您考虑创建一个Joomla!CLI(请查看Joomla 2.5+安装的/cli目录)。

我们为内部使用开发的Easystaging扩展的Pro版本做了与您类似的事情,以管理具有特定内容审批流程的客户网站。内部版本必须满足我们更大客户的要求。

实际上,我们创建了继承自JApplicationCli的类,该类可以由CRON或我们的组件用户界面启动。例如

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语句。

一旦计划运行完毕,我们就会将所有文件压缩并发送到存档。

由于有些表有大量数据,因此需要相当长的时间。因此,连接将超时,导出将失败。

更好的方法是使用命令行将数据转储为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

也许您甚至必须将每个表的记录拆分为不同的文件。

我建议您不要重新发明轮子,而是使用Akeeba Backup,因为它可以让您创建整个网站的自动备份,或者只是文件或特定目录,或者只是数据库或特定表,或者您能想到的任何组合。

它也是免费的。

它年复一年地获得奖项,在Joomla扩展目录上获得高度评价,我们在所有网站和客户网站上都使用它。

如果你得到了Pro版本,你甚至可以备份到亚马逊的S3或其他有用的系统。

我和Akeeba没有任何关系,只是我喜欢使用他们的产品——他们让我晚上睡觉。