使用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
语句。一旦计划完成运行,我们将压缩所有文件并将它们发送到存档。
关于php - 使用PHP/Joomla以编程方式将MySql数据库导出到CSV,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17327109/