使用 PHP/Joomla,我正在尝试将数据库备份导出到 CSV/sql 文件以供下载。有些表有大量记录。当我开始导出时出现以下错误: fatal error :超过 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 中启动的,我们会使用实用程序方法来确保系统正确地 fork 它:
/**
* 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
语句。
一旦计划完成运行,我们就会压缩所有文件并将它们发送到存档。
关于php - 使用 PHP/Joomla 以编程方式将 MySql 数据库导出到 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17327109/