Я использую php-Zendframework для полнотекстового поиска в некоторых документах PDF. Я включаю их следующим образом:
ini_set('include_path', '/var/www/html/php-ZendFramework-1.10.6-1.fc14.src/ZendFramework-1.10.6/library');
require_once('/var/www/html/php-ZendFramework-1.10.6-1.fc14.src/ZendFramework-1.10.6/library/Zend/Search/Lucene.php');
require_once('/var/www/html/php-ZendFramework-1.10.6-1.fc14.src/ZendFramework-1.10.6/library/Zend/Pdf.php');
После этого для каждого имеющегося у меня pdf я применяю следующий код в цикле:
if(strcmp(strtolower($link),"pdf")==0){
$fileName = '/var/www/html/tmp/'.$id.'.'.$link;
$result = pdf2text ($fileName);
$index = Zend_Search_Lucene::create('/var/www/html/tmpindex');
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Text('path', '/var/www/html/tmpindex'));
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $result,'utf-8'));
$index->addDocument($doc);
$index->commit();
$index = Zend_Search_Lucene::open('/var/www/html/tmpindex');
$write = 1;
if ((sizeof($hits)<=0) && ($h == 0))
$write = 0;
for($h=0;$h<sizeof($givenwords);$h++){
$hits = $index->find('contents:' . $givenwords[$h]);
if ($h != 0){
if (strcmp(strtolower($conditions[$h-1]),"and") == 0)
$write = ($write && (sizeof($hits)>0) );
else if (strcmp(strtolower($conditions[$h-1]),"or") == 0)
$write = ($write || (sizeof($hits)>0) );
else
$write = ($write && (sizeof($hits)<=0) );
}
}
$removePath = '/var/www/html/tmpindex';
$hits = $index->find('path:' . $removePath);
foreach ($hits as $hit) {
$index->delete($hit->id);
}
}
Однако после поиска некоторых файлов (который возвращает правильные результаты) он прекращает поиск следующих файлов. В файле error.log появляется следующее уведомление php:
iconv():Detected an illegal character in input string in /var/www/html/php-ZendFramework-1.10.6-1.fc14.src/ZendFramework-1.10.6/library/Zend/Search/Lucene/Analysis/Analyzer/common/Text.php on line 58
Мой вопрос:
Как применить код, который говорит, что:
if (file cannot be read) wrtite_the_cause and skip to search other files;
Я думаю, что try..catch должен помочь вам. Просто оберните свой код.
Других решений пока нет …