使用php和zend framework导入大型.sql文件

使用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是一个不错的选择。下面是我的(单元测试)引导程序

我必须使用PHP和Zend框架将一个(大)
.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