使用PHP / Joomla以编程方式将MySql数据库导出为CSV

时间:2013-06-26 17:51:43

标签: php database csv joomla export

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

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

请帮帮我。

4 个答案:

答案 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, highlyJoomla Extension Directory进行了评分,我们会在所有网站和客户网站上使用它。

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

除了我喜欢使用他们的产品之外,我与Akeeba没有任何关系 - 他们让我晚上睡觉。