Писал очередной модуль для 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 ничего не давало.
Много было чего предпринято и на что только не грешили, ничего не помогало..
Но вот чуть позже удалось получить от скрипта что-то новенькое, ругань такого содержания
Все шло гладко и спустя пару часов модуль был готов, успешно протестирован на моем тестовом сервере и ничего не предвещало беды. Но вот когда залил и установил его на боевой сервер, при попытке импорта файла сервер начал кричать
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 эту багу починили, но она определенно потрепала мне нервы!
Комментариев нет:
Отправить комментарий