у нас есть огромный текстовый файл (около 1 гигабайта), и мы хотим искать в нем с помощью PHP,
для этого я открываю некоторую часть этого текста с некоторой веткой и ищу в этой части.
как ниже:
class AsyncFileRequest extends Thread
{ public $from_line;
public $to_line;
public $line;
public $n;
public $ans;
public $handle;
public function __construct($handle,$from_line,$to_line) {
$this->handle =$handle = @fopen($handle, 'r');
$this->from_line =$from_line;
$this->to_line =$to_line;
}
public function run() {
if (($handle = $this->handle) &&
($from_line = $this->from_line) &&
($to_line = $this->to_line)
) {
$n=0;
$ans="";
while($line=stream_get_line($handle,65535,"\n")) {
$n++;
if($n>=$from_line){
$ans.=$line;
}
if ($n == $to_line) {
break;
}
}
fclose($handle);
$this->data=$ans;
} else printf("Thread #%lu was not provided a URL<br>\n", $this->getThreadId());
}
}
но если я использую больше части для открытия, это заняло много времени, чтобы обработать это, что мы делаем для открытия огромного файла по частям с потоком php?
Вы хотите открыть дескриптор в методе run, чтобы каждый поток имел уникальный дескриптор файла.
Поток будет работать, однако предпочтительной является модель выполнения Pools; пусть пул решит, в каком потоке выполнить, использовать пул разумных размеров для оборудования и задачи и просто продолжать отправлять задачи, пока вся работа не будет выполнена.
Затем дождитесь завершения работы пула, и вы сможете собрать данные из задач, используя Pool :: collect.
Например:
<?php
/* A pooled task to read specific lines from a file */
class LineReader extends Collectable {
public function __construct($file, $start, $lines) {
$this->file = $file;
$this->start = $start;
$this->lines = $lines;
}
public function run() {
/* don't write the handle to the object scope */
$handle = fopen($this->file, "r");
$line = 1;
$count = 0;
while (($next = fgets($handle))) {
if ($line >= $this->start) {
if ($count < $this->lines) {
$lines .= $next;
$count++;
} else break;
}
$line++;
}
$this->data = $lines;
/* close handle */
fclose($handle);
/* finished with object */
$this->setGarbage();
}
}
$pool = new Pool(8);
/* submit enough tasks to read entire file */
$pool->submit(
new LineReader(__FILE__, 1, 10));
$pool->submit(
new LineReader(__FILE__, 10, 10));
$pool->submit(
new LineReader(__FILE__, 20, 10));
$pool->submit(
new LineReader(__FILE__, 30, 10));
$pool->submit(
new LineReader(__FILE__, 40, 10));
$pool->submit(
new LineReader(__FILE__, 50, 10));
$pool->submit(
new LineReader(__FILE__, 60, 10));
/* force all reading to complete */
$pool->shutdown();
/* cleanup pool, and echo data to show working */
$pool->collect(function(LineReader $reader){
foreach(preg_split("~\n~", $reader->data) as $line) {
printf(
"%04d: %s\n", $reader->start++, $line);
}
/* allow object to be free'd */
return $reader->isGarbage();
});
?>
Других решений пока нет …