使用php和zend framework导入大型.sql文件
我必须使用PHP和Zend框架将一个(大)使用php和zend framework导入大型.sql文件,php,zend-framework,zend-db,Php,Zend Framework,Zend Db,我必须使用PHP和Zend框架将一个(大).sql文件导入MySQL 连接是打开的,我有$\u sql包含sql文件的全部内容,但是-当然,一个简单的 $this->db->query($_sql); 这是行不通的 如何导入此大文件 更新:是的,这是一个mysql转储,包含mysql数据库的结构定义。是的,它需要在php中运行,而不需要使用命令行 已解决: 我需要一个mysqli对象来解决这个问题,mysqli->multiQuery是一个不错的选择。下面是我的(单元测试)引导程序
.sql
文件导入MySQL
连接是打开的,我有$\u sql
包含sql文件的全部内容,但是-当然,一个简单的
$this->db->query($_sql);
这是行不通的
如何导入此大文件
更新:是的,这是一个mysql转储,包含mysql数据库的结构定义。是的,它需要在php中运行,而不需要使用命令行
已解决:
我需要一个mysqli对象来解决这个问题,mysqli->multiQuery是一个不错的选择。下面是我的(单元测试)引导程序的样子:
<?php
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)));
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
$options = $application->getOptions();
$_sqlFile = realpath(APPLICATION_PATH.'\\..\\tests\\sql\\');
$_sqlFile .= '\\myLargeSQL.sql';
$sql = file_get_contents($_sqlFile);
$mysqliobject = new mysqli(
$options['resources']['db']['params']['host'],
$options['resources']['db']['params']['username'],
$options['resources']['db']['params']['password'],
$options['resources']['db']['params']['dbname']
);
$mysqliobject->multi_query($sql);
if ($mysqliobject->errno <> 0) {
throw new Exception('Error creating temp database in ('.__FILE__.' on line '.__LINE__.')');
}
$mysqliobject->close();
我认为,这不是ZF的任务。尝试使用sypex dymper--sql导入/导出的完美工具您可以使用以下代码来完成
$db = Zend_Db_Table::getDefaultAdapter();
$db->beginTransaction();
$sql = file_get_contents(APPLICATION_PATH . '/path/to/your/data.sql');
$db->query($sql);
$db->commit();
但是,如果您的sql太大,它可能会超过php的最大执行时间。我建议您创建一个php脚本并从php命令行运行它。例如,在公用文件夹中,创建名为import.php的php脚本
<?php
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development'));
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)));
/** Zend_Application */
require_once 'Zend/Application.php';
// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
$options = $application->getOptions();
$db = Zend_Db::factory($options['resources']['db']['adapter'], array(
'host' => $options['resources']['db']['params']['host'],
'username' => $options['resources']['db']['params']['username'],
'password' => $options['resources']['db']['params']['password'],
'dbname' => $options['resources']['db']['params']['dbname']
));
//OR
//$application->getBootstrap()->bootstrap('db');
//$db = Zend_Db_Table::getDefaultAdapter();
$db->beginTransaction();
$sql = file_get_contents(APPLICATION_PATH . '/path/to/your/data.sql');
$db->query($sql);
$db->commit();
更新:
另一种导入大型sql文件的简单方法是使用工具。我习惯使用Navicat(http://www.navicat.com/en/products/navicat_premium/premium_overview.html). 导入/导出非常简单和快速导入大文件的最快方法可能是使用cli:
mysql -u username -p databasename < yourfile.sql
mysql-u username-p databasename
这是一个开源的Web应用程序。如果你不想使用它,你可以浏览代码,看看他们是怎么做的。它是开源的
MySQL转储程序可以处理200+MB的.sql文件…该文件是mysqldump的结果吗?sql文件是一个巨大的sql语句还是多个较小的sql语句?如果是多个较小的,您可以一次运行一个命令来运行SQL文件。您真的需要使用ZF执行查询吗?对于大型.sql
文件,我通常使用source
命令返回到命令行mysql
。是的,它是一个mysql转储,是的,它需要在php中运行,而不需要命令行。我想,从php/zf运行大型sql文件一定是可能的,即使其中有很多命令。它将使用CLI运行,因此不需要最长执行时间。这一切都是单元测试应用程序和在mysql中临时自动创建所需表的一部分(使用内存引擎,所以它不会停留)。不,sqlite不工作,它必须使用与mysql中相同的结构,sqlite不知道很多数据类型,因此:我必须使用mysql,必须能够执行一个大文件)。文件有多大并不重要,因为所有错误都出现在前两行(在我的旧代码中)。所以,在我的新代码中使用mysqli->multiQuery选项,一切都很好。谢谢,但它不起作用。可能是因为有很多行sql代码(mysql转储)。第二行有错误。当我发出第一个命令时,错误在第三个命令中,所以我认为这是一个问题;分离机。当我在phpMyAdmin中执行相同的sql时,一切都很好。是的,可能是这样,我已经使用它处理了很长的sql文件,并且工作得很好。无论如何,我看到你找到了解决方案,你需要回答或选择一个答案:)@SaschaPresnac
mysql -u username -p databasename < yourfile.sql