0

我编写了一个 PHP 脚本,它通过一个文本文件(实际上它是来自 imdb 的“列表”文件)运行并将其存储在我的本地 MySQL 数据库中。

public static function updateMovies( $list ) {
    $offset = 15;               // movies.list start with movie names at line 16
    $handle = fopen($list, "r") or die("Couldn't get handle");
    if ($handle) {
        while (!feof($handle)) {
            $buffer = fgets($handle);
            if($offset!=0)
                $offset--;
            else
                if($buffer[0] != '"'){
                    $title = trim( substr( $buffer, 0, strpos( $buffer, '(' ) ) );
                    $year = intval(trim( substr( $buffer, strpos( $buffer,'(' )+1, 4 ) ));
                    Movie::create( $title, $year );
                }
        }
        fclose($handle);
    }
}

由于这些列表文件高达 200MB,因此需要很长时间。默认情况下,PHPMAX_EXECUTION_TIME设置为 30 秒。

我将此值设置为 300 只是为了尝试它是否有效。例如,我的“movies.list”文件大约 80MB,使用此脚本 300 秒在我的数据库中创建了大约 25000 行。这不起作用,因为我什至没有看过以“B”开头的电影。

我知道我可以将其设置MAX_EXECUTION_TIME为 0(无限制),但将来我不希望该数据库位于我的本地主机上。MAX_EXECUTION_TIME我希望它在我的网络服务器上,据我所知,我的网络服务器主机设置为 90。

任何想法你会如何处理这个?

4

2 回答 2

1

您可以:使用set_time_limit(sec)或(更好)通过 cron 条目从命令行 运行您的脚本。这样,您将避免许多其他与 php 无关的超时问题。

于 2012-04-22T17:18:28.770 回答
1

我认为将这种大文件直接加载到数据库中并不是一个好主意……尤其是当需要很长时间才能得出结论时

我的建议

在本地将文件拆分为较小的块..然后在远程服务器上将其上传到您的数据库

示例(文档: http ://en.wikipedia.org/wiki/Split_%28Unix%29 )

 exec('split -d -b 2048m ' . $list . ' chunks');

对于纯 PHP 实现,请参见

http://www.php.happycodings.com/File_Manipulation/code50.html

或者

define('CHUNK_SIZE', 1024*1024);
function readfile_chunked($filename, $retbytes = TRUE) {
    $buffer = '';
    $cnt =0;
    // $handle = fopen($filename, 'rb');
    $handle = fopen($filename, 'rb');
    if ($handle === false) {
      return false;
    }
    while (!feof($handle)) {
      $buffer = fread($handle, CHUNK_SIZE);
      echo $buffer;
      ob_flush();
      flush();
      if ($retbytes) {
        $cnt += strlen($buffer);
      }
    }
    $status = fclose($handle);
    if ($retbytes && $status) {
      return $cnt; // return num. bytes delivered like readfile() does.
    }
    return $status;
  }
于 2012-04-22T19:53:08.627 回答