воскресенье, 2 октября 2011 г.

Парсинг xls, Spreadsheet_Excel_Reader oleread.inc и несколько часов головной боли.

Писал очередной модуль для Cs-cart, модуль для импортирования товаров из Excel файлов, родной модуль импорта не устраивает, поэтому было решено написать свой.

Все шло гладко и спустя пару часов модуль был готов, успешно протестирован на моем тестовом сервере и ничего не предвещало беды. Но вот когда залил и установил его на боевой сервер, при попытке импорта файла сервер начал кричать

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 32 bytes) in /xxxxxxxx/Excel/oleread.inc on line 27

Это показалось очень странным, так как тестовый файлик всего 25кб, а на сервере для выполнения PHP скриптов отведено 64Мб.

Увеличение памяти в php.ini ничего не давало.
Много было чего предпринято и на что только не грешили, ничего не помогало..

Но вот чуть позже удалось получить от скрипта что-то новенькое, ругань такого содержания

Notice: Uninitialized string offset: 2199023255040 in xxx/oleread.inc on line 27

И тут уже мне помог великий Google, оказывается что на 64 битной системе функция

function GetInt4d($data, $pos) {
    return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24); 
}

работает не корректно, так как используются битовые операции которые завязаны на 32х битные процессоры, и лечиться беда эта изменением функции на следующую:

function GetInt4d($data, $pos)
{
 $value = ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24);
 if ($value>=4294967294)
 {
  $value=-2;
 }
 return $value;
}

Вроде как в последних версиях phpexcelreader эту багу починили, но она определенно потрепала мне нервы!

Комментариев нет:

Отправить комментарий