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

时间:2012-03-09 15:37:28

标签: php zend-framework zend-db

我必须使用PHP和Zend框架将一个(大).sql文件导入MySQL。

连接已打开,我有$_sql包含SQL文件的全部内容,但 - 当然,简单

$this->db->query($_sql);

无效。

如何导入此大文件?

更新:是的,它是一个mysql-dump,包含我的mysql-database的结构定义。是的,它需要在不使用命令行的情况下从php中运行。

解决: 我需要一个mysqli对象来修复它,mysqli-> multiQuery是要走的路。这是我的(单元测试)bootstrap的样子:

<?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();

不要担心\,这只是暂时的(很快就会解决),是的,我在Windows机器上。所以,也许有人可以使用它。

4 个答案:

答案 0 :(得分:1)

您可以使用以下代码执行此操作。

$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();

确保您的application.ini有一个默认的db表适配器作为zendframework文档。否则,您可以手动配置数据库设置。在示例中,您可以将sql文件放在应用程序文件夹中。您可以根据需要进行更改。

然后您可以从命令行运行它,转到命令行中的公共文件夹并运行命令

 php import.php

更新

导入大型sql文件的另一种简单方法是使用工具。我习惯使用Navicat(http://www.navicat.com/en/products/navicat_premium/premium_overview.html)。导入/导出非常简单快捷

答案 1 :(得分:1)

导入大文件的最快方法是使用cli:

mysql -u username -p databasename < yourfile.sql

答案 2 :(得分:0)

我认为,这不是采埃​​孚的任务。尝试使用sypex dymper - http://sypex.net/en/ - sql导入/导出的完美工具

答案 3 :(得分:0)

http://www.mysqldumper.net/

这是一个开源的Web应用程序。如果您不想使用它,您可以浏览代码并查看它们是如何操作的。它是开源的。

MySQL-Dumper可以处理200 + MB的.sql文件......